/*!
* surveyjs - Survey JavaScript library v1.1.32
* Copyright (c) 2015-2019 Devsoft Baltic OÜ - http://surveyjs.io/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"));
else if(typeof define === 'function' && define.amd)
define("Survey", ["react"], factory);
else if(typeof exports === 'object')
exports["Survey"] = factory(require("react"));
else
root["Survey"] = factory(root["React"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 131);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __assign; });
/* harmony export (immutable) */ __webpack_exports__["b"] = __extends;
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __decorate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __spreadArrays; });
var __assign = Object["assign"] ||
function (target) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
target[p] = s[p];
}
return target;
};
function __extends(thisClass, baseClass) {
for (var p in baseClass)
if (baseClass.hasOwnProperty(p))
thisClass[p] = baseClass[p];
function __() {
this.constructor = thisClass;
}
thisClass.prototype =
baseClass === null
? Object.create(baseClass)
: ((__.prototype = baseClass.prototype), new __());
}
var __decorate = function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3
? target
: desc === null
? (desc = Object.getOwnPropertyDescriptor(target, key))
: desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if ((d = decorators[i]))
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __spreadArrays = function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_english__ = __webpack_require__(42);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return surveyLocalization; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return surveyStrings; });
var surveyLocalization = {
currentLocaleValue: "",
defaultLocaleValue: "en",
locales: {},
localeNames: {},
supportedLocales: [],
get currentLocale() {
return this.currentLocaleValue === this.defaultLocaleValue
? ""
: this.currentLocaleValue;
},
set currentLocale(val) {
this.currentLocaleValue = val;
},
get defaultLocale() {
return this.defaultLocaleValue;
},
set defaultLocale(val) {
this.defaultLocaleValue = val;
},
getString: function (strName) {
var loc = this.currentLocale
? this.locales[this.currentLocale]
: this.locales[this.defaultLocale];
if (!loc || !loc[strName])
loc = this.locales[this.defaultLocale];
var result = loc[strName];
if (result === undefined) {
result = this.locales["en"][strName];
}
return result;
},
getLocales: function () {
var res = [];
res.push("");
if (this.supportedLocales && this.supportedLocales.length > 0) {
for (var i = 0; i < this.supportedLocales.length; i++) {
res.push(this.supportedLocales[i]);
}
}
else {
for (var key in this.locales) {
res.push(key);
}
}
res.sort();
return res;
}
};
var surveyStrings = __WEBPACK_IMPORTED_MODULE_0__localization_english__["a" /* englishStrings */];
surveyLocalization.locales["en"] = __WEBPACK_IMPORTED_MODULE_0__localization_english__["a" /* englishStrings */];
surveyLocalization.localeNames["en"] = "english";
/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return JsonObjectProperty; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CustomPropertiesCollection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return JsonMetadataClass; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return JsonMetadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return JsonError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return JsonUnknownPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return JsonMissingTypeErrorBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return JsonMissingTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return JsonIncorrectTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return JsonRequiredPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return JsonObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Serializer; });
var JsonObjectProperty = /** @class */ (function () {
function JsonObjectProperty(name, isRequired) {
if (isRequired === void 0) { isRequired = false; }
this.name = name;
this.typeValue = null;
this.choicesValue = null;
this.baseValue = null;
this.isRequiredValue = false;
this.readOnlyValue = null;
this.visibleValue = null;
this.isLocalizableValue = null;
this.choicesfunc = null;
this.dependedProperties = null;
this.isSerializable = true;
this.isLightSerializable = true;
this.isCustom = false;
this.isDynamicChoices = false; //TODO obsolete, use dependsOn attribute
this.className = null;
this.alternativeName = null;
this.classNamePart = null;
this.baseClassName = null;
this.defaultValueValue = null;
this.serializationProperty = null;
this.category = "";
this.cagetoryIndex = -1;
this.maxLength = -1;
this.layout = null;
this.onGetValue = null;
this.onSetValue = null;
this.visibleIf = null;
this.isArray = false;
this.isRequiredValue = isRequired;
}
Object.defineProperty(JsonObjectProperty.prototype, "type", {
get: function () {
return this.typeValue ? this.typeValue : "string";
},
set: function (value) {
if (value === "itemvalues")
value = "itemvalue[]";
this.typeValue = value;
if (this.typeValue.indexOf("[]") === this.typeValue.length - 2) {
this.isArray = true;
this.className = this.typeValue.substr(0, this.typeValue.length - 2);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isRequired", {
get: function () {
return this.isRequiredValue;
},
set: function (val) {
this.isRequiredValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseGetValue", {
get: function () {
return this.onGetValue || this.serializationProperty;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "defaultValue", {
get: function () {
var result = this.defaultValueValue;
if (!!JsonObjectProperty.getItemValuesDefaultValue &&
JsonObject.metaData.isDescendantOf(this.className, "itemvalue")) {
result = JsonObjectProperty.getItemValuesDefaultValue(this.defaultValueValue || []);
}
return result;
},
set: function (newValue) {
this.defaultValueValue = newValue;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.isDefaultValue = function (value) {
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.defaultValue))
return this.defaultValue == value;
return ((value === false && this.type == "boolean") ||
value === "" ||
__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value));
};
JsonObjectProperty.prototype.getValue = function (obj) {
if (this.onGetValue)
return this.onGetValue(obj);
if (this.serializationProperty && !!obj[this.serializationProperty])
return obj[this.serializationProperty].getJson();
return obj[this.name];
};
JsonObjectProperty.prototype.getPropertyValue = function (obj) {
if (this.isLocalizable)
return obj[this.serializationProperty].text;
return this.getValue(obj);
};
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseSetValue", {
get: function () {
return this.onSetValue || this.serializationProperty;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.setValue = function (obj, value, jsonConv) {
if (this.onSetValue) {
this.onSetValue(obj, value, jsonConv);
}
else {
if (this.serializationProperty && !!obj[this.serializationProperty])
obj[this.serializationProperty].setJson(value);
else {
if (value && typeof value === "string") {
if (this.type == "number") {
value = parseInt(value);
}
if (this.type == "boolean") {
value = value.toLowerCase() === "true";
}
}
obj[this.name] = value;
}
}
};
JsonObjectProperty.prototype.getObjType = function (objType) {
if (!this.classNamePart)
return objType;
return objType.replace(this.classNamePart, "");
};
JsonObjectProperty.prototype.getClassName = function (className) {
if (className)
className = className.toLowerCase();
return this.classNamePart && className.indexOf(this.classNamePart) < 0
? className + this.classNamePart
: className;
};
Object.defineProperty(JsonObjectProperty.prototype, "choices", {
/**
* Depricated, please use getChoices
*/
get: function () {
return this.getChoices(null);
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasChoices", {
get: function () {
return !!this.choicesValue || !!this.choicesfunc;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.getChoices = function (obj, choicesCallback) {
if (choicesCallback === void 0) { choicesCallback = null; }
if (this.choicesValue != null)
return this.choicesValue;
if (this.choicesfunc != null)
return this.choicesfunc(obj, choicesCallback);
return null;
};
JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {
this.choicesValue = value;
this.choicesfunc = valueFunc;
};
JsonObjectProperty.prototype.getBaseValue = function () {
if (!this.baseValue)
return "";
if (typeof this.baseValue == "function")
return this.baseValue();
return this.baseValue;
};
JsonObjectProperty.prototype.setBaseValue = function (val) {
this.baseValue = val;
};
Object.defineProperty(JsonObjectProperty.prototype, "readOnly", {
get: function () {
return this.readOnlyValue != null ? this.readOnlyValue : false;
},
set: function (val) {
this.readOnlyValue = val;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.isVisible = function (layout, obj) {
if (obj === void 0) { obj = null; }
var isLayout = !this.layout || this.layout == layout;
if (!this.visible || !isLayout)
return false;
if (!!this.visibleIf && !!obj)
return this.visibleIf(obj);
return true;
};
Object.defineProperty(JsonObjectProperty.prototype, "visible", {
get: function () {
return this.visibleValue != null ? this.visibleValue : true;
},
set: function (val) {
this.visibleValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isLocalizable", {
get: function () {
return this.isLocalizableValue != null ? this.isLocalizableValue : false;
},
set: function (val) {
this.isLocalizableValue = val;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.mergeWith = function (prop) {
var valuesNames = JsonObjectProperty.mergableValues;
for (var i = 0; i < valuesNames.length; i++) {
this.mergeValue(prop, valuesNames[i]);
}
};
JsonObjectProperty.prototype.addDependedProperty = function (name) {
if (!this.dependedProperties) {
this.dependedProperties = [];
}
if (this.dependedProperties.indexOf(name) < 0) {
this.dependedProperties.push(name);
}
};
JsonObjectProperty.prototype.getDependedProperties = function () {
return !!this.dependedProperties ? this.dependedProperties : [];
};
JsonObjectProperty.prototype.mergeValue = function (prop, valueName) {
if (this[valueName] == null && prop[valueName] != null) {
this[valueName] = prop[valueName];
}
};
JsonObjectProperty.mergableValues = [
"typeValue",
"choicesValue",
"baseValue",
"readOnlyValue",
"visibleValue",
"isSerializable",
"isLightSerializable",
"isCustom",
"isDynamicChoices",
"isLocalizableValue",
"className",
"alternativeName",
"layout",
"classNamePart",
"baseClassName",
"defaultValue",
"serializationProperty",
"onGetValue",
"onSetValue",
"category",
"categoryIndex",
"dependedProperties",
"visibleIf",
"maxLength",
"maxValue",
"minValue"
];
return JsonObjectProperty;
}());
var CustomPropertiesCollection = /** @class */ (function () {
function CustomPropertiesCollection() {
}
CustomPropertiesCollection.addProperty = function (className, property) {
className = className.toLowerCase();
var props = CustomPropertiesCollection.properties;
if (!props[className]) {
props[className] = [];
}
props[className].push(property);
};
CustomPropertiesCollection.removeProperty = function (className, propertyName) {
className = className.toLowerCase();
var props = CustomPropertiesCollection.properties;
if (!props[className])
return;
var properties = props[className];
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == propertyName) {
props[className].splice(i, 1);
break;
}
}
};
CustomPropertiesCollection.addClass = function (className, parentClassName) {
className = className.toLowerCase();
if (parentClassName) {
parentClassName = parentClassName.toLowerCase();
}
CustomPropertiesCollection.parentClasses[className] = parentClassName;
};
CustomPropertiesCollection.getProperties = function (className) {
className = className.toLowerCase();
var res = [];
var props = CustomPropertiesCollection.properties;
while (className) {
var properties = props[className];
if (properties) {
for (var i = 0; i < properties.length; i++) {
res.push(properties[i]);
}
}
className = CustomPropertiesCollection.parentClasses[className];
}
return res;
};
CustomPropertiesCollection.createProperties = function (obj) {
if (!obj || !obj.getType)
return;
CustomPropertiesCollection.createPropertiesCore(obj, obj.getType());
};
CustomPropertiesCollection.createPropertiesCore = function (obj, className) {
var props = CustomPropertiesCollection.properties;
if (props[className]) {
CustomPropertiesCollection.createPropertiesInObj(obj, props[className]);
}
var parentClass = CustomPropertiesCollection.parentClasses[className];
if (parentClass) {
CustomPropertiesCollection.createPropertiesCore(obj, parentClass);
}
};
CustomPropertiesCollection.createPropertiesInObj = function (obj, properties) {
for (var i = 0; i < properties.length; i++) {
CustomPropertiesCollection.createPropertyInObj(obj, properties[i]);
}
};
CustomPropertiesCollection.createPropertyInObj = function (obj, prop) {
if (obj[prop.name] || obj.hasOwnProperty(prop.name))
return;
if (prop.isLocalizable &&
prop.serializationProperty &&
!obj[prop.serializationProperty] &&
obj.createCustomLocalizableObj) {
obj.createCustomLocalizableObj(prop.name);
var locDesc = {
get: function () {
return obj.getLocalizableString(prop.name);
}
};
Object.defineProperty(obj, prop.serializationProperty, locDesc);
var desc = {
get: function () {
return obj.getLocalizableStringText(prop.name, prop.defaultValue);
},
set: function (v) {
obj.setLocalizableStringText(prop.name, v);
}
};
Object.defineProperty(obj, prop.name, desc);
}
else {
var defaultValue = prop.defaultValue;
if (JsonObject.metaData.isDescendantOf(prop.className, "itemvalue") &&
typeof obj.createNewArray === "function") {
obj.createNewArray(prop.name, function (item) {
item.locOwner = obj;
});
obj.setPropertyValue(prop.name, defaultValue);
defaultValue = null;
}
if (!!obj.getPropertyValue && !!obj.setPropertyValue) {
var desc = {
get: function () {
return obj.getPropertyValue(prop.name, defaultValue);
},
set: function (v) {
if (!!prop.onSetValue) {
prop.onSetValue(obj, v, null);
}
else {
obj.setPropertyValue(prop.name, v);
}
}
};
Object.defineProperty(obj, prop.name, desc);
}
}
};
CustomPropertiesCollection.properties = {};
CustomPropertiesCollection.parentClasses = {};
return CustomPropertiesCollection;
}());
var JsonMetadataClass = /** @class */ (function () {
function JsonMetadataClass(name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
this.name = name;
this.creator = creator;
this.parentName = parentName;
this.properties = null;
name = name.toLowerCase();
if (this.parentName) {
this.parentName = this.parentName.toLowerCase();
CustomPropertiesCollection.addClass(name, this.parentName);
}
this.properties = new Array();
for (var i = 0; i < properties.length; i++) {
var prop = this.createProperty(properties[i]);
if (prop) {
this.properties.push(prop);
}
}
}
JsonMetadataClass.prototype.find = function (name) {
for (var i = 0; i < this.properties.length; i++) {
if (this.properties[i].name == name)
return this.properties[i];
}
return null;
};
JsonMetadataClass.prototype.createProperty = function (propInfo) {
var propertyName = typeof propInfo === "string" ? propInfo : propInfo.name;
if (!propertyName)
return;
var propertyType = null;
var typeIndex = propertyName.indexOf(JsonMetadataClass.typeSymbol);
if (typeIndex > -1) {
propertyType = propertyName.substring(typeIndex + 1);
propertyName = propertyName.substring(0, typeIndex);
}
var isRequired = this.getIsPropertyNameRequired(propertyName) || !!propInfo.isRequired;
propertyName = this.getPropertyName(propertyName);
var prop = new JsonObjectProperty(propertyName, isRequired);
if (propertyType) {
prop.type = propertyType;
}
if (typeof propInfo === "object") {
if (propInfo.type) {
prop.type = propInfo.type;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.default)) {
prop.defaultValue = propInfo.default;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isSerializable)) {
prop.isSerializable = propInfo.isSerializable;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isLightSerializable)) {
prop.isLightSerializable = propInfo.isLightSerializable;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.maxLength)) {
prop.maxLength = propInfo.maxLength;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.category)) {
prop.category = propInfo.category;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.categoryIndex)) {
prop.categoryIndex = propInfo.categoryIndex;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.maxValue)) {
prop.maxValue = propInfo.maxValue;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.minValue)) {
prop.minValue = propInfo.minValue;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isDynamicChoices)) {
prop.isDynamicChoices = propInfo.isDynamicChoices;
}
if (propInfo.visible === false) {
prop.visible = false;
}
if (!!propInfo.visibleIf) {
prop.visibleIf = propInfo.visibleIf;
}
if (propInfo.choices) {
var choicesFunc = typeof propInfo.choices === "function" ? propInfo.choices : null;
var choicesValue = typeof propInfo.choices !== "function" ? propInfo.choices : null;
prop.setChoices(choicesValue, choicesFunc);
}
if (!!propInfo.baseValue) {
prop.setBaseValue(propInfo.baseValue);
}
if (propInfo.onGetValue) {
prop.onGetValue = propInfo.onGetValue;
}
if (propInfo.onSetValue) {
prop.onSetValue = propInfo.onSetValue;
}
if (propInfo.isLocalizable) {
propInfo.serializationProperty = "loc" + propInfo.name;
}
if (propInfo.serializationProperty) {
prop.serializationProperty = propInfo.serializationProperty;
var s;
if (prop.serializationProperty &&
prop.serializationProperty.indexOf("loc") == 0) {
prop.isLocalizable = true;
}
}
if (propInfo.isLocalizable) {
prop.isLocalizable = propInfo.isLocalizable;
}
if (propInfo.className) {
prop.className = propInfo.className;
}
if (propInfo.baseClassName) {
prop.baseClassName = propInfo.baseClassName;
}
if (propInfo.classNamePart) {
prop.classNamePart = propInfo.classNamePart;
}
if (propInfo.alternativeName) {
prop.alternativeName = propInfo.alternativeName;
}
if (propInfo.layout) {
prop.layout = propInfo.layout;
}
if (propInfo.dependsOn) {
this.addDependsOnProperties(prop, propInfo.dependsOn);
}
}
return prop;
};
JsonMetadataClass.prototype.addDependsOnProperties = function (prop, dependsOn) {
if (Array.isArray(dependsOn)) {
for (var i = 0; i < dependsOn.length; i++) {
this.addDependsOnProperty(prop, dependsOn[i]);
}
}
else {
this.addDependsOnProperty(prop, dependsOn);
}
};
JsonMetadataClass.prototype.addDependsOnProperty = function (prop, dependsOn) {
var property = this.find(dependsOn);
if (!property) {
property = Serializer.findProperty(this.parentName, dependsOn);
}
if (!property)
return;
property.addDependedProperty(prop.name);
};
JsonMetadataClass.prototype.getIsPropertyNameRequired = function (propertyName) {
return (propertyName.length > 0 &&
propertyName[0] == JsonMetadataClass.requiredSymbol);
};
JsonMetadataClass.prototype.getPropertyName = function (propertyName) {
if (!this.getIsPropertyNameRequired(propertyName))
return propertyName;
propertyName = propertyName.slice(1);
return propertyName;
};
JsonMetadataClass.requiredSymbol = "!";
JsonMetadataClass.typeSymbol = ":";
return JsonMetadataClass;
}());
var JsonMetadata = /** @class */ (function () {
function JsonMetadata() {
this.classes = {};
this.alternativeNames = {};
this.childrenClasses = {};
this.classProperties = {};
this.classHashProperties = {};
}
JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
name = name.toLowerCase();
var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName);
this.classes[name] = metaDataClass;
if (parentName) {
parentName = parentName.toLowerCase();
var children = this.childrenClasses[parentName];
if (!children) {
this.childrenClasses[parentName] = [];
}
this.childrenClasses[parentName].push(metaDataClass);
}
return metaDataClass;
};
JsonMetadata.prototype.removeClass = function (name) {
var metaClass = this.findClass(name);
if (!metaClass)
return;
delete this.classes[metaClass.name];
if (!!metaClass.parentName) {
var index = this.childrenClasses[metaClass.parentName].indexOf(metaClass);
if (index > -1) {
this.childrenClasses[metaClass.parentName].splice(index, 1);
}
}
};
JsonMetadata.prototype.overrideClassCreatore = function (name, creator) {
this.overrideClassCreator(name, creator);
};
JsonMetadata.prototype.overrideClassCreator = function (name, creator) {
name = name.toLowerCase();
var metaDataClass = this.findClass(name);
if (metaDataClass) {
metaDataClass.creator = creator;
}
};
JsonMetadata.prototype.getProperties = function (className) {
var metaClass = this.findClass(className);
if (!metaClass)
return [];
var properties = this.classProperties[metaClass.name];
if (!!properties)
return properties;
this.fillPropertiesForClass(metaClass.name);
return this.classProperties[metaClass.name];
};
JsonMetadata.prototype.getHashProperties = function (className) {
var metaClass = this.findClass(className);
if (!metaClass)
return {};
var properties = this.classHashProperties[metaClass.name];
if (!!properties)
return properties;
this.fillPropertiesForClass(metaClass.name);
return this.classHashProperties[metaClass.name];
};
JsonMetadata.prototype.fillPropertiesForClass = function (className) {
var properties = new Array();
var hashProperties = {};
this.fillProperties(className, properties, hashProperties);
this.classProperties[className] = properties;
this.classHashProperties[className] = hashProperties;
};
JsonMetadata.prototype.getDynamicProperties = function (obj) {
if (obj.getDynamicProperties && obj.getDynamicType) {
var names = obj.getDynamicProperties();
return JsonObject.metaData.findProperties(obj.getDynamicType(), names);
}
return [];
};
JsonMetadata.prototype.getPropertiesByObj = function (obj) {
if (!obj || !obj.getType)
return [];
var res = [];
var props = this.getProperties(obj.getType());
for (var i = 0; i < props.length; i++) {
res.push(props[i]);
}
var dynamicProps = this.getDynamicProperties(obj);
if (dynamicProps && dynamicProps.length > 0) {
for (var i = 0; i < dynamicProps.length; i++) {
res.push(dynamicProps[i]);
}
}
return res;
};
JsonMetadata.prototype.findProperty = function (className, propertyName) {
var hash = this.getHashProperties(className);
var res = hash[propertyName];
return !!res ? res : null;
};
JsonMetadata.prototype.findProperties = function (className, propertyNames) {
var result = [];
var hash = this.getHashProperties(className);
for (var i = 0; i < propertyNames.length; i++) {
var prop = hash[propertyNames[i]];
if (prop) {
result.push(prop);
}
}
return result;
};
JsonMetadata.prototype.createClass = function (name, json) {
if (json === void 0) { json = undefined; }
name = name.toLowerCase();
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return null;
if (metaDataClass.creator)
return metaDataClass.creator(json);
var parentName = metaDataClass.parentName;
while (parentName) {
metaDataClass = this.findClass(parentName);
if (!metaDataClass)
return null;
parentName = metaDataClass.parentName;
if (metaDataClass.creator)
return this.createCustomType(name, metaDataClass.creator, json);
}
return null;
};
JsonMetadata.prototype.createCustomType = function (name, creator, json) {
if (json === void 0) { json = undefined; }
name = name.toLowerCase();
var res = creator(json);
var customTypeName = name;
var customTemplateName = res.getTemplate
? res.getTemplate()
: res.getType();
res.getType = function () {
return customTypeName;
};
res.getTemplate = function () {
return customTemplateName;
};
CustomPropertiesCollection.createProperties(res);
return res;
};
JsonMetadata.prototype.getChildrenClasses = function (name, canBeCreated) {
if (canBeCreated === void 0) { canBeCreated = false; }
name = name.toLowerCase();
var result = [];
this.fillChildrenClasses(name, canBeCreated, result);
return result;
};
JsonMetadata.prototype.getRequiredProperties = function (name) {
var properties = this.getProperties(name);
var res = [];
for (var i = 0; i < properties.length; i++) {
if (properties[i].isRequired) {
res.push(properties[i].name);
}
}
return res;
};
JsonMetadata.prototype.addProperties = function (className, propertiesInfos) {
className = className.toLowerCase();
var metaDataClass = this.findClass(className);
for (var i = 0; i < propertiesInfos.length; i++) {
this.addCustomPropertyCore(metaDataClass, propertiesInfos[i]);
}
};
JsonMetadata.prototype.addProperty = function (className, propertyInfo) {
this.addCustomPropertyCore(this.findClass(className), propertyInfo);
};
JsonMetadata.prototype.addCustomPropertyCore = function (metaDataClass, propertyInfo) {
if (!metaDataClass)
return;
var property = metaDataClass.createProperty(propertyInfo);
if (property) {
property.isCustom = true;
this.addPropertyToClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.addProperty(metaDataClass.name, property);
}
};
JsonMetadata.prototype.removeProperty = function (className, propertyName) {
var metaDataClass = this.findClass(className);
if (!metaDataClass)
return false;
var property = metaDataClass.find(propertyName);
if (property) {
this.removePropertyFromClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.removeProperty(metaDataClass.name, propertyName);
}
};
JsonMetadata.prototype.addPropertyToClass = function (metaDataClass, property) {
if (metaDataClass.find(property.name) != null)
return;
metaDataClass.properties.push(property);
};
JsonMetadata.prototype.removePropertyFromClass = function (metaDataClass, property) {
var index = metaDataClass.properties.indexOf(property);
if (index < 0)
return;
metaDataClass.properties.splice(index, 1);
};
JsonMetadata.prototype.emptyClassPropertiesHash = function (metaDataClass) {
this.classProperties[metaDataClass.name] = null;
this.classHashProperties[metaDataClass.name] = null;
var childClasses = this.getChildrenClasses(metaDataClass.name);
for (var i = 0; i < childClasses.length; i++) {
this.classProperties[childClasses[i].name] = null;
this.classHashProperties[childClasses[i].name] = null;
}
};
JsonMetadata.prototype.fillChildrenClasses = function (name, canBeCreated, result) {
var children = this.childrenClasses[name];
if (!children)
return;
for (var i = 0; i < children.length; i++) {
if (!canBeCreated || children[i].creator) {
result.push(children[i]);
}
this.fillChildrenClasses(children[i].name, canBeCreated, result);
}
};
JsonMetadata.prototype.findClass = function (name) {
name = name.toLowerCase();
var res = this.classes[name];
if (!res) {
var newName = this.alternativeNames[name];
if (!!newName && newName != name)
return this.findClass(newName);
}
return res;
};
JsonMetadata.prototype.isDescendantOf = function (className, ancestorClassName) {
if (!className || !ancestorClassName) {
return false;
}
className = className.toLowerCase();
ancestorClassName = ancestorClassName.toLowerCase();
var class_ = this.findClass(className);
if (!class_) {
return false;
}
var parentClass = class_;
do {
if (parentClass.name === ancestorClassName) {
return true;
}
parentClass = this.classes[parentClass.parentName];
} while (!!parentClass);
return false;
};
JsonMetadata.prototype.addAlterNativeClassName = function (name, alternativeName) {
this.alternativeNames[alternativeName.toLowerCase()] = name.toLowerCase();
};
JsonMetadata.prototype.fillProperties = function (name, list, hash) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.parentName) {
this.fillProperties(metaDataClass.parentName, list, hash);
}
for (var i = 0; i < metaDataClass.properties.length; i++) {
var prop = metaDataClass.properties[i];
this.addPropertyCore(prop, list, hash);
hash[prop.name] = prop;
}
};
JsonMetadata.prototype.addPropertyCore = function (property, list, hash) {
if (!hash[property.name]) {
list.push(property);
return;
}
var index = -1;
for (var i = 0; i < list.length; i++) {
if (list[i].name == property.name) {
index = i;
break;
}
}
property.mergeWith(list[index]);
list[index] = property;
};
return JsonMetadata;
}());
var JsonError = /** @class */ (function () {
function JsonError(type, message) {
this.type = type;
this.message = message;
this.description = "";
this.at = -1;
}
JsonError.prototype.getFullDescription = function () {
return this.message + (this.description ? "\n" + this.description : "");
};
return JsonError;
}());
var JsonUnknownPropertyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonUnknownPropertyError, _super);
function JsonUnknownPropertyError(propertyName, className) {
var _this = _super.call(this, "unknownproperty", "The property '" +
propertyName +
"' in class '" +
className +
"' is unknown.") || this;
_this.propertyName = propertyName;
_this.className = className;
var properties = JsonObject.metaData.getProperties(className);
if (properties) {
_this.description = "The list of available properties are: ";
for (var i = 0; i < properties.length; i++) {
if (i > 0)
_this.description += ", ";
_this.description += properties[i].name;
}
_this.description += ".";
}
return _this;
}
return JsonUnknownPropertyError;
}(JsonError));
var JsonMissingTypeErrorBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonMissingTypeErrorBase, _super);
function JsonMissingTypeErrorBase(baseClassName, type, message) {
var _this = _super.call(this, type, message) || this;
_this.baseClassName = baseClassName;
_this.type = type;
_this.message = message;
_this.description = "The following types are available: ";
var types = JsonObject.metaData.getChildrenClasses(baseClassName, true);
for (var i = 0; i < types.length; i++) {
if (i > 0)
_this.description += ", ";
_this.description += "'" + types[i].name + "'";
}
_this.description += ".";
return _this;
}
return JsonMissingTypeErrorBase;
}(JsonError));
var JsonMissingTypeError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonMissingTypeError, _super);
function JsonMissingTypeError(propertyName, baseClassName) {
var _this = _super.call(this, baseClassName, "missingtypeproperty", "The property type is missing in the object. Please take a look at property: '" +
propertyName +
"'.") || this;
_this.propertyName = propertyName;
_this.baseClassName = baseClassName;
return _this;
}
return JsonMissingTypeError;
}(JsonMissingTypeErrorBase));
var JsonIncorrectTypeError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonIncorrectTypeError, _super);
function JsonIncorrectTypeError(propertyName, baseClassName) {
var _this = _super.call(this, baseClassName, "incorrecttypeproperty", "The property type is incorrect in the object. Please take a look at property: '" +
propertyName +
"'.") || this;
_this.propertyName = propertyName;
_this.baseClassName = baseClassName;
return _this;
}
return JsonIncorrectTypeError;
}(JsonMissingTypeErrorBase));
var JsonRequiredPropertyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonRequiredPropertyError, _super);
function JsonRequiredPropertyError(propertyName, className) {
var _this = _super.call(this, "requiredproperty", "The property '" +
propertyName +
"' is required in class '" +
className +
"'.") || this;
_this.propertyName = propertyName;
_this.className = className;
return _this;
}
return JsonRequiredPropertyError;
}(JsonError));
var JsonObject = /** @class */ (function () {
function JsonObject() {
this.errors = new Array();
this.lightSerializing = false;
}
Object.defineProperty(JsonObject, "metaData", {
get: function () {
return JsonObject.metaDataValue;
},
enumerable: true,
configurable: true
});
JsonObject.prototype.toJsonObject = function (obj, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
return this.toJsonObjectCore(obj, null, storeDefaults);
};
JsonObject.prototype.toObject = function (jsonObj, obj) {
this.toObjectCore(jsonObj, obj);
if (!!obj.getType) {
var error = this.getRequiredError(jsonObj, obj.getType());
if (!!error) {
this.addNewError(error, jsonObj);
}
}
};
JsonObject.prototype.toObjectCore = function (jsonObj, obj) {
if (!jsonObj)
return;
var properties = null;
var objType = undefined;
var needAddErrors = true;
if (obj.getType) {
objType = obj.getType();
properties = JsonObject.metaData.getProperties(objType);
needAddErrors =
!!objType && !JsonObject.metaData.isDescendantOf(objType, "itemvalue");
}
if (!properties)
return;
if (obj.startLoadingFromJson) {
obj.startLoadingFromJson();
}
properties = this.addDynamicProperties(obj, jsonObj, properties);
for (var key in jsonObj) {
if (key === JsonObject.typePropertyName)
continue;
if (key === JsonObject.positionPropertyName) {
obj[key] = jsonObj[key];
continue;
}
var property = this.findProperty(properties, key);
if (!property) {
if (needAddErrors) {
this.addNewError(new JsonUnknownPropertyError(key.toString(), objType), jsonObj);
}
continue;
}
this.valueToObj(jsonObj[key], obj, property);
}
if (obj.endLoadingFromJson) {
obj.endLoadingFromJson();
}
};
JsonObject.prototype.toJsonObjectCore = function (obj, property, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
if (!obj || !obj.getType)
return obj;
if (typeof obj.getData === "function")
return obj.getData();
var result = {};
if (property != null && !property.className) {
result[JsonObject.typePropertyName] = property.getObjType(obj.getType());
}
this.propertiesToJson(obj, JsonObject.metaData.getProperties(obj.getType()), result, storeDefaults);
this.propertiesToJson(obj, this.getDynamicProperties(obj), result, storeDefaults);
return result;
};
JsonObject.prototype.getDynamicProperties = function (obj) {
if (obj.getDynamicProperties && obj.getDynamicType) {
var names = obj.getDynamicProperties();
return JsonObject.metaData.findProperties(obj.getDynamicType(), names);
}
return [];
};
JsonObject.prototype.addDynamicProperties = function (obj, jsonObj, properties) {
if (!obj.getDynamicPropertyName)
return properties;
var dynamicPropName = obj.getDynamicPropertyName();
if (!dynamicPropName)
return properties;
if (jsonObj[dynamicPropName]) {
obj[dynamicPropName] = jsonObj[dynamicPropName];
}
var dynamicProperties = this.getDynamicProperties(obj);
var res = [];
for (var i = 0; i < properties.length; i++) {
res.push(properties[i]);
}
for (var i = 0; i < dynamicProperties.length; i++) {
res.push(dynamicProperties[i]);
}
return res;
};
JsonObject.prototype.propertiesToJson = function (obj, properties, json, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
for (var i = 0; i < properties.length; i++) {
this.valueToJson(obj, json, properties[i], storeDefaults);
}
};
JsonObject.prototype.valueToJson = function (obj, result, property, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
if (property.isSerializable === false ||
(property.isLightSerializable === false && this.lightSerializing))
return;
var value = property.getValue(obj);
if (!storeDefaults && property.isDefaultValue(value))
return;
if (this.isValueArray(value)) {
var arrValue = [];
for (var i = 0; i < value.length; i++) {
arrValue.push(this.toJsonObjectCore(value[i], property, storeDefaults));
}
value = arrValue.length > 0 ? arrValue : null;
}
else {
value = this.toJsonObjectCore(value, property, storeDefaults);
}
var hasValue = typeof obj["getPropertyValue"] === "function" &&
obj["getPropertyValue"](property.name, null) !== null;
if ((storeDefaults && hasValue) || !property.isDefaultValue(value)) {
result[property.name] = value;
}
};
JsonObject.prototype.valueToObj = function (value, obj, property) {
if (value == null)
return;
this.removePos(property, value);
if (property != null && property.hasToUseSetValue) {
property.setValue(obj, value, this);
return;
}
if (this.isValueArray(value)) {
this.valueToArray(value, obj, property.name, property);
return;
}
var newObj = this.createNewObj(value, property);
if (newObj.newObj) {
this.toObjectCore(value, newObj.newObj);
value = newObj.newObj;
}
if (!newObj.error) {
if (property != null) {
property.setValue(obj, value, this);
}
else {
obj[property.name] = value;
}
}
};
JsonObject.prototype.removePos = function (property, value) {
if (!property || !property.type || property.type.indexOf("value") < 0)
return;
this.removePosFromObj(value);
};
JsonObject.prototype.removePosFromObj = function (obj) {
if (!obj)
return;
if (Array.isArray(obj)) {
for (var i = 0; i < obj.length; i++) {
this.removePosFromObj(obj[i]);
}
}
if (!!obj[JsonObject.positionPropertyName]) {
delete obj[JsonObject.positionPropertyName];
}
};
JsonObject.prototype.isValueArray = function (value) {
return value && Array.isArray(value);
};
JsonObject.prototype.createNewObj = function (value, property) {
var result = { newObj: null, error: null };
var className = value[JsonObject.typePropertyName];
if (!className && property != null && property.className) {
className = property.className;
}
className = property.getClassName(className);
result.newObj = className
? JsonObject.metaData.createClass(className, value)
: null;
result.error = this.checkNewObjectOnErrors(result.newObj, value, property, className);
return result;
};
JsonObject.prototype.checkNewObjectOnErrors = function (newObj, value, property, className) {
var error = null;
if (newObj) {
error = this.getRequiredError(value, className);
}
else {
if (property.baseClassName) {
if (!className) {
error = new JsonMissingTypeError(property.name, property.baseClassName);
}
else {
error = new JsonIncorrectTypeError(property.name, property.baseClassName);
}
}
}
if (error) {
this.addNewError(error, value);
}
return error;
};
JsonObject.prototype.getRequiredError = function (value, className) {
var requiredProperties = JsonObject.metaData.getRequiredProperties(className);
if (!requiredProperties)
return null;
for (var i = 0; i < requiredProperties.length; i++) {
if (!value[requiredProperties[i]]) {
return new JsonRequiredPropertyError(requiredProperties[i], className);
}
}
return null;
};
JsonObject.prototype.addNewError = function (error, jsonObj) {
if (jsonObj && jsonObj[JsonObject.positionPropertyName]) {
error.at = jsonObj[JsonObject.positionPropertyName].start;
}
this.errors.push(error);
};
JsonObject.prototype.valueToArray = function (value, obj, key, property) {
if (obj[key] && value.length > 0)
obj[key].splice(0, obj[key].length);
if (!obj[key])
obj[key] = [];
for (var i = 0; i < value.length; i++) {
var newValue = this.createNewObj(value[i], property);
if (newValue.newObj) {
if (!!value[i].name) {
newValue.newObj.name = value[i].name;
}
obj[key].push(newValue.newObj);
this.toObjectCore(value[i], newValue.newObj);
}
else {
if (!newValue.error) {
obj[key].push(value[i]);
}
}
}
};
JsonObject.prototype.findProperty = function (properties, key) {
if (!properties)
return null;
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
if (prop.name == key || prop.alternativeName == key)
return prop;
}
return null;
};
JsonObject.typePropertyName = "type";
JsonObject.positionPropertyName = "pos";
JsonObject.metaDataValue = new JsonMetadata();
return JsonObject;
}());
var Serializer = JsonObject.metaData;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
/***/ }),
/* 4 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Helpers; });
var Helpers = /** @class */ (function () {
function Helpers() {
}
/**
* A static methods that returns true if a value underfined, null, empty string or empty array.
* @param value
*/
Helpers.isValueEmpty = function (value) {
if (Array.isArray(value) && value.length === 0)
return true;
if (!!value && typeof value === "object" && value.constructor === Object) {
for (var key in value) {
if (!Helpers.isValueEmpty(value[key]))
return false;
}
return true;
}
if (!!value && (typeof value === "string" || value instanceof String)) {
value = value.trim();
}
return !value && value !== 0 && value !== false;
};
Helpers.isArrayContainsEqual = function (x, y) {
if (!Array.isArray(x) || !Array.isArray(y))
return false;
if (x.length !== y.length)
return false;
for (var i = 0; i < x.length; i++) {
var j = 0;
for (; j < y.length; j++) {
if (Helpers.isTwoValueEquals(x[i], y[j]))
break;
}
if (j === y.length)
return false;
}
return true;
};
Helpers.isArraysEqual = function (x, y, ignoreOrder) {
if (ignoreOrder === void 0) { ignoreOrder = false; }
if (!Array.isArray(x) || !Array.isArray(y))
return false;
if (x.length !== y.length)
return false;
if (ignoreOrder) {
var xSorted = [];
var ySorted = [];
for (var i = 0; i < x.length; i++) {
xSorted.push(x[i]);
ySorted.push(y[i]);
}
xSorted.sort();
ySorted.sort();
x = xSorted;
y = ySorted;
}
for (var i = 0; i < x.length; i++) {
if (!Helpers.isTwoValueEquals(x[i], y[i]))
return false;
}
return true;
};
Helpers.isTwoValueEquals = function (x, y, ignoreOrder) {
if (ignoreOrder === void 0) { ignoreOrder = false; }
if (x === y)
return true;
if (Array.isArray(x) && x.length === 0 && typeof y === "undefined")
return true;
if (Array.isArray(y) && y.length === 0 && typeof x === "undefined")
return true;
if ((x === undefined || x === null) && y === "undefined")
return true;
if ((y === undefined || y === null) && x === "undefined")
return true;
if (Helpers.isConvertibleToNumber(x) && Helpers.isConvertibleToNumber(y)) {
if (parseInt(x) === parseInt(y) && parseFloat(x) === parseFloat(y)) {
return true;
}
}
if ((!Helpers.isValueEmpty(x) && Helpers.isValueEmpty(y)) ||
(Helpers.isValueEmpty(x) && !Helpers.isValueEmpty(y)))
return false;
if ((x === true || x === false) && typeof y == "string") {
return x.toString() === y.toLocaleLowerCase();
}
if ((y === true || y === false) && typeof x == "string") {
return y.toString() === x.toLocaleLowerCase();
}
if (!(x instanceof Object) && !(y instanceof Object))
return x == y;
if (!(x instanceof Object) || !(y instanceof Object))
return false;
if (x["equals"])
return x.equals(y);
if (!!x.toJSON && !!y.toJSON) {
return this.isTwoValueEquals(x.toJSON(), y.toJSON());
}
if (Array.isArray(x) && Array.isArray(y))
return Helpers.isArraysEqual(x, y, ignoreOrder);
for (var p in x) {
if (!x.hasOwnProperty(p))
continue;
if (!y.hasOwnProperty(p))
return false;
if (x[p] === y[p])
continue;
if (typeof x[p] !== "object")
return false;
if (!this.isTwoValueEquals(x[p], y[p]))
return false;
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p))
return false;
}
return true;
};
Helpers.randomizeArray = function (array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
};
Helpers.getUnbindValue = function (value) {
if (!!value && value instanceof Object) {
//do not return the same object instance!!!
return JSON.parse(JSON.stringify(value));
}
return value;
};
Helpers.createCopy = function (obj) {
var res = {};
if (!obj)
return res;
for (var key in obj) {
res[key] = obj[key];
}
return res;
};
Helpers.isConvertibleToNumber = function (value) {
return (value !== undefined &&
value !== null &&
!Array.isArray(value) &&
!isNaN(value));
};
Helpers.isNumber = function (value) {
if (typeof value == "string" &&
!!value &&
value.indexOf("0x") == 0 &&
value.length > 32)
return false;
return !isNaN(parseFloat(value)) && isFinite(value);
};
Helpers.getMaxLength = function (maxLength, surveyLength) {
if (maxLength < 0) {
maxLength = surveyLength;
}
return maxLength > 0 ? maxLength : null;
};
return Helpers;
}());
if (!String.prototype["format"]) {
String.prototype["format"] = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != "undefined" ? args[number] : match;
});
};
}
/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return SurveyLocString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyElementBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return ReactSurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionElementBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyQuestionUncontrolledElement; });
var SurveyLocString = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyLocString, _super);
function SurveyLocString(props) {
var _this = _super.call(this, props) || this;
_this.state = { changed: 0 };
return _this;
}
Object.defineProperty(SurveyLocString.prototype, "locStr", {
get: function () {
return this.props.locStr;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyLocString.prototype, "style", {
get: function () {
return this.props.style;
},
enumerable: true,
configurable: true
});
SurveyLocString.prototype.componentDidMount = function () {
if (!this.locStr)
return;
var self = this;
this.locStr.onChanged = function () {
self.setState({ changed: self.state.changed + 1 });
};
};
SurveyLocString.prototype.render = function () {
if (!this.locStr)
return null;
if (this.locStr.hasHtml) {
var htmlValue = { __html: this.locStr.renderedHtml };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: this.style, dangerouslySetInnerHTML: htmlValue });
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: this.style }, this.locStr.renderedHtml);
};
return SurveyLocString;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var SurveyElementBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyElementBase, _super);
function SurveyElementBase(props) {
return _super.call(this, props) || this;
}
SurveyElementBase.renderLocString = function (locStr, style) {
if (style === void 0) { style = null; }
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyLocString, { locStr: locStr, style: style });
};
SurveyElementBase.prototype.componentDidMount = function () {
this.makeBaseElementReact();
};
SurveyElementBase.prototype.componentWillUnmount = function () {
this.unMakeBaseElementReact();
};
SurveyElementBase.prototype.componentDidUpdate = function (prevProps, prevState) {
this.makeBaseElementReact();
};
SurveyElementBase.prototype.getStateElement = function () {
return null;
};
Object.defineProperty(SurveyElementBase.prototype, "isDisplayMode", {
get: function () {
return this.props.isDisplayMode || false;
},
enumerable: true,
configurable: true
});
SurveyElementBase.prototype.renderLocString = function (locStr, style) {
if (style === void 0) { style = null; }
return SurveyElementBase.renderLocString(locStr, style);
};
SurveyElementBase.prototype.makeBaseElementReact = function () {
var _this = this;
var stateElement = this.getStateElement();
if (!stateElement)
return;
stateElement.iteratePropertiesHash(function (hash, key) {
var val = hash[key];
if (Array.isArray(val)) {
var val = val;
val["onArrayChanged"] = function () {
return _this.setState(function (state) {
var newState = {};
newState[key] = val;
return newState;
});
};
}
});
stateElement.setPropertyValueCoreHandler = function (hash, key, val) {
if (hash[key] !== val) {
hash[key] = val;
_this.setState(function (state) {
var newState = {};
newState[key] = val;
return newState;
});
}
};
};
SurveyElementBase.prototype.unMakeBaseElementReact = function () {
var stateElement = this.getStateElement();
if (!stateElement)
return;
stateElement.setPropertyValueCoreHandler = undefined;
stateElement.iteratePropertiesHash(function (hash, key) {
var val = hash[key];
if (Array.isArray(val)) {
var val = val;
val["onArrayChanged"] = function () { };
}
});
};
return SurveyElementBase;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var ReactSurveyElement = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ReactSurveyElement, _super);
function ReactSurveyElement(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(ReactSurveyElement.prototype, "cssClasses", {
get: function () {
return this.props.cssClasses;
},
enumerable: true,
configurable: true
});
return ReactSurveyElement;
}(SurveyElementBase));
var SurveyQuestionElementBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionElementBase, _super);
function SurveyQuestionElementBase(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionElementBase.prototype, "questionBase", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionElementBase.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
SurveyQuestionElementBase.prototype.shouldComponentUpdate = function () {
return (!this.questionBase.customWidget ||
!!this.questionBase.customWidgetData.isNeedRender ||
!!this.questionBase.customWidget.widgetJson.isDefaultRender ||
!!this.questionBase.customWidget.widgetJson.render);
};
return SurveyQuestionElementBase;
}(SurveyElementBase));
var SurveyQuestionUncontrolledElement = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionUncontrolledElement, _super);
function SurveyQuestionUncontrolledElement(props) {
var _this = _super.call(this, props) || this;
_this.updateValueOnEvent = function (event) {
_this.questionBase.value = event.target.value;
};
_this.updateValueOnEvent = _this.updateValueOnEvent.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionUncontrolledElement.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionUncontrolledElement.prototype.componentWillUpdate = function () {
if (!!this.control) {
this.control.value = this.getValue(this.questionBase.value);
}
};
SurveyQuestionUncontrolledElement.prototype.componentDidMount = function () {
if (!!this.control) {
this.control.value = this.getValue(this.questionBase.value);
}
};
SurveyQuestionUncontrolledElement.prototype.getValue = function (val) {
if (__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(val))
return "";
return val;
};
return SurveyQuestionUncontrolledElement;
}(SurveyQuestionElementBase));
/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactQuestionFactory; });
var ReactQuestionFactory = /** @class */ (function () {
function ReactQuestionFactory() {
this.creatorHash = {};
}
ReactQuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
ReactQuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ReactQuestionFactory.prototype.createQuestion = function (questionType, params) {
var creator = this.creatorHash[questionType];
if (creator == null)
return null;
return creator(params);
};
ReactQuestionFactory.Instance = new ReactQuestionFactory();
return ReactQuestionFactory;
}());
/***/ }),
/* 7 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Base; });
/* unused harmony export ArrayChanges */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Event; });
/**
* The base class for SurveyJS objects.
*/
var Base = /** @class */ (function () {
function Base() {
this.propertyHash = {};
this.isLoadingFromJsonValue = false;
this.onPropertyChanged = new Event();
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* CustomPropertiesCollection */].createProperties(this);
}
Object.defineProperty(Base, "commentPrefix", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].commentPrefix;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].commentPrefix = val;
},
enumerable: true,
configurable: true
});
/**
* A static methods that returns true if a value underfined, null, empty string or empty array.
* @param value
*/
Base.prototype.isValueEmpty = function (value) {
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(value);
};
Base.prototype.IsPropertyEmpty = function (value) {
return value !== "" && this.isValueEmpty(value);
};
/**
* Returns the type of the object as a string as it represents in the json. It should be in lowcase.
*/
Base.prototype.getType = function () {
return "base";
};
/**
* Returns the element template name without prefix. Typically it equals to getType().
* @see getType
*/
Base.prototype.getTemplate = function () {
return this.getType();
};
Object.defineProperty(Base.prototype, "isLoadingFromJson", {
/**
* Returns true if the object is loading from Json at the current moment.
*/
get: function () {
return this.isLoadingFromJsonValue;
},
enumerable: true,
configurable: true
});
Base.prototype.startLoadingFromJson = function () {
this.isLoadingFromJsonValue = true;
};
Base.prototype.endLoadingFromJson = function () {
this.isLoadingFromJsonValue = false;
};
/**
* Deserialized the current object into JSON
* @see fromJSON
*/
Base.prototype.toJSON = function () {
return new __WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */]().toJsonObject(this);
};
/**
* Load object properties and elements. It doesn't reset properties that was changed before and they are not defined in the json parameter.
* @param json the object JSON definition
* @see toJSON
*/
Base.prototype.fromJSON = function (json) {
return new __WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */]().toObject(json, this);
};
/**
* Make a clone of the existing object. Create a new object of the same type and load all properties into it.
*/
Base.prototype.clone = function () {
var clonedObj = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].createClass(this.getType());
clonedObj.fromJSON(this.toJSON());
return clonedObj;
};
Base.prototype.locStrsChanged = function () {
if (!!this.arraysInfo) {
for (var key in this.arraysInfo) {
var item = this.arraysInfo[key];
if (item && item.isItemValues) {
var arr = this.getPropertyValue(key);
if (arr && !!Base.itemValueLocStrChanged)
Base.itemValueLocStrChanged(arr);
}
}
}
if (!!this.localizableStrings) {
for (var key in this.localizableStrings) {
var item = this.getLocalizableString(key);
if (item)
item.strChanged();
}
}
};
/**
* Returns the property value by name
* @param name property name
*/
Base.prototype.getPropertyValue = function (name, defaultValue) {
if (defaultValue === void 0) { defaultValue = null; }
var res = this.getPropertyValueCore(this.propertyHash, name);
if (this.IsPropertyEmpty(res)) {
if (defaultValue != null)
return defaultValue;
var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].findProperty(this.getType(), name);
var serValue = !!prop && !prop.isCustom ? prop.defaultValue : null;
if (!this.IsPropertyEmpty(serValue))
return serValue;
}
return res;
};
Base.prototype.getPropertyValueCore = function (propertiesHash, name) {
if (this.getPropertyValueCoreHandler)
return this.getPropertyValueCoreHandler(propertiesHash, name);
else
return propertiesHash[name];
};
Base.prototype.geValueFromHash = function () {
return this.propertyHash["value"];
};
Base.prototype.setPropertyValueCore = function (propertiesHash, name, val) {
if (this.setPropertyValueCoreHandler)
this.setPropertyValueCoreHandler(propertiesHash, name, val);
else
propertiesHash[name] = val;
};
Base.prototype.iteratePropertiesHash = function (func) {
var _this = this;
var keys = [];
for (var key in this.propertyHash) {
keys.push(key);
}
keys.forEach(function (key) { return func(_this.propertyHash, key); });
};
/**
* set property value
* @param name property name
* @param val new property value
*/
Base.prototype.setPropertyValue = function (name, val) {
var oldValue = this.getPropertyValue(name);
if (oldValue && Array.isArray(oldValue)) {
if (this.isTwoValueEquals(oldValue, val))
return;
var arrayInfo = this.arraysInfo[name];
this.setArray(oldValue, val, arrayInfo ? arrayInfo.isItemValues : false, arrayInfo ? arrayInfo.onPush : null);
this.propertyValueChanged(name, oldValue, oldValue);
}
else {
this.setPropertyValueCore(this.propertyHash, name, val);
if (!this.isTwoValueEquals(oldValue, val)) {
this.propertyValueChanged(name, oldValue, val);
}
}
};
Base.prototype.onPropertyValueChangedCallback = function (name, oldValue, newValue, sender, arrayChanges) { };
Base.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { };
Base.prototype.propertyValueChanged = function (name, oldValue, newValue, arrayChanges, target) {
if (this.isLoadingFromJson)
return;
this.onPropertyValueChanged(name, oldValue, newValue);
this.onPropertyChanged.fire(this, {
name: name,
oldValue: oldValue,
newValue: newValue
});
this.doPropertyValueChangedCallback &&
this.doPropertyValueChangedCallback(name, oldValue, newValue, arrayChanges, this);
if (!this.onPropChangeFunctions)
return;
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
if (this.onPropChangeFunctions[i].name == name)
this.onPropChangeFunctions[i].func(newValue);
}
};
Base.prototype.doPropertyValueChangedCallback = function (name, oldValue, newValue, arrayChanges, target) {
if (!target)
target = this;
var parentBase = this;
if (this["locOwner"]) {
parentBase = this["locOwner"];
parentBase.doPropertyValueChangedCallback &&
parentBase.doPropertyValueChangedCallback(name, oldValue, newValue, arrayChanges, target);
}
else if (this["survey"]) {
parentBase = this["survey"];
parentBase.doPropertyValueChangedCallback &&
parentBase.doPropertyValueChangedCallback(name, oldValue, newValue, arrayChanges, target);
}
else {
this.onPropertyValueChangedCallback(name, oldValue, newValue, target, arrayChanges);
}
};
/**
* Register a function that will be called on a property value changed.
* @param name the property name
* @param func the function with no parameters that will be called on property changed.
* @param key an optional parameter. If there is already a registered function for this property witht the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertyValueChanged = function (name, func, key) {
if (key === void 0) { key = null; }
if (!this.onPropChangeFunctions) {
this.onPropChangeFunctions = [];
}
if (key) {
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
var item = this.onPropChangeFunctions[i];
if (item.name == name && item.key == key) {
item.func = func;
return;
}
}
}
this.onPropChangeFunctions.push({ name: name, func: func, key: key });
};
/**
* Register a function that will be called on a property value changed from the names list.
* @param names the list of properties names
* @param func the function with no parameters that will be called on property changed.
* @param key an optional parameter. If there is already a registered function for this property witht the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertiesValueChanged = function (names, func, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < names.length; i++) {
this.registerFunctionOnPropertyValueChanged(names[i], func, key);
}
};
/**
* Unregister notification on property value changed
* @param name the property name
* @param key the key with which you have registered the notification for this property. It can be null.
*/
Base.prototype.unRegisterFunctionOnPropertyValueChanged = function (name, key) {
if (key === void 0) { key = null; }
if (!this.onPropChangeFunctions)
return;
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
var item = this.onPropChangeFunctions[i];
if (item.name == name && item.key == key) {
this.onPropChangeFunctions.splice(i, 1);
return;
}
}
};
/**
* Unregister notification on property value changed for all properties in the names list.
* @param names the list of properties names
* @param key the key with which you have registered the notification for this property. It can be null.
*/
Base.prototype.unRegisterFunctionOnPropertiesValueChanged = function (names, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < names.length; i++) {
this.unRegisterFunctionOnPropertyValueChanged(names[i], key);
}
};
Base.prototype.createCustomLocalizableObj = function (name) {
var locStr = this.getLocalizableString(name);
if (locStr || !this.getLocale)
return;
this.createLocalizableString(name, this);
};
Base.prototype.createLocalizableString = function (name, owner, useMarkDown) {
if (useMarkDown === void 0) { useMarkDown = false; }
var locStr = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](owner, useMarkDown);
if (!this.localizableStrings) {
this.localizableStrings = {};
}
this.localizableStrings[name] = locStr;
return locStr;
};
Base.prototype.getLocalizableString = function (name) {
return !!this.localizableStrings ? this.localizableStrings[name] : null;
};
Base.prototype.getLocalizableStringText = function (name, defaultStr) {
if (defaultStr === void 0) { defaultStr = ""; }
var locStr = this.getLocalizableString(name);
if (!locStr)
return "";
var res = locStr.text;
return res ? res : defaultStr;
};
Base.prototype.setLocalizableStringText = function (name, value) {
var locStr = this.getLocalizableString(name);
if (!locStr)
return;
var oldValue = locStr.text;
if (oldValue === value)
return;
locStr.text = value;
this.propertyValueChanged(name, oldValue, value);
};
Base.prototype.addUsedLocales = function (locales) {
if (!!this.localizableStrings) {
for (var key in this.localizableStrings) {
var item = this.getLocalizableString(key);
if (item)
this.AddLocStringToUsedLocales(item, locales);
}
}
if (!!this.arraysInfo) {
for (var key in this.arraysInfo) {
var items = this.getPropertyValue(key);
if (!items || !items.length)
continue;
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item && item.addUsedLocales) {
item.addUsedLocales(locales);
}
}
}
}
};
Base.prototype.AddLocStringToUsedLocales = function (locStr, locales) {
var locs = locStr.getLocales();
for (var i = 0; i < locs.length; i++) {
if (locales.indexOf(locs[i]) < 0) {
locales.push(locs[i]);
}
}
};
Base.prototype.createItemValues = function (name) {
var self = this;
var result = this.createNewArray(name, function (item) {
item.locOwner = self;
});
this.arraysInfo[name].isItemValues = true;
return result;
};
Base.prototype.notifyArrayChanged = function (ar) {
!!ar.onArrayChanged && ar.onArrayChanged();
};
Base.prototype.createNewArray = function (name, onPush, onRemove) {
if (onPush === void 0) { onPush = null; }
if (onRemove === void 0) { onRemove = null; }
var newArray = new Array();
this.setPropertyValueCore(this.propertyHash, name, newArray);
if (!this.arraysInfo) {
this.arraysInfo = {};
}
this.arraysInfo[name] = { onPush: onPush, isItemValues: false };
var self = this;
newArray.push = function (value) {
var result = Object.getPrototypeOf(newArray).push.call(newArray, value);
if (onPush)
onPush(value, newArray.length - 1);
var arrayChanges = new ArrayChanges(newArray.length - 1, 0, [value], []);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
newArray.unshift = function (value) {
var result = Object.getPrototypeOf(newArray).unshift.call(newArray, value);
if (onPush)
onPush(value, newArray.length - 1);
var arrayChanges = new ArrayChanges(0, 0, [value], []);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
newArray.pop = function () {
var result = Object.getPrototypeOf(newArray).pop.call(newArray);
if (onRemove)
onRemove(result);
var arrayChanges = new ArrayChanges(newArray.length - 1, 1, [], []);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
newArray.splice = function (start, deleteCount) {
var _a;
var items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
if (!start)
start = 0;
if (!deleteCount)
deleteCount = 0;
var result = (_a = Object.getPrototypeOf(newArray).splice).call.apply(_a, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["d" /* __spreadArrays */])([newArray,
start,
deleteCount], items));
if (!items)
items = [];
if (onRemove && result) {
for (var i = 0; i < result.length; i++) {
onRemove(result[i]);
}
}
if (onPush) {
for (var i = 0; i < items.length; i++) {
onPush(items[i], start + i);
}
}
var arrayChanges = new ArrayChanges(start, deleteCount, items, result);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
return newArray;
};
Base.prototype.getItemValueType = function () {
return undefined;
};
Base.prototype.setArray = function (src, dest, isItemValues, onPush) {
Object.getPrototypeOf(src).splice.call(src, 0, src.length);
//src.splice(0, src.length);
// src.length = 0;
if (!dest) {
this.notifyArrayChanged(src);
return;
}
for (var i = 0; i < dest.length; i++) {
var item = dest[i];
if (isItemValues) {
if (!!Base.createItemValue) {
item = Base.createItemValue(item, this.getItemValueType());
}
}
Object.getPrototypeOf(src).push.call(src, item);
//src["origionalPush"].apply(src, [item]);
if (onPush)
onPush(src[i]);
}
this.notifyArrayChanged(src);
};
Base.prototype.isTwoValueEquals = function (x, y, caseInSensitive) {
if (caseInSensitive === void 0) { caseInSensitive = false; }
if (caseInSensitive) {
x = this.getValueInLowCase(x);
y = this.getValueInLowCase(y);
}
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isTwoValueEquals(x, y);
};
Base.copyObject = function (dst, src) {
for (var key in src) {
var source = src[key];
if (typeof source === "object") {
source = {};
this.copyObject(source, src[key]);
}
dst[key] = source;
}
};
Base.prototype.copyCssClasses = function (dest, source) {
if (!source)
return;
if (typeof source === "string" || source instanceof String) {
dest["root"] = source;
}
else {
SurveyElement.copyObject(dest, source);
}
};
Base.prototype.getValueInLowCase = function (val) {
if (!!val && typeof val == "string")
return val.toLowerCase();
return val;
};
return Base;
}());
var ArrayChanges = /** @class */ (function () {
function ArrayChanges(index, deleteCount, itemsToAdd, deletedItems) {
this.index = index;
this.deleteCount = deleteCount;
this.itemsToAdd = itemsToAdd;
this.deletedItems = deletedItems;
}
return ArrayChanges;
}());
var SurveyError = /** @class */ (function () {
function SurveyError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
this.text = text;
this.errorOwner = errorOwner;
this.visible = true;
}
Object.defineProperty(SurveyError.prototype, "locText", {
get: function () {
if (!this.locTextValue) {
this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](this.errorOwner, true);
this.locTextValue.text = this.getText();
}
return this.locTextValue;
},
enumerable: true,
configurable: true
});
SurveyError.prototype.getText = function () {
var res = this.text;
if (!res)
res = this.getDefaultText();
if (!!this.errorOwner) {
res = this.errorOwner.getErrorCustomText(res, this);
}
return res;
};
SurveyError.prototype.getErrorType = function () {
return "base";
};
SurveyError.prototype.getDefaultText = function () {
return "";
};
return SurveyError;
}());
var SurveyElement = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyElement, _super);
function SurveyElement(name) {
var _this = _super.call(this) || this;
_this.selectedElementInDesignValue = _this;
_this.name = name;
_this.createNewArray("errors");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("isReadOnly", function () {
self.onReadOnlyChanged();
});
return _this;
}
SurveyElement.ScrollElementToTop = function (elementId) {
if (!elementId)
return false;
var el = document.getElementById(elementId);
if (!el || !el.scrollIntoView)
return false;
var elemTop = el.getBoundingClientRect().top;
if (elemTop < 0)
el.scrollIntoView();
return elemTop < 0;
};
SurveyElement.GetFirstNonTextElement = function (elements) {
if (!elements || !elements.length)
return;
for (var i = 0; i < elements.length; i++) {
if (elements[i].nodeName != "#text" && elements[i].nodeName != "#comment")
return elements[i];
}
return null;
};
SurveyElement.FocusElement = function (elementId) {
if (!elementId)
return false;
var el = document.getElementById(elementId);
if (el) {
el.focus();
return true;
}
return false;
};
SurveyElement.prototype.setSurveyImpl = function (value) {
this.surveyImplValue = value;
if (!this.surveyImplValue)
return;
this.surveyDataValue = this.surveyImplValue.geSurveyData();
this.surveyValue = this.surveyImplValue.getSurvey();
this.textProcessorValue = this.surveyImplValue.getTextProcessor();
this.onSetData();
};
Object.defineProperty(SurveyElement.prototype, "surveyImpl", {
get: function () {
return this.surveyImplValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "data", {
get: function () {
return this.surveyDataValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "survey", {
/**
* Returns the survey object.
*/
get: function () {
if (!!this.surveyValue)
return this.surveyValue;
if (!!this.surveyImplValue) {
this.surveyValue = this.surveyImplValue.getSurvey();
}
return this.surveyValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isDesignMode", {
/**
* Returns true if the question in design mode right now.
*/
get: function () {
return !!this.survey && this.survey.isDesignMode;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "areInvisibleElementsShowing", {
get: function () {
return !!this.survey && this.survey.areInvisibleElementsShowing;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isVisible", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isReadOnly", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "readOnly", {
/**
* Set it to true to make an element question/panel/page readonly.
* @see enableIf
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("readOnly", false);
},
set: function (val) {
if (this.readOnly == val)
return;
this.setPropertyValue("readOnly", val);
if (!this.isLoadingFromJson) {
this.setPropertyValue("isReadOnly", this.isReadOnly);
}
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.onReadOnlyChanged = function () {
if (!!this.readOnlyChangedCallback) {
this.readOnlyChangedCallback();
}
};
Object.defineProperty(SurveyElement.prototype, "isLoadingFromJson", {
get: function () {
if (this.isLoadingFromJsonValue)
return true;
return this.survey ? this.survey.isLoadingFromJson : false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "name", {
/**
* This is the identifier of a survey element - question or panel.
* @see valueName
*/
get: function () {
return this.getPropertyValue("name", "");
},
set: function (val) {
var oldValue = this.name;
this.setPropertyValue("name", val);
if (!this.isLoadingFromJson && !!oldValue) {
this.onNameChanged(oldValue);
}
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.onNameChanged = function (oldValue) { };
Object.defineProperty(SurveyElement.prototype, "errors", {
/**
* The list of errors. It is created by callig hasErrors functions
* @see hasErrors
*/
get: function () {
return this.getPropertyValue("errors");
},
set: function (val) {
this.setPropertyValue("errors", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "containsErrors", {
/**
* Returns true if a question or a container (panel/page) or their chidren have an error.
* The value can be out of date. hasErrors function should be called to get the correct value.
*/
get: function () {
return this.getPropertyValue("containsErrors", false);
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.updateContainsErrors = function () {
this.setPropertyValue("containsErrors", this.getContainsErrors());
};
SurveyElement.prototype.getContainsErrors = function () {
return this.errors.length > 0;
};
SurveyElement.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return [];
};
Object.defineProperty(SurveyElement.prototype, "selectedElementInDesign", {
get: function () {
return this.selectedElementInDesignValue;
},
set: function (val) {
this.selectedElementInDesignValue = val;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.updateCustomWidgets = function () { };
SurveyElement.prototype.onSurveyLoad = function () { };
SurveyElement.prototype.onFirstRendering = function () { };
SurveyElement.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
if (!this.survey) {
this.onSurveyLoad();
}
};
SurveyElement.prototype.setVisibleIndex = function (index) {
return 0;
};
Object.defineProperty(SurveyElement.prototype, "isPage", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isPanel", {
/**
* Return false if it is not panel.
*/
get: function () {
return false;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.delete = function () { };
SurveyElement.prototype.removeSelfFromList = function (list) {
if (!list || !Array.isArray(list))
return;
var index = list.indexOf(this);
if (index > -1) {
list.splice(index, 1);
}
};
Object.defineProperty(SurveyElement.prototype, "textProcessor", {
get: function () {
return this.textProcessorValue;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.getProcessedHtml = function (html) {
if (!html || !this.textProcessor)
return html;
return this.textProcessor.processText(html, true);
};
SurveyElement.prototype.onSetData = function () { };
SurveyElement.prototype.getPage = function (parent) {
while (parent && parent.parent)
parent = parent.parent;
if (parent && parent.getType() == "page")
return parent;
return null;
};
SurveyElement.prototype.moveToBase = function (parent, container, insertBefore) {
if (insertBefore === void 0) { insertBefore = null; }
if (!container)
return false;
parent.removeElement(this);
var index = -1;
if (__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isNumber(insertBefore)) {
index = parseInt(insertBefore);
}
if (index == -1 && !!insertBefore && !!insertBefore.getType) {
index = container.indexOf(insertBefore);
}
container.addElement(this, index);
return true;
};
SurveyElement.prototype.setPage = function (parent, val) {
var oldPage = this.getPage(parent);
if (oldPage === val)
return;
if (parent)
parent.removeElement(this);
if (val) {
val.addElement(this, -1);
}
};
return SurveyElement;
}(Base));
var Event = /** @class */ (function () {
function Event() {
}
Object.defineProperty(Event.prototype, "isEmpty", {
get: function () {
return this.callbacks == null || this.callbacks.length == 0;
},
enumerable: true,
configurable: true
});
Event.prototype.fire = function (sender, options) {
if (this.callbacks == null)
return;
for (var i = 0; i < this.callbacks.length; i++) {
var callResult = this.callbacks[i](sender, options);
}
};
Event.prototype.clear = function () {
this.callbacks = [];
};
Event.prototype.add = function (func) {
if (this.hasFunc(func))
return;
if (this.callbacks == null) {
this.callbacks = new Array();
}
this.callbacks.push(func);
};
Event.prototype.remove = function (func) {
if (this.hasFunc(func)) {
var index = this.callbacks.indexOf(func, 0);
this.callbacks.splice(index, 1);
}
};
Event.prototype.hasFunc = function (func) {
if (this.callbacks == null)
return false;
return this.callbacks.indexOf(func, 0) > -1;
};
return Event;
}());
/***/ }),
/* 8 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFactory; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ElementFactory; });
//TODO replace completely with ElementFactory
var QuestionFactory = /** @class */ (function () {
function QuestionFactory() {
this.creatorHash = {};
}
Object.defineProperty(QuestionFactory, "DefaultChoices", {
get: function () {
return [
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "1",
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "2",
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "3"
];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFactory, "DefaultColums", {
get: function () {
var colName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column") + " ";
return [colName + "1", colName + "2", colName + "3"];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFactory, "DefaultRows", {
get: function () {
var rowName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row") + " ";
return [rowName + "1", rowName + "2"];
},
enumerable: true,
configurable: true
});
QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
QuestionFactory.prototype.unregisterElement = function (elementType) {
delete this.creatorHash[elementType];
};
QuestionFactory.prototype.clear = function () {
this.creatorHash = {};
};
QuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
QuestionFactory.prototype.createQuestion = function (questionType, name) {
var creator = this.creatorHash[questionType];
if (creator == null)
return null;
return creator(name);
};
QuestionFactory.Instance = new QuestionFactory();
return QuestionFactory;
}());
var ElementFactory = /** @class */ (function () {
function ElementFactory() {
this.creatorHash = {};
}
ElementFactory.prototype.registerElement = function (elementType, elementCreator) {
this.creatorHash[elementType] = elementCreator;
};
ElementFactory.prototype.clear = function () {
this.creatorHash = {};
};
ElementFactory.prototype.unregisterElement = function (elementType, removeFromSerializer) {
if (removeFromSerializer === void 0) { removeFromSerializer = false; }
delete this.creatorHash[elementType];
QuestionFactory.Instance.unregisterElement(elementType);
if (removeFromSerializer) {
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].removeClass(elementType);
}
};
ElementFactory.prototype.getAllTypes = function () {
var result = QuestionFactory.Instance.getAllTypes();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ElementFactory.prototype.createElement = function (elementType, name) {
var creator = this.creatorHash[elementType];
if (creator == null)
return QuestionFactory.Instance.createQuestion(elementType, name);
return creator(name);
};
ElementFactory.Instance = new ElementFactory();
return ElementFactory;
}());
/***/ }),
/* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return settings; });
/**
* Global survey settings
*/
var settings = {
/**
* The prefix that uses to store the question comment, as {questionName} + {commentPrefix}.
* The default
*/
commentPrefix: "-Comment",
/**
* Encode parameter on calling restfull web API
*/
webserviceEncodeParameters: true,
/**
* SurveyJS web service API url
*/
surveyServiceUrl: "https://dxsurveyapi.azurewebsites.net/api/Survey",
/**
* separator that can allow to set value and text of ItemValue object in one string as: "value|text"
*/
itemValueSeparator: "|",
/**
* default locale name for localizable strings that uses during serialization, {"default": "My text", "de": "Mein Text"}
*/
defaultLocaleName: "default",
/**
* Default row name for matrix (single choice)
*/
matrixDefaultRowName: "default",
/**
* Default cell type for dropdown and dynamic matrices
*/
matrixDefaultCellType: "dropdown",
/**
* Total value postfix for dropdown and dynamic matrices. The total value stores as: {matrixName} + {postfix}
*/
matrixTotalValuePostFix: "-total",
/**
* Maximum row count in dynamic matrix
*/
matrixMaximumRowCount: 1000,
/**
* Maximum panel count in dynamic panel
*/
panelMaximumPanelCount: 100,
/**
* Maximum rate value count in rating question
*/
ratingMaximumRateValueCount: 20,
/**
* Disable the question while choices are getting from the web service
*/
disableOnGettingChoicesFromWeb: false
};
/***/ }),
/* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__validator__ = __webpack_require__(32);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__textPreProcessor__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__questionCustomWidgets__ = __webpack_require__(45);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Question; });
/**
* A base class for all questions.
*/
var Question = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Question, _super);
function Question(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.conditionRunner = null;
_this.isCustomWidgetRequested = false;
_this.customWidgetData = { isNeedRender: true };
_this.isReadyValue = true;
/**
* The event is fired when isReady property of question is changed.
*
options.question - the question
*
options.isReady - current value of isReady
*
options.oldIsReady - old value of isReady
*/
_this.onReadyChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
_this._displayValue = "";
_this.isRunningValidatorsValue = false;
_this.isValueChangedInSurvey = false;
_this.locNotificationInData = false;
//ILocalizableOwner
_this.locOwner = null;
_this.id = Question.getQuestionId();
_this.onCreating();
var self = _this;
_this.createNewArray("validators", function (validator) {
validator.errorOwner = self;
});
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onGetTextCallback = function (text) {
var res = self.calcFullTitle(text);
if (!self.survey)
return res;
return self.survey.getUpdatedQuestionTitle(this, res);
};
_this.locProcessedTitle = new __WEBPACK_IMPORTED_MODULE_8__localizablestring__["a" /* LocalizableString */](_this, true);
_this.locProcessedTitle.sharedData = locTitleValue;
_this.createLocalizableString("description", _this, true);
var locCommentText = _this.createLocalizableString("commentText", _this, true);
locCommentText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText");
};
_this.createLocalizableString("requiredErrorText", _this);
_this.registerFunctionOnPropertyValueChanged("width", function () {
if (!!self.parent) {
self.parent.elementWidthChanged(self);
}
});
_this.registerFunctionOnPropertiesValueChanged(["indent", "rightIndent"], function () {
self.onIndentChanged();
});
_this.registerFunctionOnPropertiesValueChanged(["hasComment", "hasOther"], function () {
self.initCommentFromSurvey();
});
return _this;
}
Question.getQuestionId = function () {
return "sq_" + Question.questionCounter++;
};
Question.prototype.getValueName = function () {
if (!!this.valueName)
return this.valueName.toString();
return this.name;
};
Object.defineProperty(Question.prototype, "valueName", {
/**
* Use this property if you want to store the question result in the name different from the question name.
* Question name should be unique in the survey and valueName could be not unique. It allows to share data between several questions with the same valueName.
* The library set the value automatically if the question.name property is not valid. For example, if it contains the period '.' symbol.
* In this case if you set the question.name property to 'x.y' then the valueName becomes 'x y'.
* @see name
*/
get: function () {
return this.getPropertyValue("valueName", "");
},
set: function (val) {
var oldValueName = this.getValueName();
this.setPropertyValue("valueName", val);
this.onValueNameChanged(oldValueName);
},
enumerable: true,
configurable: true
});
Question.prototype.onValueNameChanged = function (oldValue) {
if (!this.survey)
return;
this.survey.questionRenamed(this, this.name, !!oldValue ? oldValue : this.name);
this.initDataFromSurvey();
};
Question.prototype.onNameChanged = function (oldValue) {
if (!this.survey)
return;
this.survey.questionRenamed(this, oldValue, this.valueName ? this.valueName : oldValue);
};
Object.defineProperty(Question.prototype, "isReady", {
get: function () {
return this.isReadyValue;
},
enumerable: true,
configurable: true
});
/**
* Get is question ready to use
*/
Question.prototype.choicesLoaded = function () { };
Object.defineProperty(Question.prototype, "page", {
/**
* Get/set the page where the question is located.
*/
get: function () {
return this.getPage(this.parent);
},
set: function (val) {
this.setPage(this.parent, val);
},
enumerable: true,
configurable: true
});
Question.prototype.getPanel = function () {
return null;
};
Question.prototype.delete = function () {
if (!!this.parent) {
this.removeSelfFromList(this.parent.elements);
}
};
Object.defineProperty(Question.prototype, "isFlowLayout", {
get: function () {
return this.getLayoutType() === "flow";
},
enumerable: true,
configurable: true
});
Question.prototype.getLayoutType = function () {
if (!!this.parent)
return this.parent.getChildrenLayoutType();
return "row";
};
Question.prototype.isLayoutTypeSupported = function (layoutType) {
return layoutType !== "flow";
};
Object.defineProperty(Question.prototype, "visible", {
/**
* Use it to get/set the question visibility.
* @see visibleIf
*/
get: function () {
return this.getPropertyValue("visible", true);
},
set: function (val) {
if (val == this.visible)
return;
this.setPropertyValue("visible", val);
this.onVisibleChanged();
if (this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
Question.prototype.onVisibleChanged = function () {
this.setPropertyValue("isVisible", this.isVisible);
if (!this.isVisible && this.errors && this.errors.length > 0) {
this.errors = [];
}
};
Object.defineProperty(Question.prototype, "useDisplayValuesInTitle", {
/**
* Use it to choose how other question values will be rendered in title if referenced in {}.
*/
get: function () {
return this.getPropertyValue("useDisplayValuesInTitle", true);
},
set: function (val) {
this.setPropertyValue("useDisplayValuesInTitle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "visibleIf", {
/**
* An expression that returns true or false. If it returns true the Question becomes visible and if it returns false the Question becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.
* @see visible
*/
get: function () {
return this.getPropertyValue("visibleIf", "");
},
set: function (val) {
this.setPropertyValue("visibleIf", val);
this.runConditions();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isVisible", {
/**
* Returns true if the question is visible or survey is in design mode right now.
*/
get: function () {
return this.visible || this.areInvisibleElementsShowing;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "visibleIndex", {
/**
* Returns the visible index of the question in the survey. It can be from 0 to all visible questions count - 1
*/
get: function () {
return this.getPropertyValue("visibleIndex", -1);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isAllowTitleLeft", {
/**
* Returns true if the question may have a title located on the left
*/
get: function () {
return true;
},
enumerable: true,
configurable: true
});
/**
* Returns the type of the object as a string as it represents in the json.
*/
Question.prototype.getType = function () {
return "question";
};
/**
* Move question to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index,
* if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel
* @param container Page or Panel to where a question is relocated.
* @param insertBefore Use it if you want to set the question to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element.
*/
Question.prototype.moveTo = function (container, insertBefore) {
if (insertBefore === void 0) { insertBefore = null; }
return this.moveToBase(this.parent, container, insertBefore);
};
Question.prototype.runConditions = function () {
if (this.data && !this.isLoadingFromJson && !this.isDesignMode) {
this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
this.locStrsChanged();
}
};
Question.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
if (this.survey && this.survey.isDesignMode && !this.isDesignMode) {
this.onVisibleChanged();
}
this.runConditions();
};
Question.prototype.getDataFilteredValues = function () {
return !!this.data ? this.data.getFilteredValues() : null;
};
Question.prototype.getDataFilteredProperties = function () {
return !!this.data ? this.data.getFilteredProperties() : null;
};
Object.defineProperty(Question.prototype, "parent", {
/**
* A parent element. It can be panel or page.
*/
get: function () {
return this.getPropertyValue("parent", null);
},
set: function (val) {
this.setPropertyValue("parent", val);
this.onParentChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.onParentChanged = function () { };
Object.defineProperty(Question.prototype, "hasTitle", {
/**
* Returns false if the question doesn't have a title property, for example: QuestionHtmlModel, or titleLocation property equals to "hidden"
* @see titleLocation
*/
get: function () {
return this.getTitleLocation() !== "hidden";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "titleLocation", {
/**
* Set this property different from "default" to set the specific question title location for this panel/page.
* @see SurveyModel.questionTitleLocation
*/
get: function () {
return this.getPropertyValue("titleLocation");
},
set: function (value) {
var isVisibilityChanged = this.titleLocation == "hidden" || value == "hidden";
this.setPropertyValue("titleLocation", value.toLowerCase());
if (isVisibilityChanged && this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
/**
* Return the title location based on question titleLocation property and QuestionTitleLocation of it's parents
* @see titleLocation
* @see PanelModelBase.QuestionTitleLocation
* @see SurveyModel.QuestionTitleLocation
*/
Question.prototype.getTitleLocation = function () {
if (this.isFlowLayout)
return "hidden";
var location = this.getTitleLocationCore();
if (location === "left" && !this.isAllowTitleLeft)
location = "top";
return location;
};
Question.prototype.getTitleLocationCore = function () {
if (this.titleLocation !== "default")
return this.titleLocation;
if (!!this.parent)
return this.parent.getQuestionTitleLocation();
if (!!this.survey)
return this.survey.questionTitleLocation;
return "top";
};
Object.defineProperty(Question.prototype, "hasTitleOnLeft", {
get: function () {
return this.hasTitle && this.getTitleLocation() === "left";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasTitleOnTop", {
get: function () {
return this.hasTitle && this.getTitleLocation() === "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasTitleOnBottom", {
get: function () {
return this.hasTitle && this.getTitleLocation() === "bottom";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasTitleOnLeftTop", {
get: function () {
if (!this.hasTitle)
return false;
var location = this.getTitleLocation();
return location === "left" || location === "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "errorLocation", {
get: function () {
return this.survey ? this.survey.questionErrorLocation : "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasInput", {
/**
* Returns false if the question doesn't have an input element, for example: QuestionHtmlModel
*/
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "inputId", {
get: function () {
return this.id + "i";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "title", {
/**
* Question title. Use survey questionTitleTemplate property to change the title question is rendered. If it is empty, then question name property is used.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
return this.getLocalizableStringText("title", this.name);
},
set: function (val) {
this.setLocalizableStringText("title", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locTitle", {
get: function () {
return this.getLocalizableString("title");
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "description", {
/**
* Question description. It renders under question title by using smaller font. Unlike the title, description can be empty.
* @see title
*/
get: function () {
return this.getLocalizableStringText("description");
},
set: function (val) {
this.setLocalizableStringText("description", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locDescription", {
get: function () {
return this.getLocalizableString("description");
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "descriptionLocation", {
/**
* Question description location. By default, value is "default" and it depends on survey questionDescriptionLocation property
* You may change it to "underInput" to render it under question input or "underTitle" to rendered it under title.
* @see description
* @see Survey.questionDescriptionLocation
*/
get: function () {
return this.getPropertyValue("descriptionLocation");
},
set: function (val) {
this.setPropertyValue("descriptionLocation", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasDescriptionUnderTitle", {
get: function () {
return this.getDescriptionLocation() == "underTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasDescriptionUnderInput", {
get: function () {
return this.getDescriptionLocation() == "underInput";
},
enumerable: true,
configurable: true
});
Question.prototype.getDescriptionLocation = function () {
if (this.descriptionLocation !== "default")
return this.descriptionLocation;
return !!this.survey
? this.survey.questionDescriptionLocation
: "underTitle";
};
Object.defineProperty(Question.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
*/
get: function () {
return this.getLocalizableStringText("requiredErrorText");
},
set: function (val) {
this.setLocalizableStringText("requiredErrorText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locRequiredErrorText", {
get: function () {
return this.getLocalizableString("requiredErrorText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "commentText", {
/**
* Use it to get or set the comment value.
*/
get: function () {
return this.getLocalizableStringText("commentText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"));
},
set: function (val) {
this.setLocalizableStringText("commentText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locCommentText", {
get: function () {
return this.getLocalizableString("commentText");
},
enumerable: true,
configurable: true
});
/**
* Returns a copy of question errors survey. For some questions like matrix and panel dynamic it includes the errors of nested questions.
*/
Question.prototype.getAllErrors = function () {
return this.errors.slice();
};
Object.defineProperty(Question.prototype, "customWidget", {
/**
* The link to the custom widget.
*/
get: function () {
if (!this.isCustomWidgetRequested && !this.customWidgetValue) {
this.isCustomWidgetRequested = true;
this.updateCustomWidget();
}
return this.customWidgetValue;
},
enumerable: true,
configurable: true
});
Question.prototype.updateCustomWidget = function () {
this.customWidgetValue = __WEBPACK_IMPORTED_MODULE_10__questionCustomWidgets__["b" /* CustomWidgetCollection */].Instance.getCustomWidget(this);
};
Object.defineProperty(Question.prototype, "processedTitle", {
/**
* Returns the rendred question title.
*/
get: function () {
var res = this.locProcessedTitle.textOrHtml;
return res ? res : this.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "fullTitle", {
/**
* Returns the title after processing the question template.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
return this.locTitle.renderedHtml;
/*
var res = this.calcFullTitle();
if (!this.survey) return res;
return this.survey.getUpdatedQuestionTitle(this, res);
*/
},
enumerable: true,
configurable: true
});
Question.prototype.getQuestionTitleTemplate = function () {
if (this.questionTitleTemplateCallback)
return this.questionTitleTemplateCallback();
return !!this.survey ? this.survey.getQuestionTitleTemplate() : null;
};
Question.prototype.calcFullTitle = function (text) {
var titleTemplate = this.getQuestionTitleTemplate();
if (titleTemplate) {
if (!this.textPreProcessor) {
var self = this;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_7__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
}
return this.textPreProcessor.process(titleTemplate, this.useDisplayValuesInTitle);
}
if (!text) {
text = this.name;
}
return text;
};
Object.defineProperty(Question.prototype, "startWithNewLine", {
/**
* The Question renders on the new line if the property is true. If the property is false, the question tries to render on the same line/row with a previous question/panel.
*/
get: function () {
return this.getPropertyValue("startWithNewLine", true);
},
set: function (val) {
if (this.startWithNewLine == val)
return;
this.setPropertyValue("startWithNewLine", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "cssClasses", {
/**
* Returns all css classes that used for rendering the question. You may use survey.updateQuestionCssClasses event to override css classes for a question.
* @see SurveyModel.updateQuestionCssClasses
*/
get: function () {
var css = this.css;
var classes = { error: {} };
this.copyCssClasses(classes, css.question);
this.copyCssClasses(classes.error, css.error);
this.updateCssClasses(classes, css);
if (this.survey) {
this.survey.updateQuestionCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "cssMainRoot", {
get: function () {
var classes = this.cssClasses;
if (!classes.mainRoot)
return {};
var res = this.isFlowLayout && !this.isDesignMode
? classes.flowRoot
: classes.mainRoot;
if (!this.isFlowLayout && this.getTitleLocation() == "left") {
res += " " + classes.titleLeftRoot;
}
if (this.errors.length > 0) {
res += " " + classes.hasError;
}
return res;
},
enumerable: true,
configurable: true
});
Question.prototype.getRootCss = function (classes) {
return !!classes.question ? classes.question.root : "";
};
Question.prototype.updateCssClasses = function (res, css) {
if (!css.question)
return;
if (this.isRequired) {
if (!!css.question.required) {
res.root = (res.root ? res.root + " " : "") + objCss;
}
if (css.question.titleRequired) {
res.title += " " + css.question.titleRequired;
}
}
var objCss = css[this.getType()];
if (objCss === undefined || objCss === null)
return;
if (typeof objCss === "string" || objCss instanceof String) {
res.root = (res.root ? res.root + " " : "") + objCss;
}
else {
for (var key in objCss) {
res[key] = objCss[key];
}
}
};
Object.defineProperty(Question.prototype, "css", {
get: function () {
return !!this.survey ? this.survey.getCss() : {};
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "width", {
/**
* Use it to set the specific width to the question like css style (%, px, em etc).
*/
get: function () {
return this.getPropertyValue("width", "");
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "renderWidth", {
/**
* The rendered width of the question.
*/
get: function () {
return this.getPropertyValue("renderWidth", "");
},
set: function (val) {
this.setPropertyValue("renderWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "indent", {
/**
* Set it different from 0 to increase the left padding.
*/
get: function () {
return this.getPropertyValue("indent", 0);
},
set: function (val) {
this.setPropertyValue("indent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "rightIndent", {
/**
* Set it different from 0 to increase the right padding.
*/
get: function () {
return this.getPropertyValue("rightIndent", 0);
},
set: function (val) {
this.setPropertyValue("rightIndent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "paddingLeft", {
get: function () {
return this.getPropertyValue("paddintLeft", "");
},
set: function (val) {
this.setPropertyValue("paddintLeft", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "paddingRight", {
get: function () {
return this.getPropertyValue("paddingRight", "");
},
set: function (val) {
this.setPropertyValue("paddingRight", val);
},
enumerable: true,
configurable: true
});
Question.prototype.onIndentChanged = function () {
this.paddingLeft = this.getIndentSize(this.indent);
this.paddingRight = this.getIndentSize(this.rightIndent);
};
Question.prototype.getIndentSize = function (indent) {
if (indent < 1)
return "";
return indent * this.cssClasses.indent + "px";
};
/**
* Move the focus to the input of this question.
* @param onError set this parameter to true, to focus the input with the first error, other wise the first input will be focused.
*/
Question.prototype.focus = function (onError) {
if (onError === void 0) { onError = false; }
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].ScrollElementToTop(this.id);
var id = !onError
? this.getFirstInputElementId()
: this.getFirstErrorInputElementId();
if (__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].FocusElement(id)) {
this.fireCallback(this.focusCallback);
}
};
Question.prototype.fireCallback = function (callback) {
if (callback)
callback();
};
Question.prototype.getOthersMaxLength = function () {
if (!this.survey)
return null;
return this.survey.maxOthersLength > 0 ? this.survey.maxOthersLength : null;
};
Question.prototype.onCreating = function () { };
Question.prototype.getFirstInputElementId = function () {
return this.inputId;
};
Question.prototype.getFirstErrorInputElementId = function () {
return this.getFirstInputElementId();
};
Question.prototype.getProcessedTextValue = function (textValue) {
var name = textValue.name.toLocaleLowerCase();
textValue.isExists =
Object.keys(Question.TextPreprocessorValuesMap).indexOf(name) !== -1 ||
this[textValue.name] !== undefined;
textValue.value = this[Question.TextPreprocessorValuesMap[name] || textValue.name];
};
Question.prototype.supportComment = function () {
return false;
};
Question.prototype.supportOther = function () {
return false;
};
Object.defineProperty(Question.prototype, "isRequired", {
/**
* Set this property to true, to make the question a required. If a user doesn't answer the question then a validation error will be generated.
*/
get: function () {
return this.getPropertyValue("isRequired", false);
},
set: function (val) {
if (this.isRequired == val)
return;
this.setPropertyValue("isRequired", val);
if (!this.isLoadingFromJson) {
this.locTitle.onChanged();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredIf", {
/**
* An expression that returns true or false. If it returns true the Question becomes required and an end-user has to answer it.
* If it returns false the Question then an end-user may not answer it the Question maybe empty.
* The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used.
* @see isRequired
*/
get: function () {
return this.getPropertyValue("requiredIf", "");
},
set: function (val) {
this.setPropertyValue("requiredIf", val);
this.runConditions();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasComment", {
/**
* Set it to true, to add a comment for the question.
*/
get: function () {
return this.getPropertyValue("hasComment", false);
},
set: function (val) {
if (!this.supportComment())
return;
this.setPropertyValue("hasComment", val);
if (this.hasComment)
this.hasOther = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "id", {
/**
* The unique identificator. It is generated automatically.
*/
get: function () {
return this.getPropertyValue("id");
},
set: function (val) {
this.setPropertyValue("id", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasOther", {
get: function () {
return this.getPropertyValue("hasOther", false);
},
set: function (val) {
if (!this.supportOther() || this.hasOther == val)
return;
this.setPropertyValue("hasOther", val);
if (this.hasOther)
this.hasComment = false;
this.hasOtherChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.hasOtherChanged = function () { };
Object.defineProperty(Question.prototype, "requireUpdateCommentValue", {
get: function () {
return this.hasComment || this.hasOther;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isReadOnly", {
/**
* Retuns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly.
* @see SurveyModel.model
* @see readOnly
*/
get: function () {
var isParentReadOnly = !!this.parent && this.parent.isReadOnly;
var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode;
return this.readOnly || isParentReadOnly || isSurveyReadOnly;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "enableIf", {
/**
* An expression that returns true or false. If it returns false the Question becomes read only and an end-user will not able to answer on the qustion. The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.
* @see readOnly
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("enableIf", "");
},
set: function (val) {
this.setPropertyValue("enableIf", val);
this.runConditions();
},
enumerable: true,
configurable: true
});
/**
* Run visibleIf and enableIf expressions. If visibleIf or/and enabledIf are not empty, then the results of performing the expression (true or false) set to the visible/readOnly properties.
* @param values Typically survey results
* @see visible
* @see visibleIf
* @see readOnly
* @see enableIf
*/
Question.prototype.runCondition = function (values, properties) {
if (this.isDesignMode)
return;
if (!properties)
properties = {};
properties["question"] = this;
if (!this.areInvisibleElementsShowing) {
this.runVisibleIfCondition(values, properties);
}
this.runEnableIfCondition(values, properties);
this.runRequiredIfCondition(values, properties);
};
Question.prototype.runVisibleIfCondition = function (values, properties) {
var _this = this;
if (!this.visibleIf)
return;
if (!this.conditionRunner)
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_9__conditions__["b" /* ConditionRunner */](this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.conditionRunner.onRunComplete = function (res) {
_this.visible = res;
};
this.conditionRunner.run(values, properties);
};
Question.prototype.runEnableIfCondition = function (values, properties) {
var _this = this;
if (!this.enableIf)
return;
if (!this.conditionEnabelRunner)
this.conditionEnabelRunner = new __WEBPACK_IMPORTED_MODULE_9__conditions__["b" /* ConditionRunner */](this.enableIf);
this.conditionEnabelRunner.expression = this.enableIf;
this.conditionEnabelRunner.onRunComplete = function (res) {
_this.readOnly = !res;
};
this.conditionEnabelRunner.run(values, properties);
};
Question.prototype.runRequiredIfCondition = function (values, properties) {
var _this = this;
if (!this.requiredIf)
return;
if (!this.conditionRequiredRunner)
this.conditionRequiredRunner = new __WEBPACK_IMPORTED_MODULE_9__conditions__["b" /* ConditionRunner */](this.requiredIf);
this.conditionRequiredRunner.expression = this.requiredIf;
this.conditionRequiredRunner.onRunComplete = function (res) {
_this.isRequired = res;
};
this.conditionRequiredRunner.run(values, properties);
};
Object.defineProperty(Question.prototype, "no", {
/**
* The property returns the question number. If question is invisible then it returns empty string.
* If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'.
* @see SurveyModel.questionStartIndex
*/
get: function () {
if (this.visibleIndex < 0)
return "";
var startIndex = 1;
var isNumeric = true;
var str = "";
if (this.survey && this.survey.questionStartIndex) {
str = this.survey.questionStartIndex;
if (parseInt(str))
startIndex = parseInt(str);
else if (str.length == 1)
isNumeric = false;
}
if (isNumeric)
return (this.visibleIndex + startIndex).toString();
return String.fromCharCode(str.charCodeAt(0) + this.visibleIndex);
},
enumerable: true,
configurable: true
});
Question.prototype.onSurveyLoad = function () {
this.fireCallback(this.surveyLoadCallback);
this.updateValueWithDefaults();
this.updateDisplayValue();
};
Question.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
this.initDataFromSurvey();
this.onSurveyValueChanged(this.value);
this.updateValueWithDefaults();
};
Question.prototype.initDataFromSurvey = function () {
if (!!this.data) {
this.updateValueFromSurvey(this.data.getValue(this.getValueName()));
this.initCommentFromSurvey();
}
};
Question.prototype.initCommentFromSurvey = function () {
if (!!this.data && this.requireUpdateCommentValue) {
this.updateCommentFromSurvey(this.data.getComment(this.getValueName()));
}
else {
this.updateCommentFromSurvey("");
}
};
Object.defineProperty(Question.prototype, "questionValue", {
get: function () {
return this.getPropertyValue("value");
},
set: function (val) {
this.setPropertyValue("value", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "questionComment", {
get: function () {
return this.getPropertyValue("comment");
},
set: function (val) {
this.setPropertyValue("comment", val);
this.fireCallback(this.commentChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "value", {
/**
* Get/Set the question value.
* @see SurveyMode.setValue
* @see SurveyMode.getValue
*/
get: function () {
return this.getValueCore();
},
set: function (newValue) {
this.setNewValue(newValue);
},
enumerable: true,
configurable: true
});
Question.prototype.clearValue = function () {
this.value = null;
this.comment = null;
};
Question.prototype.createValueCopy = function () {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.value);
};
Question.prototype.canClearValueAsInvisible = function () {
if (this.isVisible && this.isParentVisible)
return false;
if (!!this.page && this.page.isStarted)
return false;
if (!this.survey || !this.valueName)
return true;
return !this.survey.hasVisibleQuestionByValueName(this.valueName);
};
Object.defineProperty(Question.prototype, "isParentVisible", {
get: function () {
var parent = this.parent;
while (parent) {
if (!parent.isVisible)
return false;
parent = parent.parent;
}
return true;
},
enumerable: true,
configurable: true
});
Question.prototype.clearValueIfInvisible = function () {
if (this.canClearValueAsInvisible()) {
this.clearValue();
}
};
Object.defineProperty(Question.prototype, "displayValue", {
get: function () {
this.updateDisplayValue();
return this._displayValue;
},
enumerable: true,
configurable: true
});
Question.prototype.updateDisplayValue = function () {
if (this.isLoadingFromJson)
return;
this._displayValue = this.getDisplayValue(true);
};
/**
* Return the question value as a display text. For example, for dropdown, it would return the item text instead of item value.
* @param keysAsText Set this value to true, to return key (in matrices questions) as display text as well.
* @param value use this parameter, if you want to get display value for this value and not question.value. It is undefined by default.
*/
Question.prototype.getDisplayValue = function (keysAsText, value) {
if (value === void 0) { value = undefined; }
if (this.customWidget) {
var res = this.customWidget.getDisplayValue(this, value);
if (res)
return res;
}
value = value == undefined ? this.createValueCopy() : value;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value))
return "";
return this.getDisplayValueCore(keysAsText, value);
};
Question.prototype.getDisplayValueCore = function (keyAsText, value) {
return value;
};
Object.defineProperty(Question.prototype, "defaultValue", {
/**
* Set the default value to the question. It will be assign to the question on loading the survey from JSON or adding a question to the survey or on setting this property of the value is empty.
*/
get: function () {
return this.getPropertyValue("defaultValue");
},
set: function (val) {
this.setPropertyValue("defaultValue", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
/**
* Returns question answer data as a plain object: with question title, name, value and displayValue.
* For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows)
* set options.includeEmpty to false if you want to skip empty answers
*/
Question.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true
}; }
if (options.includeEmpty || !this.isEmpty()) {
var questionPlainData = {
name: this.name,
title: this.title,
value: this.value,
displayValue: this.displayValue,
isNode: false,
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
}
};
(options.calculations || []).forEach(function (calculation) {
questionPlainData[calculation.propertyName] = _this[calculation.propertyName];
});
return questionPlainData;
}
return undefined;
};
Object.defineProperty(Question.prototype, "correctAnswer", {
/**
* The correct answer on the question. Set this value if you are doing a quiz.
* @see SurveyModel.correctAnswers
* @see SurveyModel.inCorrectAnswers
*/
get: function () {
return this.getPropertyValue("correctAnswer");
},
set: function (val) {
this.setPropertyValue("correctAnswer", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "quizQuestionCount", {
get: function () {
if (this.isVisible &&
this.hasInput &&
!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.correctAnswer))
return this.getQuizQuestionCount();
return 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "correctAnswerCount", {
get: function () {
if (!this.isEmpty() && !this.isValueEmpty(this.correctAnswer))
return this.getCorrectAnswerCount();
return 0;
},
enumerable: true,
configurable: true
});
Question.prototype.getQuizQuestionCount = function () {
return 1;
};
Question.prototype.getCorrectAnswerCount = function () {
return this.isTwoValueEquals(this.value, this.correctAnswer, true) ? 1 : 0;
};
Question.prototype.isAnswerCorrect = function () {
return this.correctAnswerCount == this.quizQuestionCount;
};
Question.prototype.updateValueWithDefaults = function () {
if (this.isLoadingFromJson ||
(!this.isDesignMode && this.isDefaultValueEmpty()))
return;
if (!this.isDesignMode && !this.isEmpty())
return;
if (this.isEmpty() && this.isDefaultValueEmpty())
return;
this.setDefaultValue();
};
Question.prototype.getQuestionFromArray = function (name, index) {
return null;
};
Question.prototype.getDefaultValue = function () {
return this.defaultValue;
};
Question.prototype.isDefaultValueEmpty = function () {
return this.isValueEmpty(this.defaultValue);
};
Question.prototype.setDefaultValue = function () {
this.value = this.defaultValue;
};
Object.defineProperty(Question.prototype, "comment", {
/**
* The question comment value.
*/
get: function () {
return this.getComment();
},
set: function (newValue) {
if (!!newValue) {
newValue = newValue.toString().trim();
}
if (this.comment == newValue)
return;
this.setComment(newValue);
},
enumerable: true,
configurable: true
});
Question.prototype.getComment = function () {
return this.questionComment;
};
Question.prototype.setComment = function (newValue) {
this.setNewComment(newValue);
};
/**
* Returns true if the question value is empty
*/
Question.prototype.isEmpty = function () {
return this.isValueEmpty(this.value);
};
Object.defineProperty(Question.prototype, "isAnswered", {
get: function () {
return this.getPropertyValue("isAnswered");
},
set: function (val) {
this.setPropertyValue("isAnswered", val);
},
enumerable: true,
configurable: true
});
Question.prototype.updateIsAnswered = function () {
this.setPropertyValue("isAnswered", this.getIsAnswered());
};
Question.prototype.getIsAnswered = function () {
return !this.isEmpty();
};
Object.defineProperty(Question.prototype, "validators", {
/**
* The list of question validators.
*/
get: function () {
return this.getPropertyValue("validators");
},
set: function (val) {
this.setPropertyValue("validators", val);
},
enumerable: true,
configurable: true
});
Question.prototype.getValidators = function () {
return this.validators;
};
Question.prototype.getSupportedValidators = function () {
var res = [];
this.addSupportedValidators(res);
return res;
};
Question.prototype.addSupportedValidators = function (supportedValidators) {
supportedValidators.push("expression");
};
Question.prototype.addConditionNames = function (names) {
names.push(this.name);
};
Question.prototype.addConditionObjectsByContext = function (objects, context) {
objects.push({
name: this.name,
text: this.processedTitle,
question: this
});
};
Question.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toJsonObject(this);
json["type"] = this.getType();
return json;
};
/**
* Returns true if there is a validation error(s) in the question.
* @param fireCallback set it to true to show an error in UI.
*/
Question.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var errors = this.checkForErrors();
if (fireCallback) {
if (!!this.survey) {
this.survey.beforeSettingQuestionErrors(this, errors);
}
this.errors = errors;
}
this.updateContainsErrors();
return errors.length > 0;
};
Object.defineProperty(Question.prototype, "currentErrorCount", {
/**
* Returns the validation errors count.
*/
get: function () {
return this.errors.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredText", {
/**
* Returns the char/string for a required question.
* @see SurveyModel.requiredText
*/
get: function () {
return this.survey != null && this.isRequired
? this.survey.requiredText
: "";
},
enumerable: true,
configurable: true
});
/**
* Add error into the question error list.
* @param error
*/
Question.prototype.addError = function (error) {
this.errors.push(error);
};
/**
* Remove a particular error from the question error list.
* @param error
*/
Question.prototype.removeError = function (error) {
var errors = this.errors;
var index = errors.indexOf(error);
if (index !== -1)
errors.splice(index, 1);
};
Question.prototype.checkForErrors = function () {
var qErrors = new Array();
if (this.isVisible && !this.isReadOnly) {
this.collectErrors(qErrors);
}
return qErrors;
};
Question.prototype.collectErrors = function (qErrors) {
this.onCheckForErrors(qErrors);
if (qErrors.length == 0) {
var errors = this.runValidators();
if (errors.length > 0) {
//validators may change the question value.
qErrors.length = 0;
for (var i = 0; i < errors.length; i++) {
qErrors.push(errors[i]);
}
}
}
if (this.survey && qErrors.length == 0) {
var error = this.fireSurveyValidation();
if (error) {
qErrors.push(error);
}
}
};
Question.prototype.fireSurveyValidation = function () {
if (this.validateValueCallback)
return this.validateValueCallback();
return this.survey ? this.survey.validateQuestion(this) : null;
};
Question.prototype.onCheckForErrors = function (errors) {
if (this.hasRequiredError()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* AnswerRequiredError */](this.requiredErrorText, this));
}
};
Question.prototype.hasRequiredError = function () {
return this.isRequired && this.isEmpty();
};
Object.defineProperty(Question.prototype, "isRunningValidators", {
get: function () {
return this.getIsRunningValidators();
},
enumerable: true,
configurable: true
});
Question.prototype.getIsRunningValidators = function () {
return this.isRunningValidatorsValue;
};
Question.prototype.runValidators = function () {
var _this = this;
if (!!this.validatorRunner) {
this.validatorRunner.onAsyncCompleted = null;
}
this.validatorRunner = new __WEBPACK_IMPORTED_MODULE_6__validator__["i" /* ValidatorRunner */]();
this.isRunningValidatorsValue = true;
this.validatorRunner.onAsyncCompleted = function (errors) {
_this.doOnAsyncCompleted(errors);
};
return this.validatorRunner.run(this);
};
Question.prototype.doOnAsyncCompleted = function (errors) {
for (var i = 0; i < errors.length; i++) {
this.errors.push(errors[i]);
}
this.isRunningValidatorsValue = false;
this.raiseOnCompletedAsyncValidators();
};
Question.prototype.raiseOnCompletedAsyncValidators = function () {
if (!!this.onCompletedAsyncValidators && !this.isRunningValidators) {
this.onCompletedAsyncValidators(this.getAllErrors().length > 0);
this.onCompletedAsyncValidators = null;
}
};
Question.prototype.setNewValue = function (newValue) {
this.setNewValueInData(newValue);
this.onValueChanged();
};
Question.prototype.isTextValue = function () {
return false;
};
Object.defineProperty(Question.prototype, "isSurveyInputTextUpdate", {
get: function () {
return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false;
},
enumerable: true,
configurable: true
});
Question.prototype.getDataLocNotification = function () {
if (this.locNotificationInData)
return this.locNotificationInData;
return this.isInputTextUpdate ? "text" : false;
};
Object.defineProperty(Question.prototype, "isInputTextUpdate", {
get: function () {
return this.isSurveyInputTextUpdate && this.isTextValue();
},
enumerable: true,
configurable: true
});
Question.prototype.setNewValueInData = function (newValue) {
newValue = this.valueToData(newValue);
if (!this.isValueChangedInSurvey) {
this.setValueCore(newValue);
}
};
Question.prototype.getValueCore = function () {
return this.questionValue;
};
Question.prototype.setValueCore = function (newValue) {
this.setQuestionValue(newValue);
if (this.data != null) {
this.data.setValue(this.getValueName(), newValue, this.getDataLocNotification());
}
};
Question.prototype.valueFromData = function (val) {
return val;
};
Question.prototype.valueToData = function (val) {
return val;
};
Question.prototype.onValueChanged = function () { };
Question.prototype.setNewComment = function (newValue) {
this.questionComment = newValue;
if (this.data != null) {
this.data.setComment(this.getValueName(), newValue, this.isSurveyInputTextUpdate ? "text" : false);
}
};
//IQuestion
Question.prototype.updateValueFromSurvey = function (newValue) {
newValue = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(newValue);
this.setQuestionValue(this.valueFromData(newValue));
};
Question.prototype.updateCommentFromSurvey = function (newValue) {
this.questionComment = newValue;
};
Question.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
this.questionValue = newValue;
this.fireCallback(this.valueChangedCallback);
if (updateIsAnswered)
this.updateIsAnswered();
};
Question.prototype.onSurveyValueChanged = function (newValue) {
if (this.isLoadingFromJson)
return;
this.updateDisplayValue();
};
Question.prototype.setVisibleIndex = function (val) {
if (!this.isVisible || !this.hasTitle) {
val = -1;
}
this.setPropertyValue("visibleIndex", val);
return val < 0 ? 0 : 1;
};
Question.prototype.removeElement = function (element) {
return false;
};
Question.prototype.supportGoNextPageAutomatic = function () {
return false;
};
/**
* Call this function to remove values from the current question, that end-user will not be able to enter.
* For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.
*/
Question.prototype.clearIncorrectValues = function () { };
/**
* Call this function to clear all errors in the question
*/
Question.prototype.clearErrors = function () {
this.errors = [];
};
Question.prototype.clearUnusedValues = function () { };
Question.prototype.onAnyValueChanged = function (name) { };
/**
* Returns the current survey locale
* @see SurveyModel.locale
*/
Question.prototype.getLocale = function () {
return this.survey
? this.survey.getLocale()
: this.locOwner
? this.locOwner.getLocale()
: "";
};
Question.prototype.getMarkdownHtml = function (text) {
return this.survey
? this.survey.getSurveyMarkdownHtml(this, text)
: this.locOwner
? this.locOwner.getMarkdownHtml(text)
: null;
};
Question.prototype.getProcessedText = function (text) {
if (this.textProcessor)
return this.textProcessor.processText(text, this.useDisplayValuesInTitle);
if (this.locOwner)
return this.locOwner.getProcessedText(text);
return text;
};
//ISurveyErrorOwner
Question.prototype.getErrorCustomText = function (text, error) {
if (!!this.survey)
return this.survey.getErrorCustomText(text, error);
return text;
};
//IValidatorOwner
Question.prototype.getValidatorTitle = function () {
return null;
};
Object.defineProperty(Question.prototype, "validatedValue", {
get: function () {
return this.value;
},
set: function (val) {
this.value = val;
},
enumerable: true,
configurable: true
});
Question.prototype.getAllValues = function () {
return !!this.data ? this.data.getAllValues() : null;
};
Question.TextPreprocessorValuesMap = {
title: "processedTitle",
require: "requiredText"
};
Question.questionCounter = 100;
return Question;
}(__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("question", [
"!name",
{ name: "visible:boolean", default: true },
{ name: "useDisplayValuesInTitle:boolean", default: true, layout: "row" },
"visibleIf:condition",
{ name: "width" },
{ name: "startWithNewLine:boolean", default: true, layout: "row" },
{ name: "indent:number", default: 0, choices: [0, 1, 2, 3], layout: "row" },
{
name: "page",
isSerializable: false,
choices: function (obj) {
var survey = obj ? obj.survey : null;
return survey
? survey.pages.map(function (p) {
return { value: p.name, text: p.title };
})
: [];
}
},
{ name: "title:text", serializationProperty: "locTitle", layout: "row" },
{
name: "description:text",
serializationProperty: "locDescription",
layout: "row"
},
{
name: "descriptionLocation",
default: "default",
choices: ["default", "underInput", "underTitle"]
},
"valueName",
"enableIf:condition",
"defaultValue:value",
"correctAnswer:value",
"isRequired:boolean",
"requiredIf:condition",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText"
},
"readOnly:boolean",
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
},
{
name: "titleLocation",
default: "default",
choices: ["default", "top", "bottom", "left", "hidden"],
layout: "row"
}
]);
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addAlterNativeClassName("question", "questionbase");
/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__conditionsParser__ = __webpack_require__(40);
/* unused harmony export ExpressionRunnerBase */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ConditionRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ExpressionRunner; });
var ExpressionRunnerBase = /** @class */ (function () {
function ExpressionRunnerBase(expression) {
this.processValue = new __WEBPACK_IMPORTED_MODULE_1__conditionProcessValue__["a" /* ProcessValue */]();
this.parser = new __WEBPACK_IMPORTED_MODULE_2__conditionsParser__["a" /* ConditionsParser */]();
this.isAsyncValue = false;
this.hasFunctionValue = false;
this.expression = expression;
}
Object.defineProperty(ExpressionRunnerBase.prototype, "expression", {
get: function () {
return this.expressionValue;
},
set: function (value) {
if (this.expression === value)
return;
this.expressionValue = value;
this.operand = this.parser.parseExpression(value);
this.hasFunctionValue = this.canRun() ? this.operand.hasFunction() : false;
this.isAsyncValue = this.hasFunction()
? this.operand.hasAsyncFunction()
: false;
},
enumerable: true,
configurable: true
});
ExpressionRunnerBase.prototype.getVariables = function () {
if (!this.operand)
return [];
var variables = [];
this.operand.setVariables(variables);
return variables;
};
ExpressionRunnerBase.prototype.hasFunction = function () {
return this.hasFunctionValue;
};
Object.defineProperty(ExpressionRunnerBase.prototype, "isAsync", {
get: function () {
return this.isAsyncValue;
},
enumerable: true,
configurable: true
});
ExpressionRunnerBase.prototype.canRun = function () {
return !!this.operand;
};
ExpressionRunnerBase.prototype.runCore = function (values, properties) {
var _this = this;
if (properties === void 0) { properties = null; }
if (!this.operand)
return null;
this.processValue.values = values;
this.processValue.properties = properties;
if (!this.isAsync)
return this.runValues();
this.asyncFuncList = [];
this.operand.addToAsyncList(this.asyncFuncList);
for (var i = 0; i < this.asyncFuncList.length; i++) {
this.asyncFuncList[i].onAsyncReady = function () {
_this.doAsyncFunctionReady();
};
}
for (var i = 0; i < this.asyncFuncList.length; i++) {
this.asyncFuncList[i].evaluateAsync(this.processValue);
}
return false;
};
ExpressionRunnerBase.prototype.doAsyncFunctionReady = function () {
for (var i = 0; i < this.asyncFuncList.length; i++) {
if (!this.asyncFuncList[i].isReady)
return;
}
this.runValues();
};
ExpressionRunnerBase.prototype.runValues = function () {
var res = this.operand.evaluate(this.processValue);
this.doOnComplete(res);
return res;
};
ExpressionRunnerBase.prototype.doOnComplete = function (res) { };
return ExpressionRunnerBase;
}());
var ConditionRunner = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ConditionRunner, _super);
function ConditionRunner() {
return _super !== null && _super.apply(this, arguments) || this;
}
ConditionRunner.prototype.run = function (values, properties) {
if (properties === void 0) { properties = null; }
return this.runCore(values, properties) == true;
};
ConditionRunner.prototype.doOnComplete = function (res) {
if (!!this.onRunComplete)
this.onRunComplete(res == true);
};
return ConditionRunner;
}(ExpressionRunnerBase));
var ExpressionRunner = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExpressionRunner, _super);
function ExpressionRunner() {
return _super !== null && _super.apply(this, arguments) || this;
}
ExpressionRunner.prototype.run = function (values, properties) {
if (properties === void 0) { properties = null; }
return this.runCore(values, properties);
};
ExpressionRunner.prototype.doOnComplete = function (res) {
if (!!this.onRunComplete)
this.onRunComplete(res);
};
return ExpressionRunner;
}(ExpressionRunnerBase));
/***/ }),
/* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return AnswerRequiredError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return OneAnswerRequiredError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return RequreNumericError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return ExceedSizeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return WebRequestError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return WebRequestEmptyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return OtherEmptyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return UploadingFileError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return RequiredInAllRowsError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return MinRowCountError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return KeyDuplicationError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CustomError; });
var AnswerRequiredError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(AnswerRequiredError, _super);
function AnswerRequiredError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
AnswerRequiredError.prototype.getErrorType = function () {
return "required";
};
AnswerRequiredError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredError");
};
return AnswerRequiredError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var OneAnswerRequiredError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(OneAnswerRequiredError, _super);
function OneAnswerRequiredError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
OneAnswerRequiredError.prototype.getErrorType = function () {
return "requireoneanswer";
};
OneAnswerRequiredError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredErrorInPanel");
};
return OneAnswerRequiredError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var RequreNumericError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(RequreNumericError, _super);
function RequreNumericError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
RequreNumericError.prototype.getErrorType = function () {
return "requirenumeric";
};
RequreNumericError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("numericError");
};
return RequreNumericError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var ExceedSizeError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExceedSizeError, _super);
function ExceedSizeError(maxSize, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, null, errorOwner) || this;
_this.maxSize = maxSize;
_this.locText.text = _this.getText();
return _this;
}
ExceedSizeError.prototype.getErrorType = function () {
return "exceedsize";
};
ExceedSizeError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */]
.getString("exceedMaxSize")["format"](this.getTextSize());
};
ExceedSizeError.prototype.getTextSize = function () {
var sizes = ["Bytes", "KB", "MB", "GB", "TB"];
var fixed = [0, 0, 2, 3, 3];
if (this.maxSize === 0) {
return "0 Byte";
}
var i = Math.floor(Math.log(this.maxSize) / Math.log(1024));
var value = this.maxSize / Math.pow(1024, i);
return value.toFixed(fixed[i]) + " " + sizes[i];
};
return ExceedSizeError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var WebRequestError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(WebRequestError, _super);
function WebRequestError(status, response, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, null, errorOwner) || this;
_this.status = status;
_this.response = response;
return _this;
}
WebRequestError.prototype.getErrorType = function () {
return "webrequest";
};
WebRequestError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */]
.getString("urlRequestError")["format"](this.status, this.response);
};
return WebRequestError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var WebRequestEmptyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(WebRequestEmptyError, _super);
function WebRequestEmptyError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
WebRequestEmptyError.prototype.getErrorType = function () {
return "webrequestempty";
};
WebRequestEmptyError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("urlGetChoicesError");
};
return WebRequestEmptyError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var OtherEmptyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(OtherEmptyError, _super);
function OtherEmptyError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
OtherEmptyError.prototype.getErrorType = function () {
return "otherempty";
};
OtherEmptyError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError");
};
return OtherEmptyError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var UploadingFileError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(UploadingFileError, _super);
function UploadingFileError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
UploadingFileError.prototype.getErrorType = function () {
return "uploadingfile";
};
UploadingFileError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile");
};
return UploadingFileError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var RequiredInAllRowsError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(RequiredInAllRowsError, _super);
function RequiredInAllRowsError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
RequiredInAllRowsError.prototype.getErrorType = function () {
return "requiredinallrowserror";
};
RequiredInAllRowsError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredInAllRowsError");
};
return RequiredInAllRowsError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var MinRowCountError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MinRowCountError, _super);
function MinRowCountError(minRowCount, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, null, errorOwner) || this;
_this.minRowCount = minRowCount;
return _this;
}
MinRowCountError.prototype.getErrorType = function () {
return "minrowcounterror";
};
MinRowCountError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */]
.getString("minRowCountError")["format"](this.minRowCount);
};
return MinRowCountError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var KeyDuplicationError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(KeyDuplicationError, _super);
function KeyDuplicationError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
KeyDuplicationError.prototype.getErrorType = function () {
return "keyduplicationerror";
};
KeyDuplicationError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError");
};
return KeyDuplicationError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var CustomError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(CustomError, _super);
function CustomError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
CustomError.prototype.getErrorType = function () {
return "custom";
};
return CustomError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ItemValue; });
/**
* Array of ItemValue is used in checkox, dropdown and radiogroup choices, matrix columns and rows.
* It has two main properties: value and text. If text is empty, value is used for displaying.
* The text property is localizable and support markdown.
*/
var ItemValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ItemValue, _super);
function ItemValue(value, text, typeName) {
if (text === void 0) { text = null; }
if (typeName === void 0) { typeName = "itemvalue"; }
var _this = _super.call(this) || this;
_this.typeName = typeName;
_this.visibleIfValue = "";
_this.isVisibleValue = true;
_this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](null, true);
_this.locTextValue.onGetTextCallback = function (txt) {
return txt ? txt : !_this.isValueItemEmpty ? _this.value.toString() : null;
};
if (text)
_this.locText.text = text;
if (!!value && typeof value === "object") {
_this.setData(value);
}
else {
_this.value = value;
}
_this.onCreating();
return _this;
}
Object.defineProperty(ItemValue, "Separator", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator = val;
},
enumerable: true,
configurable: true
});
ItemValue.createArray = function (locOwner) {
var items = [];
ItemValue.setupArray(items, locOwner);
return items;
};
ItemValue.setupArray = function (items, locOwner) {
items.push = function (value) {
var result = Array.prototype.push.call(this, value);
value.locOwner = locOwner;
return result;
};
items.unshift = function (value) {
var result = Array.prototype.unshift.call(this, value);
value.locOwner = locOwner;
return result;
};
items.splice = function (start, deleteCount) {
var _a;
var items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
var result = (_a = Array.prototype.splice).call.apply(_a, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["d" /* __spreadArrays */])([this,
start,
deleteCount], items));
if (!items)
items = [];
for (var i = 0; i < items.length; i++) {
items[i].locOwner = locOwner;
}
return result;
};
};
ItemValue.setData = function (items, values) {
items.length = 0;
for (var i = 0; i < values.length; i++) {
var value = values[i];
var item;
if (typeof value.getType === "function") {
item = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].createClass(value.getType());
}
else {
item = new ItemValue(null);
}
item.setData(value);
items.push(item);
}
};
ItemValue.getData = function (items) {
var result = new Array();
for (var i = 0; i < items.length; i++) {
result.push(items[i].getData());
}
return result;
};
ItemValue.getItemByValue = function (items, val) {
for (var i = 0; i < items.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(items[i].value, val))
return items[i];
}
return null;
};
ItemValue.getTextOrHtmlByValue = function (items, val) {
var item = ItemValue.getItemByValue(items, val);
return item !== null ? item.locText.textOrHtml : "";
};
ItemValue.locStrsChanged = function (items) {
for (var i = 0; i < items.length; i++) {
items[i].locText.strChanged();
}
};
ItemValue.runConditionsForItems = function (items, filteredItems, runner, values, properties, useItemExpression) {
if (useItemExpression === void 0) { useItemExpression = true; }
return ItemValue.runConditionsForItemsCore(items, filteredItems, runner, values, properties, true, useItemExpression);
};
ItemValue.runEnabledConditionsForItems = function (items, runner, values, properties) {
return ItemValue.runConditionsForItemsCore(items, null, runner, values, properties, false);
};
ItemValue.runConditionsForItemsCore = function (items, filteredItems, runner, values, properties, isVisible, useItemExpression) {
if (useItemExpression === void 0) { useItemExpression = true; }
if (!values) {
values = {};
}
var itemValue = values["item"];
var choiceValue = values["choice"];
var hasChanded = false;
for (var i = 0; i < items.length; i++) {
var item = items[i];
values["item"] = item.value;
values["choice"] = item.value;
var itemRunner = useItemExpression && !!item.getConditionRunner
? item.getConditionRunner(isVisible)
: false;
if (!itemRunner) {
itemRunner = runner;
}
var newValue = true;
if (itemRunner) {
newValue = itemRunner.run(values, properties);
}
if (!!filteredItems && newValue) {
filteredItems.push(item);
}
var oldValue = isVisible ? item.isVisible : item.isEnabled;
if (newValue != oldValue) {
hasChanded = true;
if (isVisible) {
if (!!item.setIsVisible)
item.setIsVisible(newValue);
}
else {
if (!!item.setIsEnabled)
item.setIsEnabled(newValue);
}
}
}
if (itemValue) {
values["item"] = itemValue;
}
else {
delete values["item"];
}
if (choiceValue) {
values["choice"] = choiceValue;
}
else {
delete values["choice"];
}
return hasChanded;
};
ItemValue.prototype.onCreating = function () { };
ItemValue.prototype.getType = function () {
return !!this.typeName ? this.typeName : "itemvalue";
};
Object.defineProperty(ItemValue.prototype, "locText", {
get: function () {
return this.locTextValue;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.setLocText = function (locText) {
this.locTextValue = locText;
};
Object.defineProperty(ItemValue.prototype, "locOwner", {
get: function () {
return this.locText.owner;
},
set: function (value) {
this.locText.owner = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "value", {
get: function () {
return this.itemValue;
},
set: function (newValue) {
this.itemValue = newValue;
if (!this.itemValue)
return;
var str = this.itemValue.toString();
var index = str.indexOf(__WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator);
if (index > -1) {
this.itemValue = str.slice(0, index);
this.text = str.slice(index + 1);
}
else if (!this.hasText) {
this.locText.onChanged();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "hasText", {
get: function () {
return this.locText.pureText ? true : false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "text", {
get: function () {
return this.locText.calculatedText; //TODO: it will be correct to use this.locText.text, however it would require a lot of rewritting in Creator
},
set: function (newText) {
var oldText = this.locText.text;
this.locText.text = newText;
this.propertyValueChanged("text", oldText, newText);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "calculatedText", {
get: function () {
return this.locText.calculatedText;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.getData = function () {
var json = this.toJSON();
if (!!json["value"] && !!json["value"]["pos"]) {
delete json["value"]["pos"];
}
if (Object.keys(json).length == 1 && !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(json["value"]))
return this.value;
return json;
};
ItemValue.prototype.toJSON = function () {
var res = {};
var properties = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].getProperties(this.getType());
if (!properties || properties.length == 0) {
properties = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].getProperties("itemvalue");
}
var jsoObj = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]();
for (var i = 0; i < properties.length; i++) {
jsoObj.valueToJson(this, res, properties[i]);
}
return res;
};
ItemValue.prototype.setData = function (value) {
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(value))
return;
if (typeof value.value !== "undefined") {
var json = value;
if (typeof value.toJSON === "function") {
json = value.toJSON();
}
new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toObject(json, this);
}
else {
this.value = value;
}
};
Object.defineProperty(ItemValue.prototype, "visibleIf", {
get: function () {
return this.visibleIfValue;
},
set: function (val) {
this.visibleIfValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "isVisible", {
get: function () {
return this.isVisibleValue;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.setIsVisible = function (val) {
this.isVisibleValue = val;
};
Object.defineProperty(ItemValue.prototype, "isEnabled", {
get: function () {
return this.getPropertyValue("isEnabled", true);
},
enumerable: true,
configurable: true
});
ItemValue.prototype.setIsEnabled = function (val) {
this.setPropertyValue("isEnabled", val);
};
ItemValue.prototype.addUsedLocales = function (locales) {
this.AddLocStringToUsedLocales(this.locTextValue, locales);
};
ItemValue.prototype.getConditionRunner = function (isVisible) {
if (isVisible)
return this.getVisibleConditionRunner();
return this.getEnableConditionRunner();
};
ItemValue.prototype.getVisibleConditionRunner = function () {
if (!this.visibleIf)
return null;
if (!this.visibleConditionRunner)
this.visibleConditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.visibleIf);
this.visibleConditionRunner.expression = this.visibleIf;
return this.visibleConditionRunner;
};
ItemValue.prototype.getEnableConditionRunner = function () {
if (!this.enableIf)
return null;
if (!this.enableConditionRunner)
this.enableConditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.enableIf);
this.enableConditionRunner.expression = this.enableIf;
return this.enableConditionRunner;
};
Object.defineProperty(ItemValue.prototype, "isValueItemEmpty", {
get: function () {
return !this.itemValue && this.itemValue !== 0 && this.itemValue !== false;
},
enumerable: true,
configurable: true
});
return ItemValue;
}(__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */].createItemValue = function (source, type) {
var item = null;
if (!!type) {
item = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.createClass(type, {});
}
else if (typeof source.getType === "function") {
item = new ItemValue(null, undefined, source.getType());
}
else {
item = new ItemValue(null);
}
item.setData(source);
return item;
};
__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */].itemValueLocStrChanged = function (arr) {
ItemValue.locStrsChanged(arr);
};
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["j" /* JsonObjectProperty */].getItemValuesDefaultValue = function (val) {
var res = new Array();
ItemValue.setData(res, val || []);
return res;
};
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("itemvalue", [
"value",
{
name: "text",
serializationProperty: "locText"
},
{ name: "visibleIf:condition", visible: false },
{ name: "enableIf:condition", visible: false }
], function (value) { return new ItemValue(value); });
/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return surveyCss; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultStandardCss; });
var surveyCss = {
currentType: "",
getCss: function () {
var loc = this.currentType ? this[this.currentType] : defaultStandardCss;
if (!loc)
loc = defaultStandardCss;
return loc;
}
};
var defaultStandardCss = {
root: "sv_main sv_default_css",
container: "sv_container",
header: "sv_header",
body: "sv_body",
bodyEmpty: "sv_body sv_body_empty",
footer: "sv_nav",
title: "",
description: "",
navigationButton: "",
completedPage: "sv_completed_page",
navigation: {
complete: "sv_complete_btn",
prev: "sv_prev_btn",
next: "sv_next_btn",
start: "sv_start_btn"
},
progress: "sv_progress",
progressBar: "sv_progress_bar",
progressTextInBar: "sv-hidden",
page: {
root: "sv_p_root",
title: "",
description: ""
},
// TODO: move to the page object
pageTitle: "sv_page_title",
pageDescription: "",
row: "sv_row",
question: {
mainRoot: "sv_q sv_qstn",
flowRoot: "sv_q_flow sv_qstn",
header: "",
headerLeft: "title-left",
content: "",
contentLeft: "content-left",
titleLeftRoot: "sv_qstn_left",
requiredText: "sv_q_required_text",
title: "sv_q_title",
number: "sv_q_num",
description: "sv_q_description",
comment: "",
required: "",
titleRequired: "",
hasError: "",
indent: 20,
footer: "sv_q_footer",
formGroup: "form-group"
},
panel: {
title: "sv_p_title",
titleExpandable: "sv_p_title_expandable",
icon: "sv_panel_icon",
iconExpanded: "sv_expanded",
description: "sv_p_description",
container: "sv_p_container"
},
error: {
root: "sv_q_erbox",
icon: "",
item: "",
locationTop: "sv_qstn_error_top",
locationBottom: "sv_qstn_error_bottom"
},
boolean: {
root: "sv_qcbc sv_qbln",
item: "sv-boolean",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled"
},
checkbox: {
root: "sv_qcbc sv_qcbx",
item: "sv_q_checkbox",
itemChecked: "checked",
itemInline: "sv_q_checkbox_inline",
label: "sv_q_checkbox_label",
labelChecked: "",
itemControl: "sv_q_checkbox_control_item",
itemDecorator: "sv-hidden",
controlLabel: "sv_q_checkbox_control_label",
materialDecorator: "checkbox-material",
other: "sv_q_other sv_q_checkbox_other",
column: "sv_q_select_column"
},
comment: "",
dropdown: {
root: "",
control: "sv_q_dropdown_control",
selectWrapper: "sv_select_wrapper",
other: "sv_q_dd_other"
},
html: { root: "" },
matrix: {
root: "sv_q_matrix",
label: "sv_q_m_label",
itemChecked: "checked",
itemDecorator: "sv-hidden",
cellText: "sv_q_m_cell_text",
cellTextSelected: "sv_q_m_cell_selected",
cellLabel: "sv_q_m_cell_label"
},
matrixdropdown: { root: "sv_q_matrix_dropdown" },
matrixdynamic: {
root: "sv_q_matrix_dynamic",
button: "sv_matrix_dynamic_button",
buttonAdd: "",
buttonRemove: "",
iconAdd: "",
iconRemove: ""
},
paneldynamic: {
root: "sv_panel_dynamic",
title: "sv_p_title",
button: "",
buttonAdd: "sv-paneldynamic__add-btn",
buttonRemove: "",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text"
},
multipletext: {
root: "sv_q_mt",
itemTitle: "sv_q_mt_title",
row: "sv_q_mt_row",
itemValue: "sv_q_mt_item_value sv_q_text_root"
},
radiogroup: {
root: "sv_qcbc",
item: "sv_q_radiogroup",
itemChecked: "checked",
itemInline: "sv_q_radiogroup_inline",
itemDecorator: "sv-hidden",
label: "sv_q_radiogroup_label",
labelChecked: "",
itemControl: "sv_q_radiogroup_control_item",
controlLabel: "",
materialDecorator: "circle",
other: "sv_q_other sv_q_radiogroup_other",
clearButton: "sv_q_radiogroup_clear",
column: "sv_q_select_column"
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
itemChecked: "checked",
label: "sv_q_imgsel_label",
itemControl: "sv_q_imgsel_control_item",
image: "sv_q_imgsel_image",
itemInline: "sv_q_imagepicker_inline",
itemText: "sv_q_imgsel_text",
clearButton: "sv_q_radiogroup_clear"
},
rating: {
root: "sv_q_rating",
item: "sv_q_rating_item",
selected: "active",
minText: "sv_q_rating_min_text",
itemText: "sv_q_rating_item_text",
maxText: "sv_q_rating_max_text",
disabled: ""
},
text: "sv_q_text_root",
expression: "",
file: {
root: "sv_q_file",
placeholderInput: "sv_q_file_placeholder",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button",
fileInput: "sv_q_file_input",
removeFile: "sv_q_file_remove",
removeFileSvg: "sv-hidden",
fileDecorator: "sv-hidden",
fileSignBottom: "sv-hidden",
removeButtonBottom: "sv-hidden"
},
saveData: {
root: "",
saving: "",
error: "",
success: "",
saveAgainButton: ""
},
window: {
root: "sv_window",
body: "sv_window_content",
header: {
root: "sv_window_title",
title: "",
button: "",
buttonExpanded: "",
buttonCollapsed: ""
}
}
};
surveyCss["standard"] = defaultStandardCss;
/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ProcessValue; });
var ProcessValue = /** @class */ (function () {
function ProcessValue() {
this.values = null;
this.properties = null;
}
ProcessValue.prototype.getFirstName = function (text, obj) {
if (obj === void 0) { obj = null; }
if (!text)
return text;
var res = "";
if (!!obj) {
res = this.getFirstPropertyName(text, obj);
if (!!res)
return res;
}
for (var i = 0; i < text.length; i++) {
var ch = text[i];
if (ch == "." || ch == "[")
break;
res += ch;
}
return res;
};
ProcessValue.prototype.hasValue = function (text, values) {
if (values === void 0) { values = null; }
if (!values)
values = this.values;
var res = this.getValueCore(text, values);
return res.hasValue;
};
ProcessValue.prototype.setValue = function (obj, text, value) {
if (!text)
return;
var nonNestedObj = this.getNonNestedObject(obj, text);
if (!nonNestedObj)
return;
obj = nonNestedObj.value;
text = nonNestedObj.text;
if (!!obj && !!text) {
obj[text] = value;
}
};
ProcessValue.prototype.getValue = function (text, values) {
if (values === void 0) { values = null; }
if (!values)
values = this.values;
var res = this.getValueCore(text, values);
return res.value;
};
ProcessValue.prototype.getValueCore = function (text, values) {
var res = { hasValue: false, value: null };
var curValue = values;
if (!curValue && curValue !== 0 && curValue !== false)
return res;
if (text &&
text.lastIndexOf(".length") > -1 &&
text.lastIndexOf(".length") === text.length - ".length".length) {
res.value = 0;
res.hasValue = true;
}
var nonNestedObj = this.getNonNestedObject(curValue, text);
if (!nonNestedObj)
return res;
res.value = !!nonNestedObj.text
? this.getObjectValue(nonNestedObj.value, nonNestedObj.text)
: nonNestedObj.value;
res.hasValue = !__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(res.value);
return res;
};
ProcessValue.prototype.getNonNestedObject = function (obj, text) {
var curName = this.getFirstPropertyName(text, obj);
while (text != curName && !!obj) {
var isArray = text[0] == "[";
if (!isArray) {
if (!curName && text == this.getFirstName(text))
return { value: obj, text: text };
obj = this.getObjectValue(obj, curName);
if (__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(obj))
return null;
text = text.substr(curName.length);
}
else {
var objInArray = this.getObjInArray(obj, text);
if (!objInArray)
return null;
obj = objInArray.value;
text = objInArray.text;
}
if (!!text && text[0] == ".") {
text = text.substr(1);
}
curName = this.getFirstPropertyName(text, obj);
}
return { value: obj, text: text };
};
ProcessValue.prototype.getObjInArray = function (curValue, text) {
if (!Array.isArray(curValue))
return null;
var index = 1;
var str = "";
while (index < text.length && text[index] != "]") {
str += text[index];
index++;
}
text = index < text.length ? text.substr(index + 1) : "";
index = this.getIntValue(str);
if (index < 0 || index >= curValue.length)
return null;
return { value: curValue[index], text: text };
};
ProcessValue.prototype.getFirstPropertyName = function (name, obj) {
if (!name)
return name;
if (obj.hasOwnProperty(name))
return name;
name = name.toLowerCase();
var A = name[0];
var a = A.toUpperCase();
for (var key in obj) {
var first = key[0];
if (first === a || first === A) {
var keyName = key.toLowerCase();
if (keyName == name)
return key;
if (name.length <= keyName.length)
continue;
var ch = name[keyName.length];
if (ch != "." && ch != "[")
continue;
if (keyName == name.substr(0, keyName.length))
return key;
}
}
return "";
};
ProcessValue.prototype.getObjectValue = function (obj, name) {
if (!name)
return null;
return obj[name];
};
ProcessValue.prototype.getIntValue = function (str) {
if (str == "0" || ((str | 0) > 0 && str % 1 == 0))
return Number(str);
return -1;
};
return ProcessValue;
}());
/***/ }),
/* 16 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return LocalizableString; });
/**
* The class represents the string that supports multi-languages and markdown.
* It uses in all objects where support for multi-languages and markdown is required.
*/
var LocalizableString = /** @class */ (function () {
function LocalizableString(owner, useMarkdown) {
if (useMarkdown === void 0) { useMarkdown = false; }
this.owner = owner;
this.useMarkdown = useMarkdown;
this.values = {};
this.htmlValues = {};
this.renderedText = null;
this.calculatedTextValue = null;
this.onGetTextCallback = null;
this.onCreating();
}
Object.defineProperty(LocalizableString, "defaultLocale", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "locale", {
get: function () {
return this.owner ? this.owner.getLocale() : "";
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.strChanged = function () {
if (this.renderedText === null)
return;
this.calculatedTextValue = this.calText();
if (this.renderedText !== this.calculatedTextValue) {
this.renderedText = null;
this.calculatedTextValue = null;
this.onChanged();
}
};
Object.defineProperty(LocalizableString.prototype, "text", {
get: function () {
return this.pureText;
},
set: function (value) {
this.setLocaleText(this.locale, value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "calculatedText", {
get: function () {
this.renderedText =
this.calculatedTextValue !== null
? this.calculatedTextValue
: this.calText();
this.calculatedTextValue = null;
return this.renderedText;
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.calText = function () {
var res = this.pureText;
if (res &&
this.owner &&
this.owner.getProcessedText &&
res.indexOf("{") > -1) {
res = this.owner.getProcessedText(res);
}
if (this.onGetTextCallback)
res = this.onGetTextCallback(res);
return res;
};
Object.defineProperty(LocalizableString.prototype, "pureText", {
get: function () {
var loc = this.locale;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
var res = this.getValue(loc);
if (!res && loc == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) {
res = this.getValue(__WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].defaultLocale);
}
if (!res && loc !== __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) {
res = this.getValue(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName);
}
if (!res)
res = "";
return res;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "hasHtml", {
get: function () {
return this.hasHtmlValue();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "html", {
get: function () {
if (!this.hasHtml)
return "";
return this.getHtmlValue();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "isEmpty", {
get: function () {
return this.getValuesKeys().length == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "textOrHtml", {
get: function () {
return this.hasHtml ? this.getHtmlValue() : this.calculatedText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "renderedHtml", {
get: function () {
return this.textOrHtml;
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.getLocaleText = function (loc) {
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
var res = this.getValue(loc);
return res ? res : "";
};
LocalizableString.prototype.setLocaleText = function (loc, value) {
if (value == this.getLocaleText(loc))
return;
if (value &&
loc &&
loc != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName &&
!this.getValue(loc) &&
value == this.getLocaleText(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName))
return;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
delete this.htmlValues[loc];
if (!value) {
if (this.getValue(loc))
this.deleteValue(loc);
}
else {
if (typeof value === "string") {
if (loc != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName &&
value == this.getLocaleText(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)) {
this.setLocaleText(loc, null);
}
else {
this.setValue(loc, value);
if (loc == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) {
this.deleteValuesEqualsToDefault(value);
}
}
}
}
this.strChanged();
};
LocalizableString.prototype.hasNonDefaultText = function () {
var keys = this.getValuesKeys();
if (keys.length == 0)
return false;
return keys.length > 1 || keys[0] != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
};
LocalizableString.prototype.getLocales = function () {
var keys = this.getValuesKeys();
if (keys.length == 0)
return [];
return keys;
};
LocalizableString.prototype.getJson = function () {
if (!!this.sharedData)
return this.getJson();
var keys = this.getValuesKeys();
if (keys.length == 0)
return null;
if (keys.length == 1 && keys[0] == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)
return this.values[keys[0]];
return this.values;
};
LocalizableString.prototype.setJson = function (value) {
if (!!this.sharedData) {
this.setJson(value);
return;
}
this.values = {};
this.htmlValues = {};
if (!value)
return;
if (typeof value === "string") {
this.setLocaleText(null, value);
}
else {
for (var key in value) {
this.setLocaleText(key, value[key]);
}
}
this.strChanged();
};
LocalizableString.prototype.equals = function (obj) {
if (!!this.sharedData)
return this.equals(obj);
if (!obj || !obj.values)
return false;
return __WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isTwoValueEquals(this.values, obj.values);
};
LocalizableString.prototype.onChanged = function () {
if (this.onStrChanged)
this.onStrChanged();
};
LocalizableString.prototype.onCreating = function () { };
LocalizableString.prototype.hasHtmlValue = function () {
if (!this.owner || !this.useMarkdown)
return false;
var renderedText = this.calculatedText;
if (!renderedText)
return false;
var loc = this.locale;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
this.htmlValues[loc] = this.owner.getMarkdownHtml(renderedText);
return this.htmlValues[loc] ? true : false;
};
LocalizableString.prototype.getHtmlValue = function () {
var loc = this.locale;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
return this.htmlValues[loc];
};
LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) {
var keys = this.getValuesKeys();
for (var i = 0; i < keys.length; i++) {
if (keys[i] == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)
continue;
if (this.getValue(keys[i]) == defaultValue) {
this.deleteValue(keys[i]);
}
}
};
LocalizableString.prototype.getValue = function (loc) {
if (!!this.sharedData)
return this.sharedData.getValue(loc);
return this.values[loc];
};
LocalizableString.prototype.setValue = function (loc, value) {
if (!!this.sharedData)
this.sharedData.setValue(loc, value);
else
this.values[loc] = value;
};
LocalizableString.prototype.deleteValue = function (loc) {
if (!!this.sharedData)
this.sharedData.deleteValue(loc);
else
delete this.values[loc];
};
LocalizableString.prototype.getValuesKeys = function () {
if (!!this.sharedData)
return this.sharedData.getValuesKeys();
return Object.keys(this.values);
};
return LocalizableString;
}());
/***/ }),
/* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionComment; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCommentItem; });
var SurveyQuestionComment = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionComment, _super);
function SurveyQuestionComment(props) {
return _super.call(this, props) || this;
}
SurveyQuestionComment.prototype.render = function () {
var _this = this;
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var onBlur = !this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
var onInput = this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("textarea", { id: this.question.inputId, className: cssClasses.root, disabled: this.isDisplayMode, ref: function (tetxarea) { return (_this.control = tetxarea); }, maxLength: this.question.getMaxLength(), placeholder: this.question.placeHolder, onBlur: onBlur, onInput: onInput, onChange: this.updateValueOnEvent, cols: this.question.cols, rows: this.question.rows, "aria-label": this.question.locTitle.renderedHtml }));
};
return SurveyQuestionComment;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* SurveyQuestionUncontrolledElement */]));
var SurveyQuestionCommentItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCommentItem, _super);
function SurveyQuestionCommentItem() {
return _super !== null && _super.apply(this, arguments) || this;
}
SurveyQuestionCommentItem.prototype.render = function () {
var _this = this;
var question = this.props.question;
if (!question)
return null;
var className = this.props.otherCss || this.cssClasses.comment;
var handleOnChange = function (event) {
_this.setState({ comment: event.target.value });
};
var updateValueOnEvent = function (event) {
question.comment = event.target.value;
};
var onBlur = !question.isSurveyInputTextUpdate ? updateValueOnEvent : null;
var onInput = question.isSurveyInputTextUpdate ? updateValueOnEvent : null;
var comment = !!this.state && this.state.comment !== undefined
? this.state.comment
: question.comment || "";
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("textarea", { className: className, value: comment, disabled: this.isDisplayMode, maxLength: question.getOthersMaxLength(), placeholder: question.otherPlaceHolder, onChange: handleOnChange, onBlur: onBlur, onInput: onInput, "aria-label": question.locTitle.renderedHtml }));
};
return SurveyQuestionCommentItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("comment", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionComment, props);
});
/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactElementFactory; });
var ReactElementFactory = /** @class */ (function () {
function ReactElementFactory() {
this.creatorHash = {};
}
ReactElementFactory.prototype.registerElement = function (elementType, elementCreator) {
this.creatorHash[elementType] = elementCreator;
};
ReactElementFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ReactElementFactory.prototype.isElementRegisgered = function (elementType) {
return !!this.creatorHash[elementType];
};
ReactElementFactory.prototype.createElement = function (elementType, params) {
var creator = this.creatorHash[elementType];
if (creator == null)
return null;
return creator(params);
};
ReactElementFactory.Instance = new ReactElementFactory();
return ReactElementFactory;
}());
/***/ }),
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__custom_widget__ = __webpack_require__(128);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__element_factory__ = __webpack_require__(18);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyElementErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyQuestionAndErrorsCell; });
var SurveyQuestion = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestion, _super);
function SurveyQuestion(props) {
return _super.call(this, props) || this;
}
SurveyQuestion.renderQuestionBody = function (creator, question) {
if (!question.visible)
return null;
var customWidget = question.customWidget;
if (!customWidget) {
return creator.createQuestionElement(question);
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__custom_widget__["a" /* SurveyCustomWidget */], { creator: creator, question: question });
};
SurveyQuestion.prototype.getStateElement = function () {
return this.question;
};
Object.defineProperty(SurveyQuestion.prototype, "question", {
get: function () {
return this.props.element;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestion.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
SurveyQuestion.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (!!this.question) {
this.question["react"] = this;
}
this.doAfterRender();
};
SurveyQuestion.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (!!this.question) {
this.question["react"] = null;
}
var el = this.refs["root"];
if (!!el) {
el.removeAttribute("data-rendered");
}
};
SurveyQuestion.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
this.doAfterRender();
};
SurveyQuestion.prototype.doAfterRender = function () {
if (this.question) {
var el = this.refs["root"];
if (el &&
this.question.survey &&
el.getAttribute("data-rendered") !== "r") {
el.setAttribute("data-rendered", "r");
el.setAttribute("name", this.question.name);
this.question.survey.afterRenderQuestion(this.question, el);
}
}
};
SurveyQuestion.prototype.render = function () {
var question = this.question;
if (!question || !this.creator)
return null;
if (!question.isVisible)
return null;
var cssClasses = question.cssClasses;
var questionRender = this.renderQuestion();
var header = this.renderHeader(question);
var headerTop = question.hasTitleOnLeftTop ? header : null;
var headerBottom = question.hasTitleOnBottom ? header : null;
var descriptionUnderInput = question.hasDescriptionUnderInput
? this.renderDescription(cssClasses, true)
: null;
var contentClass = question.cssClasses.content +
(question.hasTitleOnLeft ? " " + question.cssClasses.contentLeft : "");
var questionRootClass = question.cssMainRoot;
if (question.cssClasses.small && !question.width) {
questionRootClass += " " + question.cssClasses.small;
}
var comment = question && question.hasComment ? this.renderComment(cssClasses) : null;
var errorsTop = this.creator.questionErrorLocation() === "top"
? this.renderErrors(cssClasses, "top")
: null;
var errorsBottom = this.creator.questionErrorLocation() === "bottom"
? this.renderErrors(cssClasses, "bottom")
: null;
var rootStyle = {};
if (question.renderWidth)
rootStyle["width"] = question.renderWidth;
if (!!question.paddingLeft)
rootStyle["paddingLeft"] = question.paddingLeft;
if (!!question.paddingRight)
rootStyle["paddingRight"] = question.paddingRight;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", id: question.id, className: questionRootClass, style: rootStyle },
headerTop,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: contentClass },
errorsTop,
questionRender,
comment,
errorsBottom,
descriptionUnderInput),
headerBottom));
};
SurveyQuestion.prototype.renderQuestion = function () {
return SurveyQuestion.renderQuestionBody(this.creator, this.question);
};
SurveyQuestion.prototype.renderTitle = function (cssClasses) {
var titleText = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.question.locTitle);
var number = null;
var delimiter = null;
var questionNumber = this.question["no"];
if (questionNumber) {
number = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.number, style: { position: "static" } }, questionNumber));
delimiter = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.number },
".",
"\u00A0");
}
var requredSpan = this.question.getQuestionTitleTemplate() ? null : (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.requiredText }, this.question.requiredText));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h5", { className: this.getTitleClass(this.question), title: this.question.locTitle.renderedHtml },
number,
delimiter,
titleText,
requredSpan));
};
SurveyQuestion.prototype.getTitleClass = function (element) {
var cssClasses = element.cssClasses;
var result = cssClasses.title;
if (element.containsErrors) {
result += " " + cssClasses.titleOnError;
}
else if (element.isAnswered) {
result += " " + cssClasses.titleOnAnswer;
}
return result;
};
SurveyQuestion.prototype.renderDescription = function (cssClasses, isUnderInput) {
if (isUnderInput === void 0) { isUnderInput = false; }
var descriptionText = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.question.locDescription);
var className = isUnderInput
? cssClasses.descriptionUnderInput
: cssClasses.description;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: className }, descriptionText);
};
SurveyQuestion.prototype.renderComment = function (cssClasses) {
// var commentText = SurveyElementBase.renderLocString(
// this.question.locCommentText
// );
var commentText = this.question.commentText;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.formGroup },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, commentText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, cssClasses: cssClasses, otherCss: cssClasses.other, isDisplayMode: this.question.isReadOnly })));
};
SurveyQuestion.prototype.renderHeader = function (question) {
var cssClasses = question.cssClasses;
var title = question.hasTitle ? this.renderTitle(cssClasses) : null;
var description = question.hasDescriptionUnderTitle
? this.renderDescription(cssClasses)
: null;
var headerClass = cssClasses.header;
if (question.hasTitleOnTop) {
headerClass += " " + cssClasses.headerTop;
}
if (question.hasTitleOnLeft) {
headerClass += " " + cssClasses.headerLeft;
}
if (question.hasTitleOnBottom) {
headerClass += " " + cssClasses.headerBottom;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: headerClass },
title,
description));
};
SurveyQuestion.prototype.renderErrors = function (cssClasses, location) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyElementErrors, { element: this.question, cssClasses: cssClasses, creator: this.creator, location: location }));
};
return SurveyQuestion;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */]));
__WEBPACK_IMPORTED_MODULE_6__element_factory__["a" /* ReactElementFactory */].Instance.registerElement("question", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestion, props);
});
var SurveyElementErrors = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyElementErrors, _super);
function SurveyElementErrors(props) {
var _this = _super.call(this, props) || this;
_this.state = _this.getState();
return _this;
}
Object.defineProperty(SurveyElementErrors.prototype, "element", {
get: function () {
var element = this.props.element;
return element instanceof __WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */] ? element : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElementErrors.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElementErrors.prototype, "location", {
get: function () {
return this.props.location;
},
enumerable: true,
configurable: true
});
SurveyElementErrors.prototype.getState = function (prevState) {
if (prevState === void 0) { prevState = null; }
return !prevState ? { error: 0 } : { error: prevState.error + 1 };
};
SurveyElementErrors.prototype.render = function () {
if (!this.element || this.element.errors.length == 0)
return null;
var errors = [];
for (var i = 0; i < this.element.errors.length; i++) {
var key = "error" + i;
errors.push(this.creator.renderError(key, this.element.errors[i], this.cssClasses));
}
var classes = this.cssClasses.error.root;
if (this.location === "top") {
classes += " " + this.cssClasses.error.locationTop;
}
else if (this.location === "bottom") {
classes += " " + this.cssClasses.error.locationBottom;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { role: "alert", className: classes }, errors));
};
return SurveyElementErrors;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["c" /* ReactSurveyElement */]));
var SurveyQuestionAndErrorsCell = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionAndErrorsCell, _super);
function SurveyQuestionAndErrorsCell(props) {
return _super.call(this, props) || this;
}
SurveyQuestionAndErrorsCell.prototype.getStateElement = function () {
return this.question;
};
Object.defineProperty(SurveyQuestionAndErrorsCell.prototype, "question", {
get: function () {
return this.getQuestion();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionAndErrorsCell.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
SurveyQuestionAndErrorsCell.prototype.getQuestion = function () {
return this.props.question;
};
SurveyQuestionAndErrorsCell.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.doAfterRender();
};
SurveyQuestionAndErrorsCell.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.question) {
var el = this.refs["cell"];
if (!!el) {
el.removeAttribute("data-rendered");
}
}
};
SurveyQuestionAndErrorsCell.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
this.doAfterRender();
};
SurveyQuestionAndErrorsCell.prototype.doAfterRender = function () { };
SurveyQuestionAndErrorsCell.prototype.getCellClass = function () {
return null;
};
SurveyQuestionAndErrorsCell.prototype.render = function () {
if (!this.question)
return null;
var errorsLocation = this.creator.questionErrorLocation();
var errors = this.question.isVisible ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyElementErrors, { element: this.question, cssClasses: this.cssClasses, creator: this.creator, location: errorsLocation })) : null;
var errorsTop = errorsLocation === "top" ? errors : null;
var errorsBottom = errorsLocation === "bottom" ? errors : null;
var renderedCell = this.renderQuestion();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { ref: "cell", className: this.getCellClass() + " " + this.cssClasses.cell, headers: this.question.isVisible && !!this["cell"]
? this["cell"].column.locTitle.renderedHtml
: "" },
errorsTop,
renderedCell,
errorsBottom));
};
SurveyQuestionAndErrorsCell.prototype.renderQuestion = function () {
return SurveyQuestion.renderQuestionBody(this.creator, this.question);
};
return SurveyQuestionAndErrorsCell;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["c" /* ReactSurveyElement */]));
/***/ }),
/* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__survey__ = __webpack_require__(31);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyWindow__ = __webpack_require__(51);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactSurveyModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ReactWindowModel; });
var ReactSurveyModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ReactSurveyModel, _super);
function ReactSurveyModel(jsonObj) {
if (jsonObj === void 0) { jsonObj = null; }
return _super.call(this, jsonObj) || this;
}
ReactSurveyModel.prototype.render = function () {
if (this.renderCallback) {
this.renderCallback();
}
};
ReactSurveyModel.prototype.mergeCss = function (src, dest) {
this.mergeValues(src, dest);
};
ReactSurveyModel.prototype.doAfterRenderSurvey = function (el) {
this.afterRenderSurvey(el);
};
ReactSurveyModel.prototype.onLoadSurveyFromService = function () {
if (!!this.currentPage) {
this.currentPage.setWasShown(false);
this.currentPage.onFirstRendering();
}
this.render();
};
ReactSurveyModel.prototype.onLoadingSurveyFromService = function () {
this.render();
};
ReactSurveyModel.prototype.setCompletedState = function (value, text) {
_super.prototype.setCompletedState.call(this, value, text);
this.render();
};
ReactSurveyModel.prototype.start = function () {
_super.prototype.start.call(this);
this.render();
};
return ReactSurveyModel;
}(__WEBPACK_IMPORTED_MODULE_1__survey__["a" /* SurveyModel */]));
var ReactWindowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ReactWindowModel, _super);
function ReactWindowModel(jsonObj, model) {
if (jsonObj === void 0) { jsonObj = null; }
if (model === void 0) { model = null; }
return _super.call(this, jsonObj, model) || this;
}
ReactWindowModel.prototype.createSurvey = function (jsonObj) {
return new ReactSurveyModel(jsonObj);
};
return ReactWindowModel;
}(__WEBPACK_IMPORTED_MODULE_2__surveyWindow__["a" /* SurveyWindowModel */]));
__WEBPACK_IMPORTED_MODULE_1__survey__["a" /* SurveyModel */].platform = "react";
/***/ }),
/* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__ = __webpack_require__(39);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionSelectBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxBase; });
/**
* It is a base class for checkbox, dropdown and radiogroup questions.
*/
var QuestionSelectBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionSelectBase, _super);
function QuestionSelectBase(name) {
var _this = _super.call(this, name) || this;
_this.filteredChoicesValue = null;
_this.otherItemValue = new __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */]("other");
_this.choicesFromUrl = null;
_this.cachedValueForUrlRequests = null;
_this.isChoicesLoaded = false;
_this.enableOnLoadingChoices = false;
_this.isSettingDefaultValue = false;
_this.isSettingComment = false;
_this.isFirstLoadChoicesFromUrl = true;
var self = _this;
_this.choices = _this.createItemValues("choices");
_this.registerFunctionOnPropertyValueChanged("choices", function () {
if (!self.filterItems()) {
self.onVisibleChoicesChanged();
}
});
_this.registerFunctionOnPropertyValueChanged("hideIfChoicesEmpty", function () {
self.updateVisibilityBasedOnChoices();
});
_this.createNewArray("visibleChoices");
_this.choicesByUrl = _this.createRestfull();
_this.choicesByUrl.owner = _this;
var locOtherText = _this.createLocalizableString("otherText", _this, true);
_this.createLocalizableString("otherErrorText", _this, true);
_this.otherItemValue.locOwner = _this;
_this.otherItemValue.setLocText(locOtherText);
locOtherText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText");
};
_this.choicesByUrl.beforeSendRequestCallback = function () {
self.onBeforeSendRequest();
};
_this.choicesByUrl.getResultCallback = function (items) {
self.onLoadChoicesFromUrl(items);
};
_this.choicesByUrl.updateResultCallback = function (items, serverResult) {
if (self.survey) {
return self.survey.updateChoicesFromServer(self, items, serverResult);
}
return items;
};
_this.createLocalizableString("otherPlaceHolder", _this);
return _this;
}
QuestionSelectBase.prototype.getType = function () {
return "selectbase";
};
QuestionSelectBase.prototype.isLayoutTypeSupported = function (layoutType) {
return true;
};
Object.defineProperty(QuestionSelectBase.prototype, "otherItem", {
/**
* Returns the other item. By using this property, you may change programmatically it's value and text.
* @see hasOther
*/
get: function () {
return this.otherItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "isOtherSelected", {
/**
* Returns true if a user select the 'other' item.
*/
get: function () {
return this.hasOther && this.getHasOther(this.renderedValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "choicesVisibleIf", {
/**
* An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.
* @see visibleIf
* @see choicesEnableIf
*/
get: function () {
return this.getPropertyValue("choicesVisibleIf", "");
},
set: function (val) {
this.setPropertyValue("choicesVisibleIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "choicesEnableIf", {
/**
* An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is enabled otherwise the item becomes disabled. Please use {item} to get the current item value in the expression.
* @see choicesVisibleIf
*/
get: function () {
return this.getPropertyValue("choicesEnableIf", "");
},
set: function (val) {
this.setPropertyValue("choicesEnableIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runItemsEnableCondition(values, properties);
this.runItemsCondition(values, properties);
};
QuestionSelectBase.prototype.setDefaultValue = function () {
this.isSettingDefaultValue =
!this.isValueEmpty(this.defaultValue) &&
this.hasUnknownValue(this.defaultValue);
_super.prototype.setDefaultValue.call(this);
this.isSettingDefaultValue = false;
};
QuestionSelectBase.prototype.filterItems = function () {
if (this.isLoadingFromJson ||
!this.data ||
this.areInvisibleElementsShowing)
return false;
var values = this.getDataFilteredValues();
var properties = this.getDataFilteredProperties();
this.runItemsEnableCondition(values, properties);
return this.runItemsCondition(values, properties);
};
QuestionSelectBase.prototype.runItemsCondition = function (values, properties) {
this.setConditionalChoicesRunner();
var hasChanges = this.runConditionsForItems(values, properties);
if (!!this.filteredChoicesValue &&
this.filteredChoicesValue.length === this.activeChoices.length) {
this.filteredChoicesValue = null;
}
if (hasChanges) {
if (!!this.filteredChoicesValue) {
this.clearIncorrectValues();
}
this.onVisibleChoicesChanged();
}
return hasChanges;
};
QuestionSelectBase.prototype.runItemsEnableCondition = function (values, properties) {
this.setConditionalEnableChoicesRunner();
var hasChanged = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].runEnabledConditionsForItems(this.activeChoices, this.conditionChoicesEnableIfRunner, values, properties);
if (hasChanged) {
this.clearDisabledValues();
}
};
QuestionSelectBase.prototype.setConditionalChoicesRunner = function () {
if (this.choicesVisibleIf) {
if (!this.conditionChoicesVisibleIfRunner) {
this.conditionChoicesVisibleIfRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.choicesVisibleIf);
}
this.conditionChoicesVisibleIfRunner.expression = this.choicesVisibleIf;
}
else {
this.conditionChoicesVisibleIfRunner = null;
}
};
QuestionSelectBase.prototype.setConditionalEnableChoicesRunner = function () {
if (this.choicesEnableIf) {
if (!this.conditionChoicesEnableIfRunner) {
this.conditionChoicesEnableIfRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.choicesEnableIf);
}
this.conditionChoicesEnableIfRunner.expression = this.choicesEnableIf;
}
else {
this.conditionChoicesEnableIfRunner = null;
}
};
QuestionSelectBase.prototype.runConditionsForItems = function (values, properties) {
this.filteredChoicesValue = [];
return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.activeChoices, this.filteredChoices, this.conditionChoicesVisibleIfRunner, values, properties);
};
QuestionSelectBase.prototype.getHasOther = function (val) {
return val === this.otherItem.value;
};
Object.defineProperty(QuestionSelectBase.prototype, "validatedValue", {
get: function () {
return this.rendredValueToDataCore(this.value);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.createRestfull = function () {
return new __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__["a" /* ChoicesRestfull */]();
};
QuestionSelectBase.prototype.getComment = function () {
if (!!this.commentValue)
return this.commentValue;
if (this.getStoreOthersAsComment())
return _super.prototype.getComment.call(this);
return this.commentValue;
};
QuestionSelectBase.prototype.setComment = function (newValue) {
if (this.hasComment || this.getStoreOthersAsComment())
_super.prototype.setComment.call(this, newValue);
else {
if (!this.isSettingComment && newValue != this.commentValue) {
this.isSettingComment = true;
this.commentValue = newValue;
if (this.isOtherSelected && !this.isRenderedValueSetting) {
this.value = this.rendredValueToData(this.renderedValue);
}
this.isSettingComment = false;
}
}
};
Object.defineProperty(QuestionSelectBase.prototype, "renderedValue", {
get: function () {
return this.getPropertyValue("renderedValue", null);
},
set: function (val) {
this.setPropertyValue("renderedValue", val);
this.value = this.rendredValueToData(val);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.setQuestionValue = function (newValue) {
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(this.value, newValue))
return;
_super.prototype.setQuestionValue.call(this, newValue);
this.setPropertyValue("renderedValue", this.rendredValueFromData(newValue));
if (this.hasComment)
return;
var isOtherSel = this.isOtherSelected;
if (isOtherSel && !!this.prevCommentValue) {
var oldComment = this.prevCommentValue;
this.prevCommentValue = "";
this.comment = oldComment;
}
if (!isOtherSel && !!this.comment) {
if (this.getStoreOthersAsComment()) {
this.prevCommentValue = this.comment;
}
this.comment = "";
}
};
QuestionSelectBase.prototype.setNewValue = function (newValue) {
newValue = this.valueFromData(newValue);
if ((!this.choicesByUrl.isRunning &&
!this.choicesByUrl.isWaitingForParameters) ||
!this.isValueEmpty(newValue)) {
this.cachedValueForUrlRequests = newValue;
}
_super.prototype.setNewValue.call(this, newValue);
};
QuestionSelectBase.prototype.valueFromData = function (val) {
var choiceitem = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.activeChoices, val);
if (!!choiceitem) {
return choiceitem.value;
}
return _super.prototype.valueFromData.call(this, val);
};
QuestionSelectBase.prototype.rendredValueFromData = function (val) {
if (this.getStoreOthersAsComment())
return val;
return this.renderedValueFromDataCore(val);
};
QuestionSelectBase.prototype.rendredValueToData = function (val) {
if (this.getStoreOthersAsComment())
return val;
return this.rendredValueToDataCore(val);
};
QuestionSelectBase.prototype.renderedValueFromDataCore = function (val) {
if (!this.hasUnknownValue(val, true))
return this.valueFromData(val);
this.comment = val;
return this.otherItem.value;
};
QuestionSelectBase.prototype.rendredValueToDataCore = function (val) {
if (val == this.otherItem.value && this.getComment()) {
val = this.getComment();
}
return val;
};
QuestionSelectBase.prototype.hasUnknownValue = function (val, includeOther) {
if (includeOther === void 0) { includeOther = false; }
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isValueEmpty(val))
return false;
if (includeOther && val == this.otherItem.value)
return false;
return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.filteredChoices, val) == null;
};
QuestionSelectBase.prototype.isValueDisabled = function (val) {
var itemValue = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.filteredChoices, val);
return !!itemValue && !itemValue.isEnabled;
};
Object.defineProperty(QuestionSelectBase.prototype, "choices", {
/**
* The list of items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown.
* @see choicesByUrl
*/
get: function () {
return this.getPropertyValue("choices");
},
set: function (newValue) {
this.setPropertyValue("choices", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "hideIfChoicesEmpty", {
get: function () {
return this.getPropertyValue("hideIfChoicesEmpty", false);
},
set: function (val) {
this.setPropertyValue("hideIfChoicesEmpty", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "keepIncorrectValues", {
get: function () {
return this.getPropertyValue("keepIncorrectValues", false);
},
set: function (val) {
this.setPropertyValue("keepIncorrectValues", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "storeOthersAsComment", {
/**
* Please use survey.storeOthersAsComment to change the behavior on the survey level. This property is depricated and invisible in Survey Creator.
* By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key.
* Possible values are: "default", true, false
* @see SurveyModel.storeOthersAsComment
*/
get: function () {
return this.getPropertyValue("storeOthersAsComment", "default");
},
set: function (val) {
this.setPropertyValue("storeOthersAsComment", val);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.hasOtherChanged = function () {
this.onVisibleChoicesChanged();
};
Object.defineProperty(QuestionSelectBase.prototype, "choicesOrder", {
/**
* Use this property to render items in a specific order: "asc", "desc", "random". Default value is "none".
*/
get: function () {
return this.getPropertyValue("choicesOrder");
},
set: function (val) {
val = val.toLowerCase();
if (val == this.choicesOrder)
return;
this.setPropertyValue("choicesOrder", val);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherText", {
/**
* Use this property to set the different text for other item.
*/
get: function () {
return this.getLocalizableStringText("otherText", __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"));
},
set: function (val) {
this.setLocalizableStringText("otherText", val);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherText", {
get: function () {
return this.getLocalizableString("otherText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherPlaceHolder", {
/**
* Use this property to set the place holder text for other or comment field .
*/
get: function () {
return this.getLocalizableStringText("otherPlaceHolder");
},
set: function (val) {
this.setLocalizableStringText("otherPlaceHolder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherPlaceHolder", {
get: function () {
return this.getLocalizableString("otherPlaceHolder");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherErrorText", {
/**
* The text that shows when the other item is choosed by the other input is empty.
*/
get: function () {
return this.getLocalizableStringText("otherErrorText", __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError"));
},
set: function (val) {
this.setLocalizableStringText("otherErrorText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherErrorText", {
get: function () {
return this.getLocalizableString("otherErrorText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "visibleChoices", {
/**
* The list of items as they will be rendered. If needed items are sorted and the other item is added.
* @see hasOther
* @see choicesOrder
* @see enabledChoices
*/
get: function () {
return this.getPropertyValue("visibleChoices", []);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "enabledChoices", {
/**
* The list of enabled items as they will be rendered. The disabled items are not included
* @see hasOther
* @see choicesOrder
* @see visibleChoices
*/
get: function () {
var res = [];
var items = this.visibleChoices;
for (var i = 0; i < items.length; i++) {
if (items[i].isEnabled)
res.push(items[i]);
}
return res;
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.updateVisibleChoices = function () {
if (this.isLoadingFromJson)
return;
var newValue = new Array();
var calcValue = this.calcVisibleChoices();
if (!calcValue)
calcValue = [];
for (var i = 0; i < calcValue.length; i++) {
newValue.push(calcValue[i]);
}
this.setPropertyValue("visibleChoices", newValue);
};
QuestionSelectBase.prototype.calcVisibleChoices = function () {
if (this.canUseFilteredChoices())
return this.filteredChoices;
var res = this.sortVisibleChoices(this.filteredChoices.slice());
this.addToVisibleChoices(res);
return res;
};
QuestionSelectBase.prototype.canUseFilteredChoices = function () {
return !this.hasOther && this.choicesOrder == "none";
};
QuestionSelectBase.prototype.addToVisibleChoices = function (items) {
if (this.hasOther) {
items.push(this.otherItem);
}
};
QuestionSelectBase.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
var values = Array.isArray(this.value) ? this.value : [this.value];
questionPlainData.isNode = true;
questionPlainData.data = values.map(function (dataValue, index) {
var choice = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(_this.visibleChoices, dataValue);
var choiceDataItem = {
name: index,
title: "Choice",
value: dataValue,
displayValue: _this.getChoicesDisplayValue(_this.visibleChoices, dataValue),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false
};
if (!!choice) {
(options.calculations || []).forEach(function (calculation) {
choiceDataItem[calculation.propertyName] =
choice[calculation.propertyName];
});
}
return choiceDataItem;
});
}
return questionPlainData;
};
/**
* Returns the text for the current value. If the value is null then returns empty string. If 'other' is selected then returns the text for other value.
*/
QuestionSelectBase.prototype.getDisplayValueCore = function (keysAsText, value) {
return this.getChoicesDisplayValue(this.visibleChoices, value);
};
QuestionSelectBase.prototype.getChoicesDisplayValue = function (items, val) {
if (val == this.otherItemValue.value)
return this.comment ? this.comment : this.locOtherText.textOrHtml;
var str = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(items, val);
return str == "" && val ? val : str;
};
Object.defineProperty(QuestionSelectBase.prototype, "filteredChoices", {
get: function () {
return this.filteredChoicesValue
? this.filteredChoicesValue
: this.activeChoices;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "activeChoices", {
get: function () {
return this.choicesFromUrl ? this.choicesFromUrl : this.getChoices();
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.getChoices = function () {
return this.choices;
};
QuestionSelectBase.prototype.supportComment = function () {
return true;
};
QuestionSelectBase.prototype.supportOther = function () {
return true;
};
QuestionSelectBase.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (!this.hasOther || !this.isOtherSelected || this.comment)
return;
errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["h" /* OtherEmptyError */](this.otherErrorText, this));
};
QuestionSelectBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.runChoicesByUrl();
};
QuestionSelectBase.prototype.getStoreOthersAsComment = function () {
if (this.isSettingDefaultValue)
return false;
return (this.storeOthersAsComment === true ||
(this.storeOthersAsComment == "default" &&
(this.survey != null ? this.survey.storeOthersAsComment : true)) ||
(!this.choicesByUrl.isEmpty && !this.choicesFromUrl));
};
QuestionSelectBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.runChoicesByUrl();
this.onVisibleChoicesChanged();
};
QuestionSelectBase.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
if (name != this.getValueName()) {
this.runChoicesByUrl();
}
};
QuestionSelectBase.prototype.runChoicesByUrl = function () {
if (!this.choicesByUrl || this.isLoadingFromJson)
return;
var processor = this.surveyImpl
? this.surveyImpl.getTextProcessor()
: this.textProcessor;
if (!processor)
processor = this.survey;
if (!processor)
return;
this.isReadyValue = this.isChoicesLoaded || this.choicesByUrl.isEmpty;
this.choicesByUrl.run(processor);
};
QuestionSelectBase.prototype.onBeforeSendRequest = function () {
if (__WEBPACK_IMPORTED_MODULE_9__settings__["a" /* settings */].disableOnGettingChoicesFromWeb === true && !this.isReadOnly) {
this.enableOnLoadingChoices = true;
this.readOnly = true;
}
};
QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) {
if (this.enableOnLoadingChoices) {
this.readOnly = false;
}
if (!this.isReadOnly) {
var errors = [];
if (this.choicesByUrl && this.choicesByUrl.error) {
errors.push(this.choicesByUrl.error);
}
this.errors = errors;
}
var newChoices = null;
var checkCachedValuesOnExisting = true;
if (this.isFirstLoadChoicesFromUrl &&
!this.cachedValueForUrlRequests &&
this.defaultValue) {
this.cachedValueForUrlRequests = this.defaultValue;
checkCachedValuesOnExisting = false;
}
if (this.isValueEmpty(this.cachedValueForUrlRequests)) {
this.cachedValueForUrlRequests = this.value;
}
this.isFirstLoadChoicesFromUrl = false;
var cachedValues = this.createCachedValueForUrlRequests(this.cachedValueForUrlRequests, checkCachedValuesOnExisting);
if (array && array.length > 0) {
newChoices = new Array();
__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].setData(newChoices, array);
}
this.choicesFromUrl = newChoices;
this.filterItems();
this.onVisibleChoicesChanged();
if (newChoices) {
var newValue = this.updateCachedValueForUrlRequests(cachedValues, newChoices);
if (!!newValue && !this.isReadOnly) {
this.locNotificationInData = true;
this.value = undefined;
this.locNotificationInData = false;
this.value = newValue.value;
}
}
this.choicesLoaded();
};
QuestionSelectBase.prototype.createCachedValueForUrlRequests = function (val, checkOnExisting) {
if (this.isValueEmpty(val))
return null;
if (Array.isArray(val)) {
var res = [];
for (var i = 0; i < val.length; i++) {
res.push(this.createCachedValueForUrlRequests(val[i], true));
}
return res;
}
var isExists = checkOnExisting ? !this.hasUnknownValue(val) : true;
return { value: val, isExists: isExists };
};
QuestionSelectBase.prototype.updateCachedValueForUrlRequests = function (val, newChoices) {
if (this.isValueEmpty(val))
return null;
if (Array.isArray(val)) {
var res = [];
for (var i = 0; i < val.length; i++) {
var updatedValue = this.updateCachedValueForUrlRequests(val[i], newChoices);
if (updatedValue && !this.isValueEmpty(updatedValue.value)) {
var newValue = updatedValue.value;
var item = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(newChoices, updatedValue.value);
if (!!item) {
newValue = item.value;
}
res.push(newValue);
}
}
return { value: res };
}
var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value;
var item = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(newChoices, value);
if (!!item) {
value = item.value;
}
return { value: value };
};
QuestionSelectBase.prototype.onVisibleChoicesChanged = function () {
if (this.isLoadingFromJson)
return;
this.updateVisibleChoices();
this.updateVisibilityBasedOnChoices();
if (!!this.visibleChoicesChangedCallback)
this.visibleChoicesChangedCallback();
};
QuestionSelectBase.prototype.updateVisibilityBasedOnChoices = function () {
if (this.hideIfChoicesEmpty) {
this.visible = !this.filteredChoices || this.filteredChoices.length > 0;
}
};
QuestionSelectBase.prototype.sortVisibleChoices = function (array) {
var order = this.choicesOrder.toLowerCase();
if (order == "asc")
return this.sortArray(array, 1);
if (order == "desc")
return this.sortArray(array, -1);
if (order == "random")
return this.randomizeArray(array);
return array;
};
QuestionSelectBase.prototype.sortArray = function (array, mult) {
return array.sort(function (a, b) {
if (a.calculatedText < b.calculatedText)
return -1 * mult;
if (a.calculatedText > b.calculatedText)
return 1 * mult;
return 0;
});
};
QuestionSelectBase.prototype.randomizeArray = function (array) {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].randomizeArray(array);
};
QuestionSelectBase.prototype.clearIncorrectValues = function () {
if (this.keepIncorrectValues)
return;
if (!!this.survey &&
this.survey.questionCountByValueName(this.getValueName()) > 1)
return;
if (this.clearIncorrectValuesCallback) {
this.clearIncorrectValuesCallback();
}
else {
this.clearIncorrectValuesCore();
}
};
QuestionSelectBase.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
this.clearIncorrectValues();
};
QuestionSelectBase.prototype.clearDisabledValues = function () {
if (!this.survey || !this.survey.clearValueOnDisableItems)
return;
this.clearDisabledValuesCore();
};
QuestionSelectBase.prototype.clearIncorrectValuesCore = function () {
var val = this.value;
if (this.canClearValueAnUnknow(val)) {
this.clearValue();
}
};
QuestionSelectBase.prototype.canClearValueAnUnknow = function (val) {
if (!this.getStoreOthersAsComment() && this.isOtherSelected)
return false;
return this.hasUnknownValue(val, true);
};
QuestionSelectBase.prototype.clearDisabledValuesCore = function () {
if (this.isValueDisabled(this.value)) {
this.clearValue();
}
};
QuestionSelectBase.prototype.clearUnusedValues = function () {
_super.prototype.clearUnusedValues.call(this);
if (!this.isOtherSelected && !this.hasComment) {
this.comment = "";
}
};
QuestionSelectBase.prototype.getColumnClass = function () {
var columnClass = this.cssClasses.column;
if (this.hasColumns) {
columnClass += " sv-q-column-" + this.colCount;
}
return columnClass;
};
QuestionSelectBase.prototype.getLabelClass = function (isChecked) {
var labelClass = this.cssClasses.label;
if (isChecked) {
labelClass += " " + this.cssClasses.labelChecked;
}
return labelClass;
};
QuestionSelectBase.prototype.getControlLabelClass = function (isChecked) {
var controlLabelClass = this.cssClasses.controlLabel;
if (isChecked) {
controlLabelClass += " " + this.cssClasses.controlLabelChecked;
}
return controlLabelClass;
};
Object.defineProperty(QuestionSelectBase.prototype, "columns", {
get: function () {
var columns = [];
var colCount = this.colCount;
if (this.hasColumns && this.visibleChoices.length > 0) {
for (var i = 0; i < colCount; i++) {
var column = [];
for (var j = i; j < this.visibleChoices.length; j += colCount) {
column.push(this.visibleChoices[j]);
}
columns.push(column);
}
}
return columns;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "hasColumns", {
get: function () {
return this.colCount > 1;
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.choicesLoaded = function () {
this.isChoicesLoaded = true;
var oldIsReady = this.isReadyValue;
this.isReadyValue = true;
this.onReadyChanged &&
this.onReadyChanged.fire(this, {
question: this,
isReady: true,
olsIsReady: oldIsReady
});
};
return QuestionSelectBase;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
/**
* A base class for checkbox and radiogroup questions. It introduced a colCount property.
*/
var QuestionCheckboxBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCheckboxBase, _super);
function QuestionCheckboxBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
Object.defineProperty(QuestionCheckboxBase.prototype, "colCount", {
/**
* The number of columns for radiogroup and checkbox questions. Items are rendred in one line if the value is 0.
*/
get: function () {
return this.getPropertyValue("colCount", this.isFlowLayout ? 0 : 1);
},
set: function (value) {
if (value < 0 || value > 5 || this.isFlowLayout)
return;
this.setPropertyValue("colCount", value);
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionCheckboxBase.prototype.onParentChanged = function () {
_super.prototype.onParentChanged.call(this);
if (this.isFlowLayout) {
this.setPropertyValue("colCount", null);
}
};
return QuestionCheckboxBase;
}(QuestionSelectBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("selectbase", [
{ name: "hasComment:boolean", layout: "row" },
{
name: "commentText",
serializationProperty: "locCommentText",
layout: "row"
},
"hasOther:boolean",
{ name: "otherPlaceHolder", serializationProperty: "locOtherPlaceHolder" },
{
name: "choices:itemvalue[]",
baseValue: function () {
return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item");
}
},
{
name: "choicesOrder",
default: "none",
choices: ["none", "asc", "desc", "random"]
},
{
name: "choicesByUrl:restfull",
className: "ChoicesRestfull",
onGetValue: function (obj) {
return obj.choicesByUrl.getData();
},
onSetValue: function (obj, value) {
obj.choicesByUrl.setData(value);
}
},
"hideIfChoicesEmpty:boolean",
"choicesVisibleIf:condition",
"choicesEnableIf:condition",
{ name: "otherText", serializationProperty: "locOtherText" },
{ name: "otherErrorText", serializationProperty: "locOtherErrorText" },
{
name: "storeOthersAsComment",
default: "default",
choices: ["default", true, false],
visible: false
}
], null, "question");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("checkboxbase", [
{
name: "colCount:number",
default: 1,
choices: [0, 1, 2, 3, 4, 5],
layout: "row"
}
], null, "selectbase");
/***/ }),
/* 22 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4);
/* unused harmony export TextPreProcessorItem */
/* unused harmony export TextPreProcessorValue */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TextPreProcessor; });
var TextPreProcessorItem = /** @class */ (function () {
function TextPreProcessorItem() {
}
return TextPreProcessorItem;
}());
var TextPreProcessorValue = /** @class */ (function () {
function TextPreProcessorValue(name, returnDisplayValue) {
this.name = name;
this.returnDisplayValue = returnDisplayValue;
this.isExists = false;
this.canProcess = true;
}
return TextPreProcessorValue;
}());
var TextPreProcessor = /** @class */ (function () {
function TextPreProcessor() {
}
TextPreProcessor.prototype.process = function (text, returnDisplayValue, doEncoding) {
if (returnDisplayValue === void 0) { returnDisplayValue = false; }
if (doEncoding === void 0) { doEncoding = false; }
this.hasAllValuesOnLastRunValue = true;
if (!text)
return text;
if (!this.onProcess)
return text;
var items = this.getItems(text);
for (var i = items.length - 1; i >= 0; i--) {
var item = items[i];
var name = this.getName(text.substring(item.start + 1, item.end));
if (!name)
continue;
var textValue = new TextPreProcessorValue(name, returnDisplayValue);
this.onProcess(textValue);
if (!textValue.isExists) {
if (textValue.canProcess) {
this.hasAllValuesOnLastRunValue = false;
}
continue;
}
if (__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(textValue.value)) {
this.hasAllValuesOnLastRunValue = false;
}
var replacedValue = !__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(textValue.value)
? textValue.value
: "";
if (doEncoding) {
replacedValue = encodeURIComponent(replacedValue);
}
text =
text.substr(0, item.start) + replacedValue + text.substr(item.end + 1);
}
return text;
};
Object.defineProperty(TextPreProcessor.prototype, "hasAllValuesOnLastRun", {
get: function () {
return !!this.hasAllValuesOnLastRunValue;
},
enumerable: true,
configurable: true
});
TextPreProcessor.prototype.getItems = function (text) {
var items = [];
var length = text.length;
var start = -1;
var ch = "";
for (var i = 0; i < length; i++) {
ch = text[i];
if (ch == "{")
start = i;
if (ch == "}") {
if (start > -1) {
var item = new TextPreProcessorItem();
item.start = start;
item.end = i;
items.push(item);
}
start = -1;
}
}
return items;
};
TextPreProcessor.prototype.getName = function (name) {
if (!name)
return;
return name.trim();
};
return TextPreProcessor;
}());
/***/ }),
/* 23 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return DragDropInfo; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return QuestionRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return PanelModelBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return PanelModel; });
var DragDropInfo = /** @class */ (function () {
function DragDropInfo(source, target, nestedPanelDepth) {
if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; }
this.source = source;
this.target = target;
this.nestedPanelDepth = nestedPanelDepth;
}
return DragDropInfo;
}());
var QuestionRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionRowModel, _super);
function QuestionRowModel(panel) {
var _this = _super.call(this) || this;
_this.panel = panel;
_this.visible = panel.areInvisibleElementsShowing;
_this.createNewArray("elements");
return _this;
}
Object.defineProperty(QuestionRowModel.prototype, "elements", {
get: function () {
return this.getPropertyValue("elements");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRowModel.prototype, "visible", {
get: function () {
return this.getPropertyValue("visible", true);
},
set: function (val) {
this.setPropertyValue("visible", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRowModel.prototype, "visibleElements", {
get: function () {
return this.elements.filter(function (e) { return e.isVisible; });
},
enumerable: true,
configurable: true
});
QuestionRowModel.prototype.updateVisible = function () {
this.visible = this.calcVisible();
this.setWidth();
};
QuestionRowModel.prototype.addElement = function (q) {
this.elements.push(q);
this.updateVisible();
};
Object.defineProperty(QuestionRowModel.prototype, "index", {
get: function () {
return this.panel.rows.indexOf(this);
},
enumerable: true,
configurable: true
});
QuestionRowModel.prototype.setWidth = function () {
var visCount = this.visibleElements.length;
if (visCount == 0)
return;
var counter = 0;
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].isVisible) {
var q = this.elements[i];
q.renderWidth =
!!q.width && typeof q.width === "string"
? q.width
: (100 / visCount).toFixed(6) + "%";
q.rightIndent = counter < visCount - 1 ? 1 : 0;
counter++;
}
else {
this.elements[i].renderWidth = "";
}
}
};
QuestionRowModel.prototype.calcVisible = function () {
return this.visibleElements.length > 0;
};
return QuestionRowModel;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
/**
* A base class for a Panel and Page objects.
*/
var PanelModelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(PanelModelBase, _super);
function PanelModelBase(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isQuestionsReady = false;
_this.questionsValue = new Array();
_this.conditionVersion = -1;
_this.createNewArray("rows");
_this.elementsValue = _this.createNewArray("elements", _this.onAddElement.bind(_this), _this.onRemoveElement.bind(_this));
_this.registerFunctionOnPropertyValueChanged("questionTitleLocation", _this.onVisibleChanged.bind(_this));
_this.id = PanelModelBase.getPanelId();
_this.createLocalizableString("title", _this, true);
_this.createLocalizableString("description", _this, true);
_this.createLocalizableString("requiredErrorText", _this);
return _this;
}
PanelModelBase.getPanelId = function () {
return "sp_" + PanelModelBase.panelCounter++;
};
PanelModelBase.prototype.getType = function () {
return "panelbase";
};
PanelModelBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
if (this.isDesignMode)
this.onVisibleChanged();
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].setSurveyImpl(value);
}
};
PanelModelBase.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.markQuestionListDirty();
this.onRowsChanged();
};
Object.defineProperty(PanelModelBase.prototype, "title", {
/**
* PanelModel or PageModel title property.
* @description
*/
get: function () {
return this.getLocalizableStringText("title");
},
set: function (val) {
this.setLocalizableStringText("title", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locTitle", {
get: function () {
return this.getLocalizableString("title");
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "description", {
/**
* PanelModel or PageModel description property. It renders under title by using smaller font. Unlike the title, description can be empty.
* @see title
*/
get: function () {
return this.getLocalizableStringText("description");
},
set: function (val) {
this.setLocalizableStringText("description", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locDescription", {
get: function () {
return this.getLocalizableString("description");
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].locStrsChanged();
}
};
Object.defineProperty(PanelModelBase.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
*/
get: function () {
return this.getLocalizableStringText("requiredErrorText");
},
set: function (val) {
this.setLocalizableStringText("requiredErrorText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locRequiredErrorText", {
get: function () {
return this.getLocalizableString("requiredErrorText");
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getLocale = function () {
return this.survey
? this.survey.getLocale()
: "";
};
PanelModelBase.prototype.getMarkdownHtml = function (text) {
return this.survey ? this.survey.getSurveyMarkdownHtml(this, text) : null;
};
PanelModelBase.prototype.getProcessedText = function (text) {
return this.textProcessor
? this.textProcessor.processText(text, true)
: text;
};
Object.defineProperty(PanelModelBase.prototype, "parent", {
/**
* A parent element. It is always null for the Page object and always not null for the Panel object. Panel object may contain Questions and other Panels.
*/
get: function () {
return this.getPropertyValue("parent", null);
},
set: function (val) {
this.setPropertyValue("parent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "depth", {
get: function () {
if (this.parent == null)
return 0;
return this.parent.depth + 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "visibleIf", {
/**
* An expression that returns true or false. If it returns true the Panel becomes visible and if it returns false the Panel becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.
* @see visible
*/
get: function () {
return this.getPropertyValue("visibleIf", "");
},
set: function (val) {
this.setPropertyValue("visibleIf", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "cssClasses", {
get: function () {
var classes = { panel: {}, error: {}, row: "" };
this.copyCssClasses(classes.panel, this.css.panel);
this.copyCssClasses(classes.error, this.css.error);
if (!!this.css.row) {
classes.row = this.css.row;
}
if (this.survey) {
this.survey.updatePanelCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "css", {
get: function () {
return !!this.survey ? this.survey.getCss() : {};
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "id", {
/**
* A unique element identificator. It is generated automatically.
*/
get: function () {
return this.getPropertyValue("id");
},
set: function (val) {
this.setPropertyValue("id", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isPanel", {
/**
* Returns true if the current object is Panel. Returns false if the current object is Page (a root Panel).
*/
get: function () {
return false;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getPanel = function () {
return this;
};
PanelModelBase.prototype.getLayoutType = function () {
return "row";
};
PanelModelBase.prototype.isLayoutTypeSupported = function (layoutType) {
return layoutType !== "flow";
};
Object.defineProperty(PanelModelBase.prototype, "questions", {
/**
* Returns the list of all questions located in the Panel/Page, including in the nested Panels.
* @see Question
* @see elements
*/
get: function () {
if (!this.isQuestionsReady) {
this.questionsValue = [];
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (el.isPanel) {
var qs = el.questions;
for (var j = 0; j < qs.length; j++) {
this.questionsValue.push(qs[j]);
}
}
else {
this.questionsValue.push(el);
}
}
this.isQuestionsReady = true;
}
return this.questionsValue;
},
enumerable: true,
configurable: true
});
/**
* Returns the question by its name
* @param name the question name
*/
PanelModelBase.prototype.getQuestionByName = function (name) {
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].name == name)
return questions[i];
}
return null;
};
/**
* Retuns the element by its name. It works recursively.
* @param name the element name
*/
PanelModelBase.prototype.getElementByName = function (name) {
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el.name == name)
return el;
var pnl = el.getPanel();
if (!!pnl) {
var res = pnl.getElementByName(name);
if (!!res)
return res;
}
}
return null;
};
PanelModelBase.prototype.getQuestionByValueName = function (valueName) {
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].getValueName() == valueName)
return questions[i];
}
return null;
};
/**
* Returns question values on the current page
*/
PanelModelBase.prototype.getValue = function () {
var data = {};
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
if (q.isEmpty())
continue;
var valueName = q.getValueName();
data[valueName] = q.value;
if (!!this.data) {
var comment = this.data.getComment(valueName);
if (!!comment) {
data[valueName + __WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].commentPrefix] = comment;
}
}
}
return data;
};
/**
* Returns question comments on the current page
*/
PanelModelBase.prototype.getComments = function () {
var comments = {};
if (!this.data)
return comments;
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
var comment = this.data.getComment(q.getValueName());
if (!!comment) {
comments[q.getValueName()] = comment;
}
}
return comments;
};
/**
* Call this function to remove all question values from the current page/panel, that end-user will not be able to enter.
* For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.
* Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions.
* @see Question.clearIncorrectValues
*/
PanelModelBase.prototype.clearIncorrectValues = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].clearIncorrectValues();
}
};
/**
* Call this function to clear all errors in the panel / page and all its child elements (panels and questions)
*/
PanelModelBase.prototype.clearErrors = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].clearErrors();
}
this.errors = [];
};
PanelModelBase.prototype.markQuestionListDirty = function () {
this.isQuestionsReady = false;
if (this.parent)
this.parent.markQuestionListDirty();
};
Object.defineProperty(PanelModelBase.prototype, "elements", {
/**
* Returns the list of the elements in the object, Panel/Page. Elements can be questions or panels. The function doesn't return elements in the nested Panels.
*/
get: function () {
return this.elementsValue;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return this.elements;
};
/**
* Returns true if the current element belongs to the Panel/Page. It looks in nested Panels as well.
* @param element
* @see PanelModel
*/
PanelModelBase.prototype.containsElement = function (element) {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (el == element)
return true;
var pnl = el.getPanel();
if (!!pnl) {
if (pnl.containsElement(element))
return true;
}
}
return false;
};
Object.defineProperty(PanelModelBase.prototype, "isRequired", {
/**
* Set this property to true, to require the answer at least in one question in the panel.
*/
get: function () {
return this.getPropertyValue("isRequired", false);
},
set: function (val) {
this.setPropertyValue("isRequired", val);
},
enumerable: true,
configurable: true
});
/**
* Returns true, if there is an error on this Page or inside the current Panel
* @param fireCallback set it to true, to show errors in UI
* @param focusOnFirstError set it to true to focus on the first question that doesn't pass the validation
*/
PanelModelBase.prototype.hasErrors = function (fireCallback, focusOnFirstError, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (focusOnFirstError === void 0) { focusOnFirstError = false; }
if (rec === void 0) { rec = null; }
rec = !!rec
? rec
: {
fireCallback: fireCallback,
focuseOnFirstError: focusOnFirstError,
firstErrorQuestion: null,
result: false
};
this.hasErrorsCore(rec);
if (rec.firstErrorQuestion) {
rec.firstErrorQuestion.focus(true);
}
return rec.result;
};
PanelModelBase.prototype.hasErrorsInPanels = function (rec) {
var errors = [];
this.hasRequiredError(rec, errors);
if (this.survey) {
var customError = this.survey.validatePanel(this);
if (customError) {
errors.push(customError);
rec.result = true;
}
}
if (!!rec.fireCallback) {
this.errors = errors;
}
};
//ISurveyErrorOwner
PanelModelBase.prototype.getErrorCustomText = function (text, error) {
if (!!this.survey)
return this.survey.getErrorCustomText(text, error);
return text;
};
PanelModelBase.prototype.hasRequiredError = function (rec, errors) {
if (!this.isRequired)
return;
var visQuestions = [];
this.addQuestionsToList(visQuestions, true);
if (visQuestions.length == 0)
return;
for (var i = 0; i < visQuestions.length; i++) {
if (!visQuestions[i].isEmpty())
return;
}
rec.result = true;
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["b" /* OneAnswerRequiredError */](this.requiredErrorText, this));
if (rec.focuseOnFirstError && !rec.firstErrorQuestion) {
rec.firstErrorQuestion = visQuestions[0];
}
};
PanelModelBase.prototype.hasErrorsCore = function (rec) {
var elements = this.elements;
var element = null;
for (var i = 0; i < elements.length; i++) {
element = elements[i];
if (!element.isVisible)
continue;
if (element.isPanel) {
element.hasErrorsCore(rec);
}
else {
var question = element;
if (question.isReadOnly)
continue;
if (question.hasErrors(rec.fireCallback, rec)) {
if (rec.focuseOnFirstError && rec.firstErrorQuestion == null) {
rec.firstErrorQuestion = question;
}
rec.result = true;
}
}
}
this.hasErrorsInPanels(rec);
this.updateContainsErrors();
};
PanelModelBase.prototype.getContainsErrors = function () {
var res = _super.prototype.getContainsErrors.call(this);
if (res)
return res;
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
if (elements[i].containsErrors)
return true;
}
return false;
};
PanelModelBase.prototype.updateElementVisibility = function () {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
el.setPropertyValue("isVisible", el.isVisible);
if (el.isPanel) {
el.updateElementVisibility();
}
}
};
PanelModelBase.prototype.getFirstQuestionToFocus = function (withError) {
if (withError === void 0) { withError = false; }
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (!el.isVisible)
continue;
if (el.isPanel) {
var res = el.getFirstQuestionToFocus(withError);
if (!!res)
return res;
}
else {
var q = el;
if (q.hasInput && (!withError || q.currentErrorCount > 0))
return q;
}
}
return null;
};
/**
* Call it to focus the input on the first question
*/
PanelModelBase.prototype.focusFirstQuestion = function () {
var q = this.getFirstQuestionToFocus();
if (!!q) {
q.focus();
}
};
/**
* Call it to focus the input of the first question that has an error.
*/
PanelModelBase.prototype.focusFirstErrorQuestion = function () {
var q = this.getFirstQuestionToFocus(true);
if (!!q) {
q.focus();
}
};
/**
* Fill list array with the questions.
* @param list
* @param visibleOnly set it to true to get visible questions only
*/
PanelModelBase.prototype.addQuestionsToList = function (list, visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
this.addElementsToList(list, visibleOnly, includingDesignTime, false);
};
/**
* Fill list array with the panels.
* @param list
*/
PanelModelBase.prototype.addPanelsIntoList = function (list, visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
this.addElementsToList(list, visibleOnly, includingDesignTime, true);
};
PanelModelBase.prototype.addElementsToList = function (list, visibleOnly, includingDesignTime, isPanel) {
if (visibleOnly && !this.visible)
return;
this.addElementsToListCore(list, this.elements, visibleOnly, includingDesignTime, isPanel);
};
PanelModelBase.prototype.addElementsToListCore = function (list, elements, visibleOnly, includingDesignTime, isPanel) {
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (visibleOnly && !el.visible)
continue;
if ((isPanel && el.isPanel) || (!isPanel && !el.isPanel)) {
list.push(el);
}
if (el.isPanel) {
el.addElementsToListCore(list, el.elements, visibleOnly, includingDesignTime, isPanel);
}
else {
if (includingDesignTime) {
this.addElementsToListCore(list, el.getElementsInDesign(false), visibleOnly, includingDesignTime, isPanel);
}
}
}
};
Object.defineProperty(PanelModelBase.prototype, "isActive", {
/**
* Returns true if the current object is Page and it is the current page.
*/
get: function () {
return !this.survey || this.survey.currentPage == this.root;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.updateCustomWidgets = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].updateCustomWidgets();
}
};
Object.defineProperty(PanelModelBase.prototype, "questionTitleLocation", {
/**
* Set this property different from "default" to set the specific question title location for this panel/page.
* @see SurveyModel.questionTitleLocation
*/
get: function () {
return this.getPropertyValue("questionTitleLocation");
},
set: function (value) {
this.setPropertyValue("questionTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getQuestionTitleLocation = function () {
if (this.onGetQuestionTitleLocation)
return this.onGetQuestionTitleLocation();
if (this.questionTitleLocation != "default")
return this.questionTitleLocation;
if (this.parent)
return this.parent.getQuestionTitleLocation();
return this.survey ? this.survey.questionTitleLocation : "top";
};
PanelModelBase.prototype.getChildrenLayoutType = function () {
return "row";
};
Object.defineProperty(PanelModelBase.prototype, "root", {
get: function () {
var res = this;
while (res.parent)
res = res.parent;
return res;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.childVisibilityChanged = function () {
var newIsVisibleValue = this.getIsPageVisible(null);
var oldIsVisibleValue = this.getPropertyValue("isVisible", true);
if (newIsVisibleValue !== oldIsVisibleValue) {
this.onVisibleChanged();
}
};
PanelModelBase.prototype.createRow = function () {
return new QuestionRowModel(this);
};
PanelModelBase.prototype.onSurveyLoad = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onSurveyLoad();
}
this.onElementVisibilityChanged(this);
};
PanelModelBase.prototype.onFirstRendering = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onFirstRendering();
}
this.onRowsChanged();
};
Object.defineProperty(PanelModelBase.prototype, "rows", {
get: function () {
return this.getPropertyValue("rows");
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onRowsChanged = function () {
if (this.isLoadingFromJson)
return;
this.setPropertyValue("rows", this.buildRows());
};
PanelModelBase.prototype.onAddElement = function (element, index) {
element.setSurveyImpl(this.surveyImpl);
element.parent = this;
this.markQuestionListDirty();
this.updateRowsOnElementAdded(element, index);
if (element.isPanel) {
var p = element;
if (this.survey) {
this.survey.panelAdded(p, index, this, this.root);
}
}
else {
if (this.survey) {
var q = element;
this.survey.questionAdded(q, index, this, this.root);
}
}
if (!!this.addElementCallback)
this.addElementCallback(element);
var self = this;
element.registerFunctionOnPropertiesValueChanged(["visible", "isVisible"], function () {
self.onElementVisibilityChanged(element);
}, this.id);
element.registerFunctionOnPropertyValueChanged("startWithNewLine", function () {
self.onElementStartWithNewLineChanged(element);
}, this.id);
this.onElementVisibilityChanged(this);
};
PanelModelBase.prototype.onRemoveElement = function (element) {
element.parent = null;
this.markQuestionListDirty();
element.unRegisterFunctionOnPropertiesValueChanged(["visible", "isVisible", "startWithNewLine"], this.id);
this.updateRowsOnElementRemoved(element);
if (!element.isPanel) {
if (this.survey)
this.survey.questionRemoved(element);
}
else {
if (this.survey)
this.survey.panelRemoved(element);
}
if (!!this.removeElementCallback)
this.removeElementCallback(element);
this.onElementVisibilityChanged(this);
};
PanelModelBase.prototype.onElementVisibilityChanged = function (element) {
if (this.isLoadingFromJson)
return;
this.updateRowsVisibility(element);
this.childVisibilityChanged();
if (!!this.parent) {
this.parent.onElementVisibilityChanged(this);
}
};
PanelModelBase.prototype.onElementStartWithNewLineChanged = function (element) {
this.onRowsChanged();
};
PanelModelBase.prototype.updateRowsVisibility = function (element) {
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (row.elements.indexOf(element) > -1) {
row.updateVisible();
break;
}
}
};
PanelModelBase.prototype.canBuildRows = function () {
return !this.isLoadingFromJson && this.getChildrenLayoutType() == "row";
};
PanelModelBase.prototype.buildRows = function () {
if (!this.canBuildRows())
return [];
var result = new Array();
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
var isNewRow = i == 0 || el.startWithNewLine;
var row = isNewRow ? this.createRow() : result[result.length - 1];
if (isNewRow)
result.push(row);
row.addElement(el);
}
for (var i = 0; i < result.length; i++) {
result[i].updateVisible();
}
return result;
};
PanelModelBase.prototype.updateRowsOnElementAdded = function (element, index) {
if (!this.canBuildRows())
return;
var dragDropInfo = new DragDropInfo(null, element);
dragDropInfo.target = element;
dragDropInfo.isEdge = this.elements.length > 1;
if (this.elements.length < 2) {
dragDropInfo.destination = this;
}
else {
dragDropInfo.isBottom = index > 0;
if (index == 0) {
dragDropInfo.destination = this.elements[1];
}
else {
dragDropInfo.destination = this.elements[index - 1];
}
}
this.dragDropAddTargetToRow(dragDropInfo, null);
};
PanelModelBase.prototype.updateRowsOnElementRemoved = function (element) {
if (!this.canBuildRows())
return;
this.updateRowsRemoveElementFromRow(element, this.findRowByElement(element));
};
PanelModelBase.prototype.updateRowsRemoveElementFromRow = function (element, row) {
if (!row || !row.panel)
return;
var elIndex = row.elements.indexOf(element);
if (elIndex < 0)
return;
row.elements.splice(elIndex, 1);
if (row.elements.length > 0) {
row.updateVisible();
}
else {
if (row.index >= 0) {
row.panel.rows.splice(row.index, 1);
}
}
};
PanelModelBase.prototype.findRowByElement = function (el) {
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
if (rows[i].elements.indexOf(el) > -1)
return rows[i];
}
return null;
};
PanelModelBase.prototype.elementWidthChanged = function (el) {
if (this.isLoadingFromJson)
return;
var row = this.findRowByElement(el);
if (!!row) {
row.updateVisible();
}
};
Object.defineProperty(PanelModelBase.prototype, "processedTitle", {
/**
* Returns rendered title text or html.
*/
get: function () {
return this.getRenderedTitle(this.locTitle.textOrHtml);
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getRenderedTitle = function (str) {
return this.textProcessor != null
? this.textProcessor.processText(str, true)
: str;
};
Object.defineProperty(PanelModelBase.prototype, "visible", {
/**
* Use it to get/set the object visibility.
* @see visibleIf
*/
get: function () {
return this.getPropertyValue("visible", true);
},
set: function (value) {
if (value === this.visible)
return;
this.setPropertyValue("visible", value);
this.setPropertyValue("isVisible", this.isVisible);
if (!this.isLoadingFromJson)
this.onVisibleChanged();
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onVisibleChanged = function () {
this.setPropertyValue("isVisible", this.isVisible);
};
Object.defineProperty(PanelModelBase.prototype, "isVisible", {
/**
* Returns true if object is visible or survey is in design mode right now.
*/
get: function () {
return this.areInvisibleElementsShowing || this.getIsPageVisible(null);
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getIsPageVisible = function (exceptionQuestion) {
if (!this.visible)
return false;
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i] == exceptionQuestion)
continue;
if (this.elements[i].isVisible)
return true;
}
return false;
};
PanelModelBase.prototype.setVisibleIndex = function (index) {
if (!this.isVisible || index < 0) {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].setVisibleIndex(-1);
}
return 0;
}
var startIndex = index;
for (var i = 0; i < this.elements.length; i++) {
index += this.elements[i].setVisibleIndex(index);
}
return index - startIndex;
};
Object.defineProperty(PanelModelBase.prototype, "isReadOnly", {
/**
* Retuns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly.
* @see SurveyModel.model
* @see readOnly
*/
get: function () {
var isParentReadOnly = !!this.parent && this.parent.isReadOnly;
var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode;
return this.readOnly || isParentReadOnly || isSurveyReadOnly;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onReadOnlyChanged = function () {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
el.setPropertyValue("isReadOnly", el.isReadOnly);
}
_super.prototype.onReadOnlyChanged.call(this);
};
Object.defineProperty(PanelModelBase.prototype, "enableIf", {
/**
* An expression that returns true or false. If it returns false the Panel/Page becomes read only and an end-user will not able to answer on qustions inside it.
* The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.
* @see readOnly
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("enableIf", "");
},
set: function (val) {
this.setPropertyValue("enableIf", val);
},
enumerable: true,
configurable: true
});
/**
* Add an element into Panel or Page. Returns true if the element added successfully. Otherwise returns false.
* @param element
* @param index element index in the elements array
*/
PanelModelBase.prototype.addElement = function (element, index) {
if (index === void 0) { index = -1; }
if (!this.canAddElement(element))
return false;
if (index < 0 || index >= this.elements.length) {
this.elements.push(element);
}
else {
this.elements.splice(index, 0, element);
}
return true;
};
PanelModelBase.prototype.canAddElement = function (element) {
return (!!element && element.isLayoutTypeSupported(this.getChildrenLayoutType()));
};
/**
* Add a question into Panel or Page. Returns true if the question added successfully. Otherwise returns false.
* @param question
* @param index element index in the elements array
*/
PanelModelBase.prototype.addQuestion = function (question, index) {
if (index === void 0) { index = -1; }
return this.addElement(question, index);
};
/**
* Add a panel into Panel or Page. Returns true if the panel added successfully. Otherwise returns false.
* @param panel
* @param index element index in the elements array
*/
PanelModelBase.prototype.addPanel = function (panel, index) {
if (index === void 0) { index = -1; }
return this.addElement(panel, index);
};
/**
* Creates a new question and adds it at location of index, by default the end of the elements list. Returns null, if the question could not be created or could not be added into page or panel.
* @param questionType the possible values are: "text", "checkbox", "dropdown", "matrix", "html", "matrixdynamic", "matrixdropdown" and so on.
* @param name a question name
* @param index element index in the elements array
*/
PanelModelBase.prototype.addNewQuestion = function (questionType, name, index) {
if (name === void 0) { name = null; }
if (index === void 0) { index = -1; }
var question = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.createQuestion(questionType, name);
if (!this.addQuestion(question, index))
return null;
return question;
};
/**
* Creates a new panel and adds it into the end of the elements list. Returns null, if the panel could not be created or could not be added into page or panel.
* @param name a panel name
*/
PanelModelBase.prototype.addNewPanel = function (name) {
if (name === void 0) { name = null; }
var panel = this.createNewPanel(name);
if (!this.addPanel(panel))
return null;
return panel;
};
/**
* Returns the index of element parameter in the elements list.
* @param element question or panel
*/
PanelModelBase.prototype.indexOf = function (element) {
return this.elements.indexOf(element);
};
PanelModelBase.prototype.createNewPanel = function (name) {
return new PanelModel(name);
};
/**
* Remove an element (Panel or Question) from the elements list.
* @param element
* @see elements
*/
PanelModelBase.prototype.removeElement = function (element) {
var index = this.elements.indexOf(element);
if (index < 0) {
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].removeElement(element))
return true;
}
return false;
}
this.elements.splice(index, 1);
return true;
};
/**
* Remove question from the elements list.
* @param question
* @see elements
* @see removeElement
*/
PanelModelBase.prototype.removeQuestion = function (question) {
this.removeElement(question);
};
PanelModelBase.prototype.runCondition = function (values, properties) {
if (this.isDesignMode)
return;
if (values.conditionVersion < this.conditionVersion)
return;
this.conditionVersion = values.conditionVersion;
var elements = this.elements.slice();
for (var i = 0; i < elements.length; i++) {
if (values.conditionVersion < this.conditionVersion)
return;
elements[i].runCondition(values, properties);
}
if (values.conditionVersion < this.conditionVersion)
return;
if (!this.areInvisibleElementsShowing) {
this.runVisibleCondition(values, properties);
}
this.runEnableCondition(values, properties);
};
PanelModelBase.prototype.runVisibleCondition = function (values, properties) {
var _this = this;
if (!this.visibleIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["b" /* ConditionRunner */](this.visibleIf);
conditionRunner.onRunComplete = function (res) {
_this.visible = res;
};
conditionRunner.run(values, properties);
};
PanelModelBase.prototype.runEnableCondition = function (values, properties) {
var _this = this;
if (!this.enableIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["b" /* ConditionRunner */](this.enableIf);
conditionRunner.onRunComplete = function (res) {
_this.readOnly = !res;
};
conditionRunner.run(values, properties);
};
PanelModelBase.prototype.onAnyValueChanged = function (name) {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onAnyValueChanged(name);
}
};
PanelModelBase.prototype.dragDropAddTarget = function (dragDropInfo) {
var prevRow = this.dragDropFindRow(dragDropInfo.target);
if (this.dragDropAddTargetToRow(dragDropInfo, prevRow)) {
this.updateRowsRemoveElementFromRow(dragDropInfo.target, prevRow);
}
};
PanelModelBase.prototype.dragDropFindRow = function (findElement) {
if (!findElement || findElement.isPage)
return null;
var element = findElement;
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
if (rows[i].elements.indexOf(element) > -1)
return rows[i];
}
for (var i = 0; i < this.elements.length; i++) {
var pnl = this.elements[i].getPanel();
if (!pnl)
continue;
var row = pnl.dragDropFindRow(element);
if (!!row)
return row;
}
return null;
};
PanelModelBase.prototype.dragDropAddTargetToRow = function (dragDropInfo, prevRow) {
if (!dragDropInfo.destination)
return true;
if (this.dragDropAddTargetToEmptyPanel(dragDropInfo))
return true;
var dest = dragDropInfo.destination;
var destRow = this.dragDropFindRow(dest);
if (!destRow)
return true;
if (!dragDropInfo.target.startWithNewLine)
return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow);
return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow);
};
PanelModelBase.prototype.dragDropAddTargetToEmptyPanel = function (dragDropInfo) {
if (dragDropInfo.destination.isPage) {
this.dragDropAddTargetToEmptyPanelCore(this.root, dragDropInfo.target, dragDropInfo.isBottom);
return true;
}
var dest = dragDropInfo.destination;
if (dest.isPanel && !dragDropInfo.isEdge) {
var panel = dest;
if (dragDropInfo.target["template"] === dest) {
return false;
}
if (dragDropInfo.nestedPanelDepth < 0 ||
dragDropInfo.nestedPanelDepth >= panel.depth) {
this.dragDropAddTargetToEmptyPanelCore(dest, dragDropInfo.target, dragDropInfo.isBottom);
return true;
}
}
return false;
};
PanelModelBase.prototype.dragDropAddTargetToExistingRow = function (dragDropInfo, destRow, prevRow) {
var index = destRow.elements.indexOf(dragDropInfo.destination);
if (index == 0 &&
!dragDropInfo.isBottom &&
destRow.elements[0].startWithNewLine) {
if (destRow.index > 0) {
dragDropInfo.isBottom = true;
destRow = destRow.panel.rows[destRow.index - 1];
dragDropInfo.destination =
destRow.elements[destRow.elements.length - 1];
return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow);
}
else {
return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow);
}
}
var prevRowIndex = -1;
if (prevRow == destRow) {
prevRowIndex = destRow.elements.indexOf(dragDropInfo.target);
}
if (dragDropInfo.isBottom)
index++;
var srcRow = this.findRowByElement(dragDropInfo.source);
if (srcRow == destRow &&
srcRow.elements.indexOf(dragDropInfo.source) == index)
return false;
if (index == prevRowIndex)
return false;
if (prevRowIndex > -1) {
destRow.elements.splice(prevRowIndex, 1);
if (prevRowIndex < index)
index--;
}
destRow.elements.splice(index, 0, dragDropInfo.target);
destRow.updateVisible();
return prevRowIndex < 0;
};
PanelModelBase.prototype.dragDropAddTargetToNewRow = function (dragDropInfo, destRow, prevRow) {
var targetRow = destRow.panel.createRow();
targetRow.addElement(dragDropInfo.target);
var index = destRow.index;
if (dragDropInfo.isBottom) {
index++;
}
//same row
if (!!prevRow && prevRow.panel == targetRow.panel && prevRow.index == index)
return false;
var srcRow = this.findRowByElement(dragDropInfo.source);
if (!!srcRow &&
srcRow.panel == targetRow.panel &&
srcRow.elements.length == 1 &&
srcRow.index == index)
return false;
destRow.panel.rows.splice(index, 0, targetRow);
return true;
};
PanelModelBase.prototype.dragDropAddTargetToEmptyPanelCore = function (panel, target, isBottom) {
var targetRow = panel.createRow();
targetRow.addElement(target);
if (panel.elements.length == 0 || isBottom) {
panel.rows.push(targetRow);
}
else {
panel.rows.splice(0, 0, targetRow);
}
};
PanelModelBase.prototype.dragDropMoveElement = function (src, target, targetIndex) {
var srcIndex = src.parent.elements.indexOf(src);
if (targetIndex > srcIndex) {
targetIndex--;
}
this.removeElement(src);
this.addElement(target, targetIndex);
};
PanelModelBase.panelCounter = 100;
return PanelModelBase;
}(__WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */]));
/**
* A container element, similar to the Page objects. However, unlike the Page, Panel can't be a root.
* It may contain questions and other panels.
*/
var PanelModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(PanelModel, _super);
function PanelModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
var self = _this;
_this.registerFunctionOnPropertyValueChanged("state", function () {
if (self.stateChangedCallback)
self.stateChangedCallback();
});
_this.registerFunctionOnPropertyValueChanged("width", function () {
if (!!self.parent) {
self.parent.elementWidthChanged(self);
}
});
_this.registerFunctionOnPropertiesValueChanged(["indent", "innerIndent", "rightIndent"], function () {
self.onIndentChanged();
});
return _this;
}
PanelModel.prototype.getType = function () {
return "panel";
};
PanelModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.onIndentChanged();
};
Object.defineProperty(PanelModel.prototype, "isPanel", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "page", {
/**
* Get/set the page where the panel is located.
*/
get: function () {
return this.getPage(this.parent);
},
set: function (val) {
this.setPage(this.parent, val);
},
enumerable: true,
configurable: true
});
PanelModel.prototype.delete = function () {
if (!!this.parent) {
this.removeSelfFromList(this.parent.elements);
}
};
Object.defineProperty(PanelModel.prototype, "state", {
/**
* Set this property to "collapsed" to render only Panel title and expanded button and to "expanded" to render the collapsed button in the Panel caption
*/
get: function () {
return this.getPropertyValue("state");
},
set: function (val) {
this.setPropertyValue("state", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "isCollapsed", {
/**
* Returns true if the Panel is in the collapsed state
* @see state
* @see collapse
* @see isExpanded
*/
get: function () {
return this.state == "collapsed";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "isExpanded", {
/**
* Returns true if the Panel is in the expanded state
* @see state
* @see expand
* @see isCollapsed
*/
get: function () {
if (this.isDesignMode)
return;
return this.state == "expanded";
},
enumerable: true,
configurable: true
});
/**
* Collapse the Panel
* @see state
*/
PanelModel.prototype.collapse = function () {
if (this.isDesignMode)
return;
this.state = "collapsed";
};
/**
* Expand the Panel
* @see state
*/
PanelModel.prototype.expand = function () {
this.state = "expanded";
};
/**
* Move panel to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index,
* if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel
* @param container Page or Panel to where a question is relocated.
* @param insertBefore Use it if you want to set the panel to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element.
*/
PanelModel.prototype.moveTo = function (container, insertBefore) {
if (insertBefore === void 0) { insertBefore = null; }
return this.moveToBase(this.parent, container, insertBefore);
};
PanelModel.prototype.hasErrorsCore = function (rec) {
_super.prototype.hasErrorsCore.call(this, rec);
if (this.isCollapsed && rec.result && rec.fireCallback) {
this.expand();
}
};
PanelModel.prototype.getRenderedTitle = function (str) {
if (!str) {
if (this.isCollapsed || this.isExpanded)
return this.name;
if (this.isDesignMode)
return "[" + this.name + "]";
}
return _super.prototype.getRenderedTitle.call(this, str);
};
Object.defineProperty(PanelModel.prototype, "width", {
/**
* The Panel width.
*/
get: function () {
return this.getPropertyValue("width");
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "indent", {
/**
* The left indent. Set this property to increase the panel left indent.
*/
get: function () {
return this.getPropertyValue("indent", 0);
},
set: function (val) {
this.setPropertyValue("indent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "innerIndent", {
/**
* The inner indent. Set this property to increase the panel content margin.
*/
get: function () {
return this.getPropertyValue("innerIndent", 0);
},
set: function (val) {
this.setPropertyValue("innerIndent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "renderWidth", {
get: function () {
return this.getPropertyValue("renderWidth");
},
set: function (val) {
this.setPropertyValue("renderWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "startWithNewLine", {
/**
* The Panel renders on the new line if the property is true. If the property is false, the panel tries to render on the same line/row with a previous question/panel.
*/
get: function () {
return this.getPropertyValue("startWithNewLine", true);
},
set: function (value) {
this.setPropertyValue("startWithNewLine", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "rightIndent", {
/**
* The right indent of the Panel.
*/
get: function () {
return this.getPropertyValue("rightIndent", 0);
},
set: function (val) {
this.setPropertyValue("rightIndent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "paddingLeft", {
get: function () {
return this.getPropertyValue("paddingLeft", "");
},
set: function (val) {
this.setPropertyValue("paddingLeft", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "innerPaddingLeft", {
get: function () {
return this.getPropertyValue("innerPaddingLeft", "");
},
set: function (val) {
this.setPropertyValue("innerPaddingLeft", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "paddingRight", {
get: function () {
return this.getPropertyValue("paddingRight", "");
},
set: function (val) {
this.setPropertyValue("paddingRight", val);
},
enumerable: true,
configurable: true
});
PanelModel.prototype.onIndentChanged = function () {
this.innerPaddingLeft = this.getIndentSize(this.innerIndent);
this.paddingLeft = this.getIndentSize(this.indent);
this.paddingRight = this.getIndentSize(this.rightIndent);
};
PanelModel.prototype.getIndentSize = function (indent) {
if (indent < 1)
return "";
if (!this.data)
return "";
var css = this.survey["css"];
if (!css)
return "";
return indent * css.question.indent + "px";
};
PanelModel.prototype.onVisibleChanged = function () {
_super.prototype.onVisibleChanged.call(this);
this.setPropertyValue("isVisible", this.isVisible);
if (this.survey != null) {
this.survey.panelVisibilityChanged(this, this.visible);
}
};
return PanelModel;
}(PanelModelBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("panelbase", [
"name",
{
name: "elements",
alternativeName: "questions",
baseClassName: "question",
visible: false,
isLightSerializable: false
},
{ name: "visible:boolean", default: true },
"visibleIf:condition",
"enableIf:condition",
"readOnly:boolean",
{
name: "questionTitleLocation",
default: "default",
choices: ["default", "top", "bottom", "left", "hidden"]
},
{ name: "title", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" }
], function () {
return new PanelModelBase();
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("panel", [
{
name: "state",
default: "default",
choices: ["default", "collapsed", "expanded"]
},
"isRequired:boolean",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText"
},
{ name: "startWithNewLine:boolean", default: true },
{ name: "innerIndent:number", default: 0, choices: [0, 1, 2, 3] },
{ name: "indent:number", default: 0, choices: [0, 1, 2, 3] },
{
name: "page",
isSerializable: false,
choices: function (obj) {
var survey = obj ? obj.survey : null;
return survey
? survey.pages.map(function (p) {
return { value: p.name, text: p.title };
})
: [];
}
}
], function () {
return new PanelModel();
}, "panelbase");
/***/ }),
/* 24 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestion__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__element_factory__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__panel_base__ = __webpack_require__(50);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPanel; });
var SurveyPanel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyPanel, _super);
function SurveyPanel(props) {
var _this = _super.call(this, props) || this;
_this.hasBeenExpanded = false;
return _this;
}
Object.defineProperty(SurveyPanel.prototype, "panel", {
get: function () {
return this.panelBase;
},
enumerable: true,
configurable: true
});
SurveyPanel.prototype.render = function () {
if (this.panelBase == null || this.survey == null || this.creator == null)
return null;
if (!this.panelBase.isVisible)
return null;
var title = this.renderTitle();
var description = this.renderDescription();
var errors = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_2__reactquestion__["b" /* SurveyElementErrors */], { element: this.panelBase, cssClasses: this.panelBase.cssClasses, creator: this.creator }));
var style = {
paddingLeft: this.panel.innerPaddingLeft,
display: !this.panel.isCollapsed ? "block" : "none"
};
var content = null;
if (!this.panel.isCollapsed || this.hasBeenExpanded) {
this.hasBeenExpanded = true;
var rows = this.renderRows(this.panelBase.cssClasses);
var className = this.panelBase.cssClasses.panel.content;
content = this.renderContent(style, rows, className);
}
var rootStyle = {};
if (this.panel.renderWidth)
rootStyle["width"] = this.panel.renderWidth;
var bottom = this.renderBottom();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", className: this.panelBase.cssClasses.panel.container, style: rootStyle },
title,
description,
errors,
content,
bottom));
};
SurveyPanel.prototype.renderContent = function (style, rows, className) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: style, className: className }, rows));
};
SurveyPanel.prototype.renderTitle = function () {
var _this = this;
if (!this.panelBase.title)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.panelBase.locTitle);
var expandCollapse = null;
var titleStyle = this.panel.cssClasses.panel.title;
if (this.panel.isCollapsed || this.panel.isExpanded) {
titleStyle += " " + this.panel.cssClasses.panel.titleExpandable;
var iconCss = this.panel.cssClasses.panel.icon;
if (!this.panel.isCollapsed)
iconCss += " " + this.panel.cssClasses.panel.iconExpanded;
var changeExpanded = function () {
if (_this.panel.isCollapsed) {
_this.panel.expand();
}
else {
_this.panel.collapse();
}
};
expandCollapse = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: iconCss });
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h4", { className: titleStyle, onClick: changeExpanded },
text,
expandCollapse));
};
SurveyPanel.prototype.renderDescription = function () {
if (!this.panelBase.description)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.panelBase.locDescription);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.panel.cssClasses.panel.description }, text);
};
SurveyPanel.prototype.renderBottom = function () {
return null;
};
return SurveyPanel;
}(__WEBPACK_IMPORTED_MODULE_5__panel_base__["a" /* SurveyPanelBase */]));
__WEBPACK_IMPORTED_MODULE_4__element_factory__["a" /* ReactElementFactory */].Instance.registerElement("panel", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyPanel, props);
});
/***/ }),
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyNavigationBase; });
var SurveyNavigationBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyNavigationBase, _super);
function SurveyNavigationBase(props) {
var _this = _super.call(this, props) || this;
_this.updateStateFunction = null;
_this.state = { update: 0 };
return _this;
}
Object.defineProperty(SurveyNavigationBase.prototype, "survey", {
get: function () {
return this.props.survey;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyNavigationBase.prototype, "css", {
get: function () {
return this.props.css;
},
enumerable: true,
configurable: true
});
SurveyNavigationBase.prototype.componentDidMount = function () {
if (this.survey) {
var self = this;
this.updateStateFunction = function () {
self.setState({ update: self.state.update + 1 });
};
this.survey.onPageVisibleChanged.add(this.updateStateFunction);
}
};
SurveyNavigationBase.prototype.componentWillUnmount = function () {
if (this.survey && this.updateStateFunction) {
this.survey.onPageVisibleChanged.remove(this.updateStateFunction);
this.updateStateFunction = null;
}
};
return SurveyNavigationBase;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 26 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestion__ = __webpack_require__(19);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixDropdownBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDropdownCell; });
var SurveyQuestionMatrixDropdownBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDropdownBase, _super);
function SurveyQuestionMatrixDropdownBase(props) {
var _this = _super.call(this, props) || this;
_this.isRendering = false;
_this.state = _this.getState();
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDropdownBase.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDropdownBase.prototype.getState = function (prevState) {
if (prevState === void 0) { prevState = null; }
return { rowCounter: !prevState ? 0 : prevState.rowCounter + 1 };
};
SurveyQuestionMatrixDropdownBase.prototype.updateVisibleRowsChangedCallback = function () {
var _this = this;
this.question.visibleRowsChangedCallback = function () {
_this.updateStateOnCallback();
};
};
SurveyQuestionMatrixDropdownBase.prototype.renderedTableResetCallback = function () {
var _this = this;
this.question.onRenderedTableResetCallback = function () {
_this.updateStateOnCallback();
};
};
SurveyQuestionMatrixDropdownBase.prototype.updateStateOnCallback = function () {
if (this.isRendering)
return;
this.setState(this.getState(this.state));
};
SurveyQuestionMatrixDropdownBase.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.updateVisibleRowsChangedCallback();
this.renderedTableResetCallback();
};
SurveyQuestionMatrixDropdownBase.prototype.render = function () {
if (!this.question)
return null;
return this.renderTableDiv();
};
SurveyQuestionMatrixDropdownBase.prototype.renderTableDiv = function () {
this.isRendering = true;
var header = this.renderHeader();
var footers = this.renderFooter();
var rows = this.renderRows();
var divStyle = this.question.horizontalScroll
? { overflowX: "scroll" }
: {};
this.isRendering = false;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: divStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: this.question.cssClasses.root },
header,
rows,
footers)));
};
SurveyQuestionMatrixDropdownBase.prototype.renderHeader = function () {
var table = this.question.renderedTable;
if (!table.showHeader)
return null;
var headers = [];
var cells = table.headerRow.cells;
for (var i = 0; i < cells.length; i++) {
var cell = cells[i];
var key = "column" + i;
var columnStyle = {};
if (!!cell.width) {
columnStyle.width = cell.width;
}
if (!!cell.minWidth) {
columnStyle.minWidth = cell.minWidth;
}
var columnTitle = this.renderLocString(cell.locTitle);
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { className: this.question.cssClasses.headerCell, key: key, style: columnStyle }, columnTitle));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null, headers)));
};
SurveyQuestionMatrixDropdownBase.prototype.renderFooter = function () {
var table = this.question.renderedTable;
if (!table.showFooter)
return null;
var row = this.renderRow("footer", table.footerRow, this.question.cssClasses);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tfoot", null, row);
};
SurveyQuestionMatrixDropdownBase.prototype.renderRows = function () {
var cssClasses = this.question.cssClasses;
var rows = [];
var renderedRows = this.question.renderedTable.rows;
for (var i = 0; i < renderedRows.length; i++) {
rows.push(this.renderRow(renderedRows[i].id, renderedRows[i], cssClasses));
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows);
};
SurveyQuestionMatrixDropdownBase.prototype.renderRow = function (keyValue, row, cssClasses) {
var matrixrow = [];
var cells = row.cells;
for (var i = 0; i < cells.length; i++) {
matrixrow.push(this.renderCell(cells[i], i, cssClasses));
}
var key = "row" + keyValue;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", { key: key }, matrixrow);
};
SurveyQuestionMatrixDropdownBase.prototype.renderCell = function (cell, index, cssClasses) {
var key = "cell" + index;
if (cell.hasQuestion) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdownCell, { key: key, cssClasses: cssClasses, cell: cell.cell, creator: this.creator }));
}
var cellContent = null;
if (cell.hasTitle) {
cellContent = this.renderLocString(cell.locTitle);
}
if (cell.isRemoveRow) {
cellContent = this.renderRemoveButton(cell.row);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { className: cssClasses.cell, key: key }, cellContent));
};
SurveyQuestionMatrixDropdownBase.prototype.renderRemoveButton = function (row) {
return null;
};
return SurveyQuestionMatrixDropdownBase;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixDropdownCell = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDropdownCell, _super);
function SurveyQuestionMatrixDropdownCell(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionMatrixDropdownCell.prototype, "cell", {
get: function () {
return this.props.cell;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDropdownCell.prototype.getQuestion = function () {
var q = _super.prototype.getQuestion.call(this);
if (!!q)
return q;
return !!this.cell ? this.cell.question : null;
};
SurveyQuestionMatrixDropdownCell.prototype.doAfterRender = function () {
var el = this.refs["cell"];
if (el &&
this.cell &&
this.question &&
this.question.survey &&
el.getAttribute("data-rendered") !== "r") {
el.setAttribute("data-rendered", "r");
var options = {
cell: this.cell,
cellQuestion: this.question,
htmlElement: el,
row: this.cell.row,
column: this.cell.column
};
this.question.survey.matrixAfterCellRender(this.question, options);
}
};
SurveyQuestionMatrixDropdownCell.prototype.getCellClass = function () {
var question = this.cell.question;
var cellClass = this.cell.question.cssClasses.itemValue;
if (question.errors.length !== 0)
cellClass += " " + question.cssClasses.hasError;
cellClass += " " + question.cssClasses.asCell;
return cellClass;
};
return SurveyQuestionMatrixDropdownCell;
}(__WEBPACK_IMPORTED_MODULE_3__reactquestion__["c" /* SurveyQuestionAndErrorsCell */]));
/***/ }),
/* 27 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__functionsfactory__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__ = __webpack_require__(15);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return Operand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return BinaryOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return UnaryOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return ArrayOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Const; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return Variable; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return OperandMaker; });
var Operand = /** @class */ (function () {
function Operand() {
}
Operand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
return "";
};
Operand.prototype.hasFunction = function () {
return false;
};
Operand.prototype.hasAsyncFunction = function () {
return false;
};
Operand.prototype.addToAsyncList = function (list) { };
return Operand;
}());
var BinaryOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(BinaryOperand, _super);
function BinaryOperand(operatorName, left, right, isArithmeticOp) {
if (left === void 0) { left = null; }
if (right === void 0) { right = null; }
if (isArithmeticOp === void 0) { isArithmeticOp = false; }
var _this = _super.call(this) || this;
_this.operatorName = operatorName;
_this.left = left;
_this.right = right;
_this.isArithmeticValue = isArithmeticOp;
if (isArithmeticOp) {
_this.consumer = OperandMaker.binaryFunctions["arithmeticOp"](operatorName);
}
else {
_this.consumer = OperandMaker.binaryFunctions[operatorName];
}
if (_this.consumer == null) {
OperandMaker.throwInvalidOperatorError(operatorName);
}
return _this;
}
BinaryOperand.prototype.getType = function () {
return "binary";
};
Object.defineProperty(BinaryOperand.prototype, "isArithmetic", {
get: function () {
return this.isArithmeticValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "isConjunction", {
get: function () {
return this.operatorName == "or" || this.operatorName == "and";
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "leftOperand", {
get: function () {
return this.left;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "rightOperand", {
get: function () {
return this.right;
},
enumerable: true,
configurable: true
});
BinaryOperand.prototype.evaluateParam = function (x, processValue) {
return x == null ? null : x.evaluate(processValue);
};
BinaryOperand.prototype.evaluate = function (processValue) {
return this.consumer.call(this, this.evaluateParam(this.left, processValue), this.evaluateParam(this.right, processValue));
};
BinaryOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return ("(" +
OperandMaker.safeToString(this.left, func) +
" " +
OperandMaker.operatorToString(this.operatorName) +
" " +
OperandMaker.safeToString(this.right, func) +
")");
};
BinaryOperand.prototype.setVariables = function (variables) {
if (this.left != null)
this.left.setVariables(variables);
if (this.right != null)
this.right.setVariables(variables);
};
BinaryOperand.prototype.hasFunction = function () {
return ((!!this.left && this.left.hasFunction()) ||
(!!this.right && this.right.hasFunction()));
};
BinaryOperand.prototype.hasAsyncFunction = function () {
return ((!!this.left && this.left.hasAsyncFunction()) ||
(!!this.right && this.right.hasAsyncFunction()));
};
BinaryOperand.prototype.addToAsyncList = function (list) {
if (!!this.left)
this.left.addToAsyncList(list);
if (!!this.right)
this.right.addToAsyncList(list);
};
return BinaryOperand;
}(Operand));
var UnaryOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(UnaryOperand, _super);
function UnaryOperand(expression, operatorName) {
var _this = _super.call(this) || this;
_this.expression = expression;
_this.operatorName = operatorName;
_this.consumer = OperandMaker.unaryFunctions[operatorName];
if (_this.consumer == null) {
OperandMaker.throwInvalidOperatorError(operatorName);
}
return _this;
}
UnaryOperand.prototype.getType = function () {
return "unary";
};
UnaryOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return (OperandMaker.operatorToString(this.operatorName) +
" " +
this.expression.toString(func));
};
UnaryOperand.prototype.evaluate = function (processValue) {
var value = this.expression.evaluate(processValue);
return this.consumer.call(this, value);
};
UnaryOperand.prototype.setVariables = function (variables) {
this.expression.setVariables(variables);
};
return UnaryOperand;
}(Operand));
var ArrayOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ArrayOperand, _super);
function ArrayOperand(values) {
var _this = _super.call(this) || this;
_this.values = values;
return _this;
}
ArrayOperand.prototype.getType = function () {
return "array";
};
ArrayOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return ("[" +
this.values
.map(function (el) {
return el.toString(func);
})
.join(", ") +
"]");
};
ArrayOperand.prototype.evaluate = function (processValue) {
return this.values.map(function (el) {
return el.evaluate(processValue);
});
};
ArrayOperand.prototype.setVariables = function (variables) {
this.values.forEach(function (el) {
el.setVariables(variables);
});
};
ArrayOperand.prototype.hasFunction = function () {
return this.values.some(function (operand) { return operand.hasFunction(); });
};
ArrayOperand.prototype.hasAsyncFunction = function () {
return this.values.some(function (operand) { return operand.hasAsyncFunction(); });
};
ArrayOperand.prototype.addToAsyncList = function (list) {
this.values.forEach(function (operand) { return operand.addToAsyncList(list); });
};
return ArrayOperand;
}(Operand));
var Const = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Const, _super);
function Const(value) {
var _this = _super.call(this) || this;
_this.value = value;
return _this;
}
Const.prototype.getType = function () {
return "const";
};
Const.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return this.value.toString();
};
Object.defineProperty(Const.prototype, "correctValue", {
get: function () {
return this.getCorrectValue(this.value);
},
enumerable: true,
configurable: true
});
Const.prototype.evaluate = function () {
return this.getCorrectValue(this.value);
};
Const.prototype.setVariables = function (variables) { };
Const.prototype.getCorrectValue = function (value) {
if (!value || typeof value != "string")
return value;
if (this.isBooleanValue(value))
return value.toLowerCase() === "true";
if (OperandMaker.isNumeric(value)) {
if (value.indexOf("0x") == 0)
return parseInt(value);
return parseFloat(value);
}
return value;
};
Const.prototype.isBooleanValue = function (value) {
return (value &&
(value.toLowerCase() === "true" || value.toLowerCase() === "false"));
};
return Const;
}(Operand));
var Variable = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Variable, _super);
function Variable(variableName) {
var _this = _super.call(this, variableName) || this;
_this.variableName = variableName;
return _this;
}
Variable.prototype.getType = function () {
return "variable";
};
Variable.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return "{" + this.variableName + "}";
};
Object.defineProperty(Variable.prototype, "variable", {
get: function () {
return this.variableName;
},
enumerable: true,
configurable: true
});
Variable.prototype.evaluate = function (processValue) {
return processValue.hasValue(this.variableName)
? this.getCorrectValue(processValue.getValue(this.variableName))
: null;
};
Variable.prototype.setVariables = function (variables) {
variables.push(this.variableName);
};
return Variable;
}(Const));
var FunctionOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(FunctionOperand, _super);
function FunctionOperand(origionalValue, parameters) {
var _this = _super.call(this) || this;
_this.origionalValue = origionalValue;
_this.parameters = parameters;
_this.isReadyValue = false;
if (Array.isArray(parameters) && parameters.length === 0) {
_this.parameters = new ArrayOperand([]);
}
return _this;
}
FunctionOperand.prototype.getType = function () {
return "function";
};
FunctionOperand.prototype.evaluateAsync = function (processValue) {
var _this = this;
this.isReadyValue = false;
var asyncProcessValue = new __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__["a" /* ProcessValue */]();
asyncProcessValue.values = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].createCopy(processValue.values);
asyncProcessValue.properties = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].createCopy(processValue.properties);
asyncProcessValue.properties.returnResult = function (result) {
_this.asynResult = result;
_this.isReadyValue = true;
_this.onAsyncReady();
};
this.evaluateCore(asyncProcessValue);
};
FunctionOperand.prototype.evaluate = function (processValue) {
if (this.isReady)
return this.asynResult;
return this.evaluateCore(processValue);
};
FunctionOperand.prototype.evaluateCore = function (processValue) {
return __WEBPACK_IMPORTED_MODULE_2__functionsfactory__["a" /* FunctionFactory */].Instance.run(this.origionalValue, this.parameters.evaluate(processValue), processValue.properties);
};
FunctionOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return this.origionalValue + "(" + this.parameters.toString(func) + ")";
};
FunctionOperand.prototype.setVariables = function (variables) {
this.parameters.setVariables(variables);
};
Object.defineProperty(FunctionOperand.prototype, "isReady", {
get: function () {
return this.isReadyValue;
},
enumerable: true,
configurable: true
});
FunctionOperand.prototype.hasFunction = function () {
return true;
};
FunctionOperand.prototype.hasAsyncFunction = function () {
return __WEBPACK_IMPORTED_MODULE_2__functionsfactory__["a" /* FunctionFactory */].Instance.isAsyncFunction(this.origionalValue);
};
FunctionOperand.prototype.addToAsyncList = function (list) {
if (this.hasAsyncFunction()) {
list.push(this);
}
};
return FunctionOperand;
}(Operand));
var OperandMaker = /** @class */ (function () {
function OperandMaker() {
}
OperandMaker.throwInvalidOperatorError = function (op) {
throw new Error("Invalid operator: '" + op + "'");
};
OperandMaker.safeToString = function (operand, func) {
return operand == null ? "" : operand.toString(func);
};
OperandMaker.toOperandString = function (value) {
if (!!value &&
!OperandMaker.isNumeric(value) &&
!OperandMaker.isBooleanValue(value))
value = "'" + value + "'";
return value;
};
OperandMaker.isSpaceString = function (str) {
return !!str && !str.replace(" ", "");
};
OperandMaker.isNumeric = function (value) {
if (!!value &&
(value.indexOf("-") > -1 ||
value.indexOf("+") > 1 ||
value.indexOf("*") > -1 ||
value.indexOf("^") > -1 ||
value.indexOf("/") > -1 ||
value.indexOf("%") > -1))
return false;
if (OperandMaker.isSpaceString(value))
return false;
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isNumber(value);
};
OperandMaker.isBooleanValue = function (value) {
return (!!value &&
(value.toLowerCase() === "true" || value.toLowerCase() === "false"));
};
OperandMaker.operatorToString = function (operatorName) {
var opStr = OperandMaker.signs[operatorName];
return opStr == null ? operatorName : opStr;
};
OperandMaker.unaryFunctions = {
empty: function (value) {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value);
},
notempty: function (value) {
return !OperandMaker.unaryFunctions.empty(value);
},
negate: function (value) {
return !value;
}
};
OperandMaker.binaryFunctions = {
arithmeticOp: function (operatorName) {
return function (a, b) {
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(a) && !OperandMaker.isSpaceString(a)) {
a = typeof b === "string" ? "" : 0;
}
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(b) && !OperandMaker.isSpaceString(b)) {
b = typeof a === "string" ? "" : 0;
}
var consumer = OperandMaker.binaryFunctions[operatorName];
return consumer == null ? null : consumer.call(this, a, b);
};
},
and: function (a, b) {
return a && b;
},
or: function (a, b) {
return a || b;
},
plus: function (a, b) {
return a + b;
},
minus: function (a, b) {
return a - b;
},
mul: function (a, b) {
return a * b;
},
div: function (a, b) {
if (!b)
return null;
return a / b;
},
mod: function (a, b) {
if (!b)
return null;
return a % b;
},
power: function (a, b) {
return Math.pow(a, b);
},
greater: function (left, right) {
if (left == null || right == null)
return false;
return left > right;
},
less: function (left, right) {
if (left == null || right == null)
return false;
return left < right;
},
greaterorequal: function (left, right) {
if (left == null || right == null)
return false;
return left >= right;
},
lessorequal: function (left, right) {
if (left == null || right == null)
return false;
return left <= right;
},
equal: function (left, right) {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(left, right, true);
},
notequal: function (left, right) {
return !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(left, right, true);
},
contains: function (left, right) {
return OperandMaker.binaryFunctions.containsCore(left, right, true);
},
notcontains: function (left, right) {
if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
return OperandMaker.binaryFunctions.containsCore(left, right, false);
},
anyof: function (left, right) {
if (!left && __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
if (!left || (!Array.isArray(left) && left.length === 0))
return false;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
if (!Array.isArray(left))
return OperandMaker.binaryFunctions.contains(right, left);
if (!Array.isArray(right))
return OperandMaker.binaryFunctions.contains(left, right);
for (var i = 0; i < right.length; i++) {
if (OperandMaker.binaryFunctions.contains(left, right[i]))
return true;
}
return false;
},
allof: function (left, right) {
if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return false;
if (!Array.isArray(right))
return OperandMaker.binaryFunctions.contains(left, right);
for (var i = 0; i < right.length; i++) {
if (!OperandMaker.binaryFunctions.contains(left, right[i]))
return false;
}
return true;
},
containsCore: function (left, right, isContains) {
if (!left)
return false;
if (!left.length) {
left = left.toString();
}
if (typeof left === "string" || left instanceof String) {
if (!right)
return false;
right = right.toString();
var found = left.indexOf(right) > -1;
return isContains ? found : !found;
}
var rightArray = Array.isArray(right) ? right : [right];
for (var rIndex = 0; rIndex < rightArray.length; rIndex++) {
var i = 0;
right = rightArray[rIndex];
for (; i < left.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(left[i], right))
break;
}
if (i == left.length)
return !isContains;
}
return isContains;
}
};
OperandMaker.signs = {
less: "<",
lessorequal: "<=",
greater: ">",
greaterorequal: ">=",
equal: "==",
notequal: "!=",
plus: "+",
minus: "-",
mul: "*",
div: "/",
and: "and",
or: "or",
power: "^",
mod: "%",
negate: "!"
};
return OperandMaker;
}());
/***/ }),
/* 28 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionFactory; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return registerFunction; });
var FunctionFactory = /** @class */ (function () {
function FunctionFactory() {
this.functionHash = {};
this.isAsyncHash = {};
}
FunctionFactory.prototype.register = function (name, func, isAsync) {
if (isAsync === void 0) { isAsync = false; }
this.functionHash[name] = func;
if (isAsync)
this.isAsyncHash[name] = true;
};
FunctionFactory.prototype.unregister = function (name) {
delete this.functionHash[name];
delete this.isAsyncHash[name];
};
FunctionFactory.prototype.hasFunction = function (name) {
return !!this.functionHash[name];
};
FunctionFactory.prototype.isAsyncFunction = function (name) {
return !!this.isAsyncHash[name];
};
FunctionFactory.prototype.clear = function () {
this.functionHash = {};
};
FunctionFactory.prototype.getAll = function () {
var result = [];
for (var key in this.functionHash) {
result.push(key);
}
return result.sort();
};
FunctionFactory.prototype.run = function (name, params, properties) {
if (properties === void 0) { properties = null; }
var func = this.functionHash[name];
if (!func)
return null;
var classRunner = {
func: func
};
if (properties) {
for (var key in properties) {
classRunner[key] = properties[key];
}
}
return classRunner.func(params);
};
FunctionFactory.Instance = new FunctionFactory();
return FunctionFactory;
}());
var registerFunction = FunctionFactory.Instance.register;
function getParamsAsArray(value, arr) {
if (!value)
return;
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
getParamsAsArray(value[i], arr);
}
}
else {
arr.push(value);
}
}
function sum(params) {
var arr = [];
getParamsAsArray(params, arr);
var res = 0;
for (var i = 0; i < arr.length; i++) {
res += arr[i];
}
return res;
}
FunctionFactory.Instance.register("sum", sum);
function count(params) {
var arr = [];
getParamsAsArray(params, arr);
return arr.length;
}
FunctionFactory.Instance.register("count", count);
function avg(params) {
var arr = [];
getParamsAsArray(params, arr);
var res = 0;
for (var i = 0; i < arr.length; i++) {
res += arr[i];
}
return arr.length > 0 ? res / arr.length : 0;
}
FunctionFactory.Instance.register("avg", avg);
function getInArrayParams(params) {
if (params.length != 2)
return null;
var arr = params[0];
if (!arr)
return null;
if (!Array.isArray(arr) && !Array.isArray(Object.keys(arr)))
return null;
var name = params[1];
if (typeof name !== "string" && !(name instanceof String))
return null;
return { data: arr, name: name };
}
function calcInArray(params, func) {
var v = getInArrayParams(params);
if (!v)
return undefined;
var res = undefined;
if (Array.isArray(v.data)) {
for (var i = 0; i < v.data.length; i++) {
var item = v.data[i];
if (!!item && item[v.name]) {
res = func(res, item[v.name]);
}
}
}
else {
for (var key in v.data) {
var item = v.data[key];
if (!!item && item[v.name]) {
res = func(res, item[v.name]);
}
}
}
return res;
}
function sumInArray(params) {
var res = calcInArray(params, function (res, val) {
if (res == undefined)
res = 0;
return +res + +val;
});
return res !== undefined ? res : 0;
}
FunctionFactory.Instance.register("sumInArray", sumInArray);
function minInArray(params) {
return calcInArray(params, function (res, val) {
if (res == undefined)
return val;
return res < val ? res : val;
});
}
FunctionFactory.Instance.register("minInArray", minInArray);
function maxInArray(params) {
return calcInArray(params, function (res, val) {
if (res == undefined)
return val;
return res > val ? res : val;
});
}
FunctionFactory.Instance.register("maxInArray", maxInArray);
function countInArray(params) {
var res = calcInArray(params, function (res, val) {
if (res == undefined)
res = 0;
return res + 1;
});
return res !== undefined ? res : 0;
}
FunctionFactory.Instance.register("countInArray", countInArray);
function avgInArray(params) {
var count = countInArray(params);
if (count == 0)
return 0;
return sumInArray(params) / count;
}
FunctionFactory.Instance.register("avgInArray", avgInArray);
function iif(params) {
if (!params && params.length !== 3)
return "";
return params[0] ? params[1] : params[2];
}
FunctionFactory.Instance.register("iif", iif);
function getDate(params) {
if (!params && params.length < 1)
return null;
if (!params[0])
return null;
return new Date(params[0]);
}
FunctionFactory.Instance.register("getDate", getDate);
function age(params) {
if (!params && params.length < 1)
return null;
if (!params[0])
return null;
var birthDay = new Date(params[0]);
var ageDifMs = Date.now() - birthDay.getTime();
var ageDate = new Date(ageDifMs); // miliseconds from epoch
return Math.abs(ageDate.getUTCFullYear() - 1970);
}
FunctionFactory.Instance.register("age", age);
function isContainerReady(params) {
if (!params && params.length < 1)
return false;
if (!params[0] || !this.survey)
return false;
var name = params[0];
var container = this.survey.getPageByName(name);
if (!container)
container = this.survey.getPanelByName(name);
if (!container)
return false;
var questions = container.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].hasErrors(false))
return false;
}
return true;
}
FunctionFactory.Instance.register("isContainerReady", isContainerReady);
function isDisplayMode() {
return this.survey && this.survey.isDisplayMode;
}
FunctionFactory.Instance.register("isDisplayMode", isDisplayMode);
function currentDate() {
return new Date();
}
FunctionFactory.Instance.register("currentDate", currentDate);
/***/ }),
/* 29 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__martixBase__ = __webpack_require__(43);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__question_expression__ = __webpack_require__(47);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__functionsfactory__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return matrixDropdownColumnTypes; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownColumn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDropdownCell; });
/* unused harmony export MatrixDropdownTotalCell */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return MatrixDropdownRowModelBase; });
/* unused harmony export MatrixDropdownTotalRowModel */
/* unused harmony export QuestionMatrixDropdownRenderedCell */
/* unused harmony export QuestionMatrixDropdownRenderedRow */
/* unused harmony export QuestionMatrixDropdownRenderedTable */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return QuestionMatrixDropdownModelBase; });
function onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data) {
if (cellQuestion.hasOther) {
cellQuestion.storeOthersAsComment = false;
}
if ((!cellQuestion.choices || cellQuestion.choices.length == 0) &&
cellQuestion.choicesByUrl.isEmpty) {
cellQuestion.choices = question.choices;
}
if (!cellQuestion.choicesByUrl.isEmpty) {
cellQuestion.choicesByUrl.run(data);
}
}
var matrixDropdownColumnTypes = {
dropdown: {
properties: [
"choices",
"choicesOrder",
"choicesByUrl",
"optionsCaption",
"otherText",
"choicesVisibleIf"
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
if (cellQuestion.locOptionsCaption.isEmpty &&
!question.locOptionsCaption.isEmpty) {
cellQuestion.optionsCaption = question.optionsCaption;
}
}
},
checkbox: {
properties: [
"choices",
"choicesOrder",
"choicesByUrl",
"otherText",
"choicesVisibleIf"
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
cellQuestion.colCount =
column.colCount > -1 ? column.colCount : question.columnColCount;
}
},
radiogroup: {
properties: [
"choices",
"choicesOrder",
"choicesByUrl",
"otherText",
"choicesVisibleIf"
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
cellQuestion.colCount =
column.colCount > -1 ? column.colCount : question.columnColCount;
}
},
text: {
properties: ["placeHolder", "inputType", "maxLength"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { }
},
comment: {
properties: ["placeHolder", "rows", "maxLength"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { }
},
boolean: {
properties: ["defaultValue"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
cellQuestion.showTitle = true;
}
},
expression: {
properties: ["expression", "displayStyle", "currency"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { }
},
rating: {
properties: ["rateValues"]
}
};
var MatrixDropdownColumn = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownColumn, _super);
function MatrixDropdownColumn(name, title) {
if (title === void 0) { title = null; }
var _this = _super.call(this) || this;
_this.colOwnerValue = null;
_this.indexValue = -1;
_this._isVisible = true;
_this._hasVisibleCell = true;
var self = _this;
_this.createLocalizableString("totalFormat", _this);
_this.registerFunctionOnPropertiesValueChanged([
"totalType",
"totalExpression",
"totalFormat",
"totalCurrency",
"totalDisplayStyle",
"totalMaximumFractionDigits",
"totalMinimumFractionDigits"
], function () {
self.doColumnPropertiesChanged();
});
_this.updateTemplateQuestion();
_this.name = name;
if (title)
_this.title = title;
return _this;
}
MatrixDropdownColumn.getColumnTypes = function () {
var res = [];
for (var key in matrixDropdownColumnTypes) {
res.push(key);
}
return res;
};
MatrixDropdownColumn.prototype.getDynamicPropertyName = function () {
return "cellType";
};
MatrixDropdownColumn.prototype.getDynamicType = function () {
return this.calcCellQuestionType();
};
MatrixDropdownColumn.prototype.getDynamicProperties = function () {
var qType = this.calcCellQuestionType();
var qDefinition = matrixDropdownColumnTypes[qType];
if (qDefinition)
return qDefinition.properties;
return [];
};
Object.defineProperty(MatrixDropdownColumn.prototype, "colOwner", {
get: function () {
return this.colOwnerValue;
},
set: function (value) {
this.colOwnerValue = value;
this.updateTemplateQuestion();
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
this.locTitle.strChanged();
};
MatrixDropdownColumn.prototype.addUsedLocales = function (locales) {
_super.prototype.addUsedLocales.call(this, locales);
this.templateQuestion.addUsedLocales(locales);
};
Object.defineProperty(MatrixDropdownColumn.prototype, "index", {
get: function () {
return this.indexValue;
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.setIndex = function (val) {
this.indexValue = val;
};
MatrixDropdownColumn.prototype.getType = function () {
return "matrixdropdowncolumn";
};
Object.defineProperty(MatrixDropdownColumn.prototype, "cellType", {
get: function () {
return this.getPropertyValue("cellType");
},
set: function (val) {
val = val.toLocaleLowerCase();
this.setPropertyValue("cellType", val);
this.updateTemplateQuestion();
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "templateQuestion", {
get: function () {
return this.templateQuestionValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "value", {
get: function () {
return this.templateQuestion.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isVisible", {
get: function () {
return this._isVisible;
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.setIsVisible = function (newVal) {
this._isVisible = newVal;
};
Object.defineProperty(MatrixDropdownColumn.prototype, "hasVisibleCell", {
get: function () {
return this._hasVisibleCell;
},
set: function (newVal) {
this._hasVisibleCell = newVal;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "name", {
get: function () {
return this.templateQuestion.name;
},
set: function (val) {
this.templateQuestion.name = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "title", {
get: function () {
return this.templateQuestion.title;
},
set: function (val) {
this.templateQuestion.title = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locTitle", {
get: function () {
return this.templateQuestion.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "fullTitle", {
get: function () {
return this.locTitle.textOrHtml;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isRequired", {
get: function () {
return this.templateQuestion.isRequired;
},
set: function (val) {
this.templateQuestion.isRequired = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "requiredErrorText", {
get: function () {
return this.templateQuestion.requiredErrorText;
},
set: function (val) {
this.templateQuestion.requiredErrorText = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locRequiredErrorText", {
get: function () {
return this.templateQuestion.locRequiredErrorText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "readOnly", {
get: function () {
return this.templateQuestion.readOnly;
},
set: function (val) {
this.templateQuestion.readOnly = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "hasOther", {
get: function () {
return this.templateQuestion.hasOther;
},
set: function (val) {
this.templateQuestion.hasOther = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "visibleIf", {
get: function () {
return this.templateQuestion.visibleIf;
},
set: function (val) {
this.templateQuestion.visibleIf = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "enableIf", {
get: function () {
return this.templateQuestion.enableIf;
},
set: function (val) {
this.templateQuestion.enableIf = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "requiredIf", {
get: function () {
return this.templateQuestion.requiredIf;
},
set: function (val) {
this.templateQuestion.requiredIf = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "hasCondition", {
get: function () {
return (!!this.visibleIf ||
!!this.enableIf ||
!!this.requiredIf ||
this.cellType === "expression");
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "validators", {
get: function () {
return this.templateQuestion.validators;
},
set: function (val) {
this.templateQuestion.validators = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalType", {
get: function () {
return this.getPropertyValue("totalType", "none");
},
set: function (val) {
this.setPropertyValue("totalType", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalExpression", {
get: function () {
return this.getPropertyValue("totalExpression");
},
set: function (val) {
this.setPropertyValue("totalExpression", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "hasTotal", {
get: function () {
return this.totalType != "none" || !!this.totalExpression;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalFormat", {
get: function () {
return this.getLocalizableStringText("totalFormat", "");
},
set: function (val) {
this.setLocalizableStringText("totalFormat", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locTotalFormat", {
get: function () {
return this.getLocalizableString("totalFormat");
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalMaximumFractionDigits", {
get: function () {
return this.getPropertyValue("totalMaximumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("totalMaximumFractionDigits", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalMinimumFractionDigits", {
get: function () {
return this.getPropertyValue("totalMinimumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("totalMinimumFractionDigits", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalDisplayStyle", {
get: function () {
return this.getPropertyValue("totalDisplayStyle");
},
set: function (val) {
this.setPropertyValue("totalDisplayStyle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalCurrency", {
get: function () {
return this.getPropertyValue("totalCurrency");
},
set: function (val) {
if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__question_expression__["b" /* getCurrecyCodes */])().indexOf(val) < 0)
return;
this.setPropertyValue("totalCurrency", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "minWidth", {
get: function () {
return this.getPropertyValue("minWidth", "");
},
set: function (val) {
this.setPropertyValue("minWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "width", {
get: function () {
return this.getPropertyValue("width", "");
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "colCount", {
get: function () {
return this.getPropertyValue("colCount", -1);
},
set: function (val) {
if (val < -1 || val > 4)
return;
this.setPropertyValue("colCount", val);
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.getLocale = function () {
return this.colOwner ? this.colOwner.getLocale() : "";
};
MatrixDropdownColumn.prototype.getMarkdownHtml = function (text) {
return this.colOwner ? this.colOwner.getMarkdownHtml(text) : null;
};
MatrixDropdownColumn.prototype.getProcessedText = function (text) {
return this.colOwner ? this.colOwner.getProcessedText(text) : text;
};
MatrixDropdownColumn.prototype.createCellQuestion = function (data) {
var qType = this.calcCellQuestionType();
var cellQuestion = this.createNewQuestion(qType);
this.updateCellQuestion(cellQuestion, data);
return cellQuestion;
};
MatrixDropdownColumn.prototype.updateCellQuestion = function (cellQuestion, data) {
this.setQuestionProperties(cellQuestion);
var qType = cellQuestion.getType();
var qDefinition = matrixDropdownColumnTypes[qType];
if (qDefinition && qDefinition["onCellQuestionUpdate"]) {
qDefinition["onCellQuestionUpdate"](cellQuestion, this, this.colOwner, data);
}
};
MatrixDropdownColumn.prototype.defaultCellTypeChanged = function () {
this.updateTemplateQuestion();
};
MatrixDropdownColumn.prototype.calcCellQuestionType = function () {
if (this.cellType !== "default")
return this.cellType;
if (this.colOwner)
return this.colOwner.getCellType();
return __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType;
};
MatrixDropdownColumn.prototype.updateTemplateQuestion = function () {
var prevCellType = this.templateQuestion
? this.templateQuestion.getType()
: "";
var curCellType = this.calcCellQuestionType();
if (curCellType === prevCellType)
return;
if (this.templateQuestion) {
this.removeProperties(prevCellType);
}
this.templateQuestionValue = this.createNewQuestion(curCellType);
this.templateQuestion.locOwner = this;
this.addProperties(curCellType);
var self = this;
this.templateQuestion.onPropertyChanged.add(function () {
self.doColumnPropertiesChanged();
});
};
MatrixDropdownColumn.prototype.createNewQuestion = function (cellType) {
var question = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].createClass(cellType);
if (!question) {
question = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].createClass("text");
}
this.setQuestionProperties(question);
return question;
};
MatrixDropdownColumn.prototype.setQuestionProperties = function (question) {
if (this.templateQuestion) {
var json = new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */]().toJsonObject(this.templateQuestion, true);
json.type = question.getType();
question.startLoadingFromJson();
new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */]().toObject(json, question);
question.endLoadingFromJson();
question.onSurveyLoad();
}
};
MatrixDropdownColumn.prototype.propertyValueChanged = function (name, oldValue, newValue) {
_super.prototype.propertyValueChanged.call(this, name, oldValue, newValue);
this.doColumnPropertiesChanged();
};
MatrixDropdownColumn.prototype.doColumnPropertiesChanged = function () {
if (this.colOwner != null && !this.isLoadingFromJson) {
this.colOwner.onColumnPropertiesChanged(this);
}
};
MatrixDropdownColumn.prototype.getProperties = function (curCellType) {
var qDef = matrixDropdownColumnTypes[curCellType];
if (!qDef || !qDef.properties)
return [];
return __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].findProperties(curCellType, qDef.properties);
};
MatrixDropdownColumn.prototype.removeProperties = function (curCellType) {
var properties = this.getProperties(curCellType);
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
delete this[prop.name];
if (prop.serializationProperty) {
delete this[prop.serializationProperty];
}
}
};
MatrixDropdownColumn.prototype.addProperties = function (curCellType) {
var question = this.templateQuestion;
var properties = this.getProperties(curCellType);
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
this.addProperty(question, prop.name, false);
if (prop.serializationProperty) {
this.addProperty(question, prop.serializationProperty, true);
}
}
};
MatrixDropdownColumn.prototype.addProperty = function (question, propName, isReadOnly) {
var desc = {
configurable: true,
get: function () {
return question[propName];
}
};
if (!isReadOnly) {
desc["set"] = function (v) {
question[propName] = v;
};
}
Object.defineProperty(this, propName, desc);
};
return MatrixDropdownColumn;
}(__WEBPACK_IMPORTED_MODULE_4__base__["b" /* Base */]));
var MatrixDropdownCell = /** @class */ (function () {
function MatrixDropdownCell(column, row, data) {
this.column = column;
this.row = row;
this.data = data;
this.questionValue = this.createQuestion(column, row, data);
this.questionValue.updateCustomWidget();
}
MatrixDropdownCell.prototype.createQuestion = function (column, row, data) {
var res = data.createQuestion(this.row, this.column);
res.validateValueCallback = function () {
return data.validateCell(row, column.name, row.value);
};
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* CustomPropertiesCollection */].getProperties(column.getType()).forEach(function (property) {
var propertyName = property.name;
if (column[propertyName] !== undefined) {
res[propertyName] = column[propertyName];
}
});
return res;
};
Object.defineProperty(MatrixDropdownCell.prototype, "question", {
get: function () {
return this.questionValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownCell.prototype, "value", {
get: function () {
return this.question.value;
},
set: function (value) {
this.question.value = value;
},
enumerable: true,
configurable: true
});
MatrixDropdownCell.prototype.runCondition = function (values, properties) {
this.question.runCondition(values, properties);
};
Object.defineProperty(MatrixDropdownCell.prototype, "hasCondition", {
get: function () {
return (!!this.question.visibleIf ||
!!this.question.enableIf ||
!!this.question.requiredIf ||
this.question.getType() === "expression");
},
enumerable: true,
configurable: true
});
return MatrixDropdownCell;
}());
var MatrixDropdownTotalCell = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownTotalCell, _super);
function MatrixDropdownTotalCell(column, row, data) {
var _this = _super.call(this, column, row, data) || this;
_this.column = column;
_this.row = row;
_this.data = data;
_this.updateCellQuestion();
return _this;
}
MatrixDropdownTotalCell.prototype.createQuestion = function (column, row, data) {
var res = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].createClass("expression");
res.setSurveyImpl(row);
return res;
};
MatrixDropdownTotalCell.prototype.updateCellQuestion = function () {
this.question.locCalculation();
this.column.updateCellQuestion(this.question, null);
this.question.expression = this.getTotalExpression();
this.question.format = this.column.totalFormat;
this.question.currency = this.column.totalCurrency;
this.question.displayStyle = this.column.totalDisplayStyle;
this.question.maximumFractionDigits = this.column.totalMaximumFractionDigits;
this.question.minimumFractionDigits = this.column.totalMinimumFractionDigits;
this.question.unlocCalculation();
};
MatrixDropdownTotalCell.prototype.getTotalExpression = function () {
if (!!this.column.totalExpression)
return this.column.totalExpression;
if (this.column.totalType == "none")
return "";
var funName = this.column.totalType + "InArray";
if (!__WEBPACK_IMPORTED_MODULE_11__functionsfactory__["a" /* FunctionFactory */].Instance.hasFunction(funName))
return "";
return funName + "({self}, '" + this.column.name + "')";
};
return MatrixDropdownTotalCell;
}(MatrixDropdownCell));
var MatrixDropdownRowModelBase = /** @class */ (function () {
function MatrixDropdownRowModelBase(data, value) {
this.isSettingValue = false;
this.cells = [];
this.data = data;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__["a" /* TextPreProcessor */]();
var self = this;
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
this.idValue = MatrixDropdownRowModelBase.getId();
}
MatrixDropdownRowModelBase.getId = function () {
return "srow_" + MatrixDropdownRowModelBase.idCounter++;
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "id", {
get: function () {
return this.idValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowName", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "value", {
get: function () {
var result = {};
for (var i = 0; i < this.cells.length; i++) {
var question = this.cells[i].question;
if (!question.isEmpty()) {
result[question.getValueName()] = question.value;
}
}
return result;
},
set: function (value) {
this.isSettingValue = true;
for (var i = 0; i < this.cells.length; i++) {
var question = this.cells[i].question;
var val = !!value ? value[question.getValueName()] : null;
question.updateValueFromSurvey(val);
question.onSurveyValueChanged(val);
}
this.isSettingValue = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "locText", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getAllValues = function () {
return this.value;
};
MatrixDropdownRowModelBase.prototype.getFilteredValues = function () {
var allValues = this.getAllValues();
var values = { row: allValues };
for (var key in allValues) {
values[key] = allValues[key];
}
return values;
};
MatrixDropdownRowModelBase.prototype.getFilteredProperties = function () {
return { survey: this.getSurvey(), row: this };
};
MatrixDropdownRowModelBase.prototype.runCondition = function (values, properties) {
if (!!this.data) {
values[MatrixDropdownRowModelBase.OwnerVariableName] = this.data.value;
}
values[MatrixDropdownRowModelBase.IndexVariableName] = this.rowIndex;
if (!properties)
properties = {};
properties[MatrixDropdownRowModelBase.RowVariableName] = this;
for (var i = 0; i < this.cells.length; i++) {
values[MatrixDropdownRowModelBase.RowVariableName] = this.value;
this.cells[i].runCondition(values, properties);
}
};
MatrixDropdownRowModelBase.prototype.onAnyValueChanged = function (name) {
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onAnyValueChanged(name);
}
};
MatrixDropdownRowModelBase.prototype.getDataValueCore = function (valuesHash, key) {
var survey = this.getSurvey();
if (!!survey) {
return survey.getDataValueCore(valuesHash, key);
}
else {
return valuesHash[key];
}
};
MatrixDropdownRowModelBase.prototype.getValue = function (name) {
var question = this.getQuestionByColumnName(name);
return !!question ? question.value : null;
};
MatrixDropdownRowModelBase.prototype.setValue = function (name, newColumnValue) {
if (this.isSettingValue)
return;
var newValue = this.value;
var changedValue = this.getValue(name);
var changedQuestion = this.getQuestionByColumnName(name);
var changingValue = this.data.onRowChanging(this, name, newValue);
if (!!changedQuestion &&
!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(changingValue, changedValue)) {
this.getQuestionByColumnName(name).value = changingValue;
}
else {
this.data.onRowChanged(this, name, newValue, newColumnValue == null && !changedQuestion);
this.onAnyValueChanged(MatrixDropdownRowModelBase.RowVariableName);
}
};
MatrixDropdownRowModelBase.prototype.getVariable = function (name) {
return undefined;
};
MatrixDropdownRowModelBase.prototype.setVariable = function (name, newValue) { };
MatrixDropdownRowModelBase.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].commentPrefix);
return result ? result : "";
};
MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue, locNotification) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].commentPrefix, newValue);
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isEmpty", {
get: function () {
var val = this.value;
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(val))
return true;
for (var key in val) {
if (val[key] !== undefined && val[key] !== null)
return false;
}
return true;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getQuestionByColumn = function (column) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column == column)
return this.cells[i].question;
}
return null;
};
MatrixDropdownRowModelBase.prototype.getQuestionByColumnName = function (columnName) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column.name == columnName)
return this.cells[i].question;
}
return null;
};
MatrixDropdownRowModelBase.prototype.getSharedQuestionByName = function (columnName) {
return !!this.data
? this.data.getSharedQuestionByName(columnName, this)
: null;
};
MatrixDropdownRowModelBase.prototype.clearIncorrectValues = function (val) {
for (var key in val) {
var question = this.getQuestionByColumnName(key);
if (question) {
var qVal = question.value;
question.clearIncorrectValues();
if (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(qVal, question.value)) {
this.setValue(key, question.value);
}
}
else {
if (!this.getSharedQuestionByName(key)) {
this.setValue(key, null);
}
}
}
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "hasCondition", {
get: function () {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].hasCondition)
return true;
}
return false;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getLocale = function () {
return this.data ? this.data.getLocale() : "";
};
MatrixDropdownRowModelBase.prototype.getMarkdownHtml = function (text) {
return this.data ? this.data.getMarkdownHtml(text) : null;
};
MatrixDropdownRowModelBase.prototype.getProcessedText = function (text) {
return this.data ? this.data.getProcessedText(text) : text;
};
MatrixDropdownRowModelBase.prototype.locStrsChanged = function () {
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.locStrsChanged();
}
};
MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnChanged = function (column) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column === column) {
this.updateCellOnColumnChanged(this.cells[i]);
return;
}
}
};
MatrixDropdownRowModelBase.prototype.onQuestionReadOnlyChanged = function (parentIsReadOnly) {
for (var i = 0; i < this.cells.length; i++) {
if (!!this.cells[i].question) {
this.cells[i].question.readOnly = parentIsReadOnly;
}
}
};
MatrixDropdownRowModelBase.prototype.updateCellOnColumnChanged = function (cell) {
cell.column.updateCellQuestion(cell.question, this);
};
MatrixDropdownRowModelBase.prototype.buildCells = function (value) {
this.isSettingValue = true;
var columns = this.data.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (!column.isVisible)
continue;
var cell = this.createCell(column);
this.cells.push(cell);
if (!!value && !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(value[column.name])) {
cell.question.value = value[column.name];
}
}
this.isSettingValue = false;
};
MatrixDropdownRowModelBase.prototype.createCell = function (column) {
return new MatrixDropdownCell(column, this, this.data);
};
MatrixDropdownRowModelBase.prototype.geSurveyData = function () {
return this;
};
MatrixDropdownRowModelBase.prototype.getSurvey = function () {
return this.data ? this.data.getSurvey() : null;
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowIndex", {
get: function () {
return !!this.data ? this.data.getRowIndex(this) + 1 : -1;
},
enumerable: true,
configurable: true
});
//ITextProcessor
MatrixDropdownRowModelBase.prototype.getProcessedTextValue = function (textValue) {
var firstName = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
textValue.isExists =
firstName == MatrixDropdownRowModelBase.RowVariableName;
textValue.canProcess = textValue.isExists;
if (!textValue.isExists)
return;
var values = { row: this.value };
textValue.value = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getValue(textValue.name, values);
};
MatrixDropdownRowModelBase.prototype.getTextProcessor = function () {
return this;
};
MatrixDropdownRowModelBase.prototype.processText = function (text, returnDisplayValue) {
text = this.textPreProcessor.process(text, returnDisplayValue);
if (!this.getSurvey())
return text;
return this.getSurvey().processText(text, returnDisplayValue);
};
MatrixDropdownRowModelBase.prototype.processTextEx = function (text, returnDisplayValue) {
text = this.processText(text, returnDisplayValue);
if (!this.getSurvey())
return text;
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = this.getSurvey().processTextEx(text, returnDisplayValue, false);
res.hasAllValuesOnLastRun =
res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
MatrixDropdownRowModelBase.RowVariableName = "row";
MatrixDropdownRowModelBase.OwnerVariableName = "self";
MatrixDropdownRowModelBase.IndexVariableName = "rowIndex";
MatrixDropdownRowModelBase.idCounter = 1;
return MatrixDropdownRowModelBase;
}());
var MatrixDropdownTotalRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownTotalRowModel, _super);
function MatrixDropdownTotalRowModel(data) {
var _this = _super.call(this, data, null) || this;
_this.buildCells(null);
return _this;
}
MatrixDropdownTotalRowModel.prototype.createCell = function (column) {
return new MatrixDropdownTotalCell(column, this, this.data);
};
MatrixDropdownTotalRowModel.prototype.setValue = function (name, newValue) {
if (!!this.data) {
this.data.onTotalValueChanged();
}
};
MatrixDropdownTotalRowModel.prototype.runCondition = function (values, properties) {
var counter = 0;
var prevValue;
do {
prevValue = __WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].getUnbindValue(this.value);
_super.prototype.runCondition.call(this, values, properties);
counter++;
} while (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(prevValue, this.value) && counter < 3);
};
MatrixDropdownTotalRowModel.prototype.updateCellOnColumnChanged = function (cell) {
cell.updateCellQuestion();
};
return MatrixDropdownTotalRowModel;
}(MatrixDropdownRowModelBase));
var QuestionMatrixDropdownRenderedCell = /** @class */ (function () {
function QuestionMatrixDropdownRenderedCell() {
this.minWidth = "";
this.width = "";
this.idValue = QuestionMatrixDropdownRenderedCell.counter++;
}
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasQuestion", {
get: function () {
return !!this.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasTitle", {
get: function () {
return !!this.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "id", {
get: function () {
return this.idValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedCell.counter = 1;
return QuestionMatrixDropdownRenderedCell;
}());
var QuestionMatrixDropdownRenderedRow = /** @class */ (function () {
function QuestionMatrixDropdownRenderedRow() {
this.cells = [];
this.idValue = QuestionMatrixDropdownRenderedRow.counter++;
}
Object.defineProperty(QuestionMatrixDropdownRenderedRow.prototype, "id", {
get: function () {
return this.idValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedRow.counter = 1;
return QuestionMatrixDropdownRenderedRow;
}());
var QuestionMatrixDropdownRenderedTable = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDropdownRenderedTable, _super);
function QuestionMatrixDropdownRenderedTable(matrix) {
var _this = _super.call(this) || this;
_this.matrix = matrix;
_this.createNewArray("rows");
_this.build();
return _this;
}
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showHeader", {
get: function () {
return this.getPropertyValue("showHeader");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showFooter", {
get: function () {
return this.matrix.hasFooter && this.matrix.isColumnLayoutHorizontal;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "hasFooter", {
get: function () {
return !!this.footerRow;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "hasRemoveRows", {
get: function () {
return this.hasRemoveRowsValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedTable.prototype.isRequireReset = function () {
return (this.hasRemoveRows != this.matrix.canRemoveRows ||
!this.matrix.isColumnLayoutHorizontal);
};
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "headerRow", {
get: function () {
return this.headerRowValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "footerRow", {
get: function () {
return this.footerRowValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "rows", {
get: function () {
return this.getPropertyValue("rows");
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedTable.prototype.build = function () {
this.hasRemoveRowsValue = this.matrix.canRemoveRows;
//build rows now
var rows = this.matrix.visibleRows;
this.buildHeader();
this.buildRows();
this.buildFooter();
};
QuestionMatrixDropdownRenderedTable.prototype.onAddedRow = function () {
if (this.rows.length >= this.matrix.visibleRows.length)
return;
this.rows.push(this.createHorizontalRow(this.matrix.visibleRows[this.matrix.visibleRows.length - 1]));
};
QuestionMatrixDropdownRenderedTable.prototype.onRemovedRow = function (index) {
if (this.rows.length <= index)
return;
this.rows.splice(index, 1);
};
QuestionMatrixDropdownRenderedTable.prototype.buildHeader = function () {
var colHeaders = this.matrix.isColumnLayoutHorizontal && this.matrix.showHeader;
var isShown = colHeaders ||
(this.matrix.hasRowText && !this.matrix.isColumnLayoutHorizontal);
this.setPropertyValue("showHeader", isShown);
if (!isShown)
return;
this.headerRowValue = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.hasRowText && this.matrix.showHeader) {
this.headerRow.cells.push(this.createHeaderCell(null));
}
if (this.matrix.isColumnLayoutHorizontal) {
for (var i = 0; i < this.matrix.visibleColumns.length; i++) {
var column = this.matrix.visibleColumns[i];
if (!column.hasVisibleCell)
continue;
this.headerRow.cells.push(this.createHeaderCell(column));
}
}
else {
var rows = this.matrix.visibleRows;
for (var i = 0; i < rows.length; i++) {
this.headerRow.cells.push(this.createTextCell(rows[i].locText));
}
if (this.matrix.hasFooter) {
this.headerRow.cells.push(this.createTextCell(this.matrix.getFooterText()));
}
}
if (this.hasRemoveRows) {
this.headerRow.cells.push(this.createHeaderCell(null));
}
};
QuestionMatrixDropdownRenderedTable.prototype.buildFooter = function () {
if (!this.showFooter)
return;
this.footerRowValue = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.hasRowText) {
this.footerRow.cells.push(this.createTextCell(this.matrix.getFooterText()));
}
var cells = this.matrix.visibleTotalRow.cells;
for (var i = 0; i < cells.length; i++) {
if (!cells[i].column.hasVisibleCell)
continue;
this.footerRow.cells.push(this.createEditCell(cells[i]));
}
if (this.hasRemoveRows) {
this.footerRow.cells.push(this.createHeaderCell(null));
}
};
QuestionMatrixDropdownRenderedTable.prototype.buildRows = function () {
var rows = this.matrix.isColumnLayoutHorizontal
? this.buildHorizontalRows()
: this.buildVerticalRows();
this.setPropertyValue("rows", rows);
};
QuestionMatrixDropdownRenderedTable.prototype.canRemoveRow = function (row) {
return this.matrix.canRemoveRow(row);
};
QuestionMatrixDropdownRenderedTable.prototype.buildHorizontalRows = function () {
var rows = this.matrix.visibleRows;
var renderedRows = [];
for (var i = 0; i < rows.length; i++) {
renderedRows.push(this.createHorizontalRow(rows[i]));
}
return renderedRows;
};
QuestionMatrixDropdownRenderedTable.prototype.createHorizontalRow = function (row) {
var res = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.hasRowText) {
res.cells.push(this.createTextCell(row.locText));
}
for (var i = 0; i < row.cells.length; i++) {
var cell = row.cells[i];
if (!cell.column.hasVisibleCell)
continue;
res.cells.push(this.createEditCell(cell));
}
if (this.hasRemoveRows) {
res.cells.push(this.createRemoveRowCell(row));
}
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.buildVerticalRows = function () {
var columns = this.matrix.columns;
var renderedRows = [];
for (var i = 0; i < columns.length; i++) {
if (columns[i].isVisible && columns[i].hasVisibleCell) {
renderedRows.push(this.createVerticalRow(columns[i], i));
}
}
if (this.hasRemoveRows) {
renderedRows.push(this.createVerticalRemoveRow());
}
return renderedRows;
};
QuestionMatrixDropdownRenderedTable.prototype.createVerticalRow = function (column, index) {
var res = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.showHeader) {
res.cells.push(this.createTextCell(column.locTitle));
}
var rows = this.matrix.visibleRows;
for (var i = 0; i < rows.length; i++) {
res.cells.push(this.createEditCell(rows[i].cells[index]));
}
if (this.matrix.hasTotal) {
res.cells.push(this.createEditCell(this.matrix.visibleTotalRow.cells[index]));
}
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createVerticalRemoveRow = function () {
var res = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.showHeader) {
res.cells.push(this.createTextCell(null));
}
var rows = this.matrix.visibleRows;
for (var i = 0; i < rows.length; i++) {
res.cells.push(this.createRemoveRowCell(rows[i]));
}
if (this.matrix.hasTotal) {
res.cells.push(this.createTextCell(null));
}
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createEditCell = function (cell) {
var res = new QuestionMatrixDropdownRenderedCell();
res.cell = cell;
res.row = cell.row;
res.question = cell.question;
res.matrix = this.matrix;
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createHeaderCell = function (column) {
var cell = this.createTextCell(!!column ? column.locTitle : null);
cell.minWidth = column != null ? this.matrix.getColumnWidth(column) : "";
cell.width = column != null ? column.width : "";
return cell;
};
QuestionMatrixDropdownRenderedTable.prototype.createRemoveRowCell = function (row) {
var res = new QuestionMatrixDropdownRenderedCell();
res.row = row;
res.isRemoveRow = this.canRemoveRow(row);
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createTextCell = function (locTitle) {
var cell = new QuestionMatrixDropdownRenderedCell();
cell.locTitle = !!locTitle
? locTitle
: new __WEBPACK_IMPORTED_MODULE_9__localizablestring__["a" /* LocalizableString */](this.matrix, false);
return cell;
};
return QuestionMatrixDropdownRenderedTable;
}(__WEBPACK_IMPORTED_MODULE_4__base__["b" /* Base */]));
/**
* A base class for matrix dropdown and matrix dynamic questions.
*/
var QuestionMatrixDropdownModelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDropdownModelBase, _super);
function QuestionMatrixDropdownModelBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isRowChanging = false;
_this.lockResetRenderedTable = false;
_this.isDoingonAnyValueChanged = false;
var self = _this;
_this.choicesValue = _this.createItemValues("choices");
_this.createLocalizableString("optionsCaption", _this);
_this.registerFunctionOnPropertyValueChanged("columns", function (newColumns) {
self.updateColumnsIndexes(newColumns);
self.generatedVisibleRows = null;
self.generatedTotalRow = null;
self.resetRenderedTable();
self.fireCallback(self.columnsChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged(["columnLayout", "addRowLocation"], function () {
self.fireCallback(self.columnLayoutChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged(["cellType", "optionsCaption", "columnColCount"], function () {
self.generatedVisibleRows = null;
self.resetRenderedTable();
self.fireCallback(self.columnsChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged([
"columnLayout",
"showHeader",
"minRowCount",
"isReadOnly",
"rowCount",
"hasFooter"
], function () {
self.resetRenderedTable();
});
return _this;
}
Object.defineProperty(QuestionMatrixDropdownModelBase, "defaultCellType", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType = val;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.addDefaultColumns = function (matrix) {
var colNames = __WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].DefaultColums;
for (var i = 0; i < colNames.length; i++)
matrix.addColumn(colNames[i]);
};
QuestionMatrixDropdownModelBase.prototype.createColumnValues = function () {
var _this = this;
return this.createNewArray("columns", function (item) {
item.colOwner = _this;
});
};
QuestionMatrixDropdownModelBase.prototype.getType = function () {
return "matrixdropdownbase";
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isRowsDynamic", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnLayout", {
/**
* Set columnLayout to 'vertical' to place columns vertically and rows horizontally. It makes sense when we have many columns and few rows.
* @see columns
* @see rowCount
*/
get: function () {
return this.getPropertyValue("columnLayout");
},
set: function (val) {
this.setPropertyValue("columnLayout", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnsLocation", {
get: function () {
return this.columnLayout;
},
set: function (val) {
this.columnLayout = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isColumnLayoutHorizontal", {
/**
* Returns true if columns are located horizontally
* @see columnLayout
*/
get: function () {
return this.columnLayout != "vertical";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasRowText", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getFooterText = function () {
return null;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "canRemoveRows", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.canRemoveRow = function (row) {
return true;
};
QuestionMatrixDropdownModelBase.prototype.onRowsChanged = function () {
this.resetRenderedTable();
_super.prototype.onRowsChanged.call(this);
};
QuestionMatrixDropdownModelBase.prototype.onStartRowAddingRemoving = function () {
this.lockResetRenderedTable = true;
};
QuestionMatrixDropdownModelBase.prototype.onEndRowAdding = function () {
this.lockResetRenderedTable = false;
if (!this.renderedTable)
return;
if (this.renderedTable.isRequireReset()) {
this.resetRenderedTable();
}
else {
this.renderedTable.onAddedRow();
}
};
QuestionMatrixDropdownModelBase.prototype.onEndRowRemoving = function (index) {
this.lockResetRenderedTable = false;
if (this.renderedTable.isRequireReset()) {
this.resetRenderedTable();
}
else {
this.renderedTable.onRemovedRow(index);
}
};
QuestionMatrixDropdownModelBase.prototype.resetRenderedTable = function () {
if (this.lockResetRenderedTable || this.isLoadingFromJson)
return;
this.renderedTableValue = null;
this.fireCallback(this.onRenderedTableResetCallback);
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "renderedTable", {
get: function () {
if (!this.renderedTableValue) {
this.renderedTableValue = this.createRenderedTable();
if (!!this.onRenderedTableCreatedCallback) {
this.onRenderedTableCreatedCallback(this.renderedTableValue);
}
}
return this.renderedTableValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.createRenderedTable = function () {
return new QuestionMatrixDropdownRenderedTable(this);
};
QuestionMatrixDropdownModelBase.prototype.onMatrixRowCreated = function (row) {
if (!this.survey)
return;
var options = {
rowValue: row.value,
row: row,
column: null,
columnName: null,
cell: null,
cellQuestion: null,
value: null
};
for (var i = 0; i < this.visibleColumns.length; i++) {
options.column = this.visibleColumns[i];
options.columnName = options.column.name;
var cell = row.cells[i];
options.cell = cell;
options.cellQuestion = cell.question;
options.value = cell.value;
this.survey.matrixCellCreated(this, options);
}
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "cellType", {
/**
* Use this property to change the default cell type.
*/
get: function () {
return this.getPropertyValue("cellType", __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType);
},
set: function (val) {
val = val.toLowerCase();
if (this.cellType == val)
return;
this.setPropertyValue("cellType", val);
this.updateColumnsCellType();
this.fireCallback(this.updateCellsCallback);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.updateColumnsCellType = function () {
for (var i = 0; i < this.columns.length; i++) {
this.columns[i].defaultCellTypeChanged();
}
};
QuestionMatrixDropdownModelBase.prototype.updateColumnsIndexes = function (cols) {
for (var i = 0; i < cols.length; i++) {
cols[i].setIndex(i);
}
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnColCount", {
/**
* The default column count for radiogroup and checkbox cell types.
*/
get: function () {
return this.getPropertyValue("columnColCount", 0);
},
set: function (value) {
if (value < 0 || value > 4)
return;
this.setPropertyValue("columnColCount", value);
this.fireCallback(this.updateCellsCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnMinWidth", {
/**
* Use this property to set the mimimum column width.
*/
get: function () {
return this.getPropertyValue("columnMinWidth", "");
},
set: function (val) {
this.setPropertyValue("columnMinWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "horizontalScroll", {
/**
* Set this property to true to show the horizontal scroll.
*/
get: function () {
return this.getPropertyValue("horizontalScroll", false);
},
set: function (val) {
this.setPropertyValue("horizontalScroll", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getRequiredText = function () {
return this.survey ? this.survey.requiredText : "";
};
QuestionMatrixDropdownModelBase.prototype.onColumnPropertiesChanged = function (column) {
this.updateHasFooter();
if (!this.generatedVisibleRows)
return;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
this.generatedVisibleRows[i].updateCellQuestionOnColumnChanged(column);
}
if (!!this.generatedTotalRow) {
this.generatedTotalRow.updateCellQuestionOnColumnChanged(column);
}
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasFooter", {
get: function () {
return this.getPropertyValue("hasFooter", false);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.updateHasFooter = function () {
this.setPropertyValue("hasFooter", this.hasTotal);
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasTotal", {
get: function () {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].hasTotal)
return true;
}
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getCellType = function () {
return this.cellType;
};
QuestionMatrixDropdownModelBase.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this);
var columnName = "";
for (var i = path.length - 1; i >= 0; i--) {
if (path[i] == ".")
break;
columnName = path[i] + columnName;
}
var column = this.getColumnByName(columnName);
if (!column)
return null;
var question = column.createCellQuestion(null);
if (!question)
return null;
return question.getConditionJson(operator);
};
QuestionMatrixDropdownModelBase.prototype.clearIncorrectValues = function () {
var rows = this.visibleRows;
if (!rows)
return;
for (var i = 0; i < rows.length; i++) {
rows[i].clearIncorrectValues(this.getRowValue(i));
}
};
QuestionMatrixDropdownModelBase.prototype.clearErrors = function () {
_super.prototype.clearErrors.call(this);
if (!!this.generatedVisibleRows) {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
for (var j = 0; j < row.cells.length; j++) {
row.cells[j].question.clearErrors();
}
}
}
};
QuestionMatrixDropdownModelBase.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
var counter = 0;
var prevTotalValue;
do {
prevTotalValue = __WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].getUnbindValue(this.totalValue);
this.runCellsCondition(values, properties);
this.runTotalsCondition(values, properties);
counter++;
} while (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(prevTotalValue, this.totalValue) &&
counter < 3);
};
QuestionMatrixDropdownModelBase.prototype.shouldRunColumnExpression = function () {
return false;
};
QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values, properties) {
if (!this.generatedVisibleRows || !this.hasCellsCondition)
return;
var newValues = this.getRowConditionValues(values);
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].runCondition(newValues, properties);
}
this.checkColumnsVisibility();
};
QuestionMatrixDropdownModelBase.prototype.checkColumnsVisibility = function () {
var hasChanged = false;
for (var i = 0; i < this.visibleColumns.length; i++) {
if (!this.visibleColumns[i].visibleIf)
continue;
hasChanged =
this.isColumnVisibilityChanged(this.visibleColumns[i]) || hasChanged;
}
if (hasChanged) {
this.resetRenderedTable();
}
};
QuestionMatrixDropdownModelBase.prototype.isColumnVisibilityChanged = function (column) {
var curVis = column.hasVisibleCell;
var hasVisCell = false;
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
var cell = rows[i].cells[column.index];
if (!!cell && !!cell.question && cell.question.isVisible) {
hasVisCell = true;
break;
}
}
if (curVis != hasVisCell) {
column.hasVisibleCell = hasVisCell;
}
return curVis != hasVisCell;
};
QuestionMatrixDropdownModelBase.prototype.runTotalsCondition = function (values, properties) {
if (!this.generatedTotalRow)
return;
this.generatedTotalRow.runCondition(this.getRowConditionValues(values), properties);
};
QuestionMatrixDropdownModelBase.prototype.getRowConditionValues = function (values) {
var newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
var totalRow = {};
if (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(this.totalValue)) {
totalRow = JSON.parse(JSON.stringify(this.totalValue));
}
newValues["row"] = {};
newValues["totalRow"] = totalRow;
return newValues;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasCellsCondition", {
get: function () {
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
if (rows[i].hasCondition)
return true;
}
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
var rows = this.generatedVisibleRows;
if (!rows)
return;
var columns = this.columns;
for (var i = 0; i < columns.length; i++) {
columns[i].locStrsChanged();
}
for (var i = 0; i < rows.length; i++) {
rows[i].locStrsChanged();
}
if (!!this.generatedTotalRow) {
this.generatedTotalRow.locStrsChanged();
}
};
/**
* Returns the column by it's name. Retuns null if a column with this name doesn't exist.
* @param column
*/
QuestionMatrixDropdownModelBase.prototype.getColumnByName = function (columnName) {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].name == columnName)
return this.columns[i];
}
return null;
};
QuestionMatrixDropdownModelBase.prototype.getColumnName = function (columnName) {
return this.getColumnByName(columnName);
};
/**
* Returns the column width.
* @param column
*/
QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) {
return column.minWidth ? column.minWidth : this.columnMinWidth;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "choices", {
/**
* The default choices for dropdown, checkbox and radiogroup cell types.
*/
get: function () {
return this.choicesValue;
},
set: function (val) {
this.setPropertyValue("choices", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "optionsCaption", {
/**
* The default options caption for dropdown cell type.
*/
get: function () {
return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_7__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption"));
},
set: function (val) {
this.setLocalizableStringText("optionsCaption", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "locOptionsCaption", {
get: function () {
return this.getLocalizableString("optionsCaption");
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) {
if (title === void 0) { title = null; }
var column = new MatrixDropdownColumn(name, title);
this.columns.push(column);
return column;
};
QuestionMatrixDropdownModelBase.prototype.getVisibleRows = function () {
var _this = this;
if (this.isLoadingFromJson)
return null;
if (!this.generatedVisibleRows) {
this.generatedVisibleRows = this.generateRows();
this.generatedVisibleRows.forEach(function (row) { return _this.onMatrixRowCreated(row); });
if (this.data) {
this.runCellsCondition(this.data.getFilteredValues(), this.data.getFilteredProperties());
}
this.updateValueOnRowsGeneration(this.generatedVisibleRows);
}
return this.generatedVisibleRows;
};
QuestionMatrixDropdownModelBase.prototype.updateValueOnRowsGeneration = function (rows) {
var oldValue = this.createNewValue(true);
var newValue = this.createNewValue();
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var rowValue = this.getRowValue(i);
var rValue = row.value;
if (this.isTwoValueEquals(rowValue, rValue))
continue;
newValue = this.getNewValueOnRowChanged(row, "", rValue, false, newValue)
.value;
}
if (this.isTwoValueEquals(oldValue, newValue))
return;
this.isRowChanging = true;
this.setNewValue(newValue);
this.isRowChanging = false;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "totalValue", {
get: function () {
if (!this.hasTotal)
return {};
return this.visibleTotalRow.value;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getVisibleTotalRow = function () {
if (this.isLoadingFromJson)
return null;
if (this.hasTotal) {
if (!this.generatedTotalRow) {
this.generatedTotalRow = this.generateTotalRow();
if (this.data) {
var properties = { survey: this.survey };
this.runTotalsCondition(this.data.getAllValues(), properties);
}
}
}
else {
this.generatedTotalRow = null;
}
return this.generatedTotalRow;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "visibleTotalRow", {
get: function () {
return this.getVisibleTotalRow();
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.updateColumnsIndexes(this.columns);
this.generatedVisibleRows = null;
this.generatedTotalRow = null;
this.updateHasFooter();
};
/**
* Returns the row value. If the row value is empty, the object is empty: {}.
* @param rowIndex row index from 0 to visible row count - 1.
*/
QuestionMatrixDropdownModelBase.prototype.getRowValue = function (rowIndex) {
if (rowIndex < 0)
return null;
var visRows = this.visibleRows;
if (rowIndex >= visRows.length)
return null;
var newValue = this.createNewValue();
return this.getRowValueCore(visRows[rowIndex], newValue);
};
/**
* Set the row value.
* @param rowIndex row index from 0 to visible row count - 1.
* @param rowValue an object {"column name": columnValue,... }
*/
QuestionMatrixDropdownModelBase.prototype.setRowValue = function (rowIndex, rowValue) {
if (rowIndex < 0)
return null;
var visRows = this.visibleRows;
if (rowIndex >= visRows.length)
return null;
this.onRowChanged(visRows[rowIndex], "", rowValue, false);
this.onValueChanged();
};
QuestionMatrixDropdownModelBase.prototype.generateRows = function () {
return null;
};
QuestionMatrixDropdownModelBase.prototype.generateTotalRow = function () {
return new MatrixDropdownTotalRowModel(this);
};
QuestionMatrixDropdownModelBase.prototype.createNewValue = function (nullOnEmpty) {
if (nullOnEmpty === void 0) { nullOnEmpty = false; }
var res = !this.value ? {} : this.createValueCopy();
if (nullOnEmpty && this.isMatrixValueEmpty(res))
return null;
return res;
};
QuestionMatrixDropdownModelBase.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
var result = !!questionValue && !!questionValue[row.rowName]
? questionValue[row.rowName]
: null;
if (!result && create) {
result = {};
if (!!questionValue) {
questionValue[row.rowName] = result;
}
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.getRowDisplayValue = function (row, rowValue) {
if (!rowValue)
return rowValue;
for (var key in rowValue) {
var question = row.getQuestionByColumnName(key);
if (!question) {
question = this.getSharedQuestionByName(key, row);
}
if (!!question) {
rowValue[key] = question.displayValue;
}
}
return rowValue;
};
QuestionMatrixDropdownModelBase.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
questionPlainData.isNode = true;
questionPlainData.data = this.visibleRows.map(function (row) {
var rowDataItem = {
name: row.rowName,
title: row.rowName,
value: row.value,
displayValue: _this.getRowDisplayValue(row, row.value),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: true,
data: row.cells
.map(function (cell) {
return cell.question.getPlainData(options);
})
.filter(function (d) { return !!d; })
};
(options.calculations || []).forEach(function (calculation) {
rowDataItem[calculation.propertyName] = row[calculation.propertyName];
});
return rowDataItem;
});
}
return questionPlainData;
};
QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) { };
QuestionMatrixDropdownModelBase.prototype.onSetQuestionValue = function () {
if (this.isRowChanging)
return;
this.onBeforeValueChanged(this.value);
if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.createNewValue();
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
this.generatedVisibleRows[i].value = this.getRowValueCore(row, val);
}
this.isRowChanging = false;
};
QuestionMatrixDropdownModelBase.prototype.setQuestionValue = function (newValue) {
_super.prototype.setQuestionValue.call(this, newValue, false);
this.onSetQuestionValue();
this.updateIsAnswered();
};
QuestionMatrixDropdownModelBase.prototype.supportGoNextPageAutomatic = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (!rows)
return true;
for (var i = 0; i < rows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
var question = cells[colIndex].question;
if (question &&
(!question.supportGoNextPageAutomatic() || !question.value))
return false;
}
}
return true;
};
QuestionMatrixDropdownModelBase.prototype.getContainsErrors = function () {
return (_super.prototype.getContainsErrors.call(this) ||
this.checkForAnswersOrErrors(function (question) { return question.containsErrors; }, false));
};
QuestionMatrixDropdownModelBase.prototype.getIsAnswered = function () {
return (_super.prototype.getIsAnswered.call(this) &&
this.checkForAnswersOrErrors(function (question) { return question.isAnswered; }, true));
};
QuestionMatrixDropdownModelBase.prototype.checkForAnswersOrErrors = function (predicate, every) {
if (every === void 0) { every = false; }
var rows = this.generatedVisibleRows;
if (!rows)
return false;
for (var i = 0; i < rows.length; i++) {
var cells = rows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
if (question && question.isVisible)
if (predicate(question)) {
if (!every)
return true;
}
else {
if (every)
return false;
}
}
}
return every ? true : false;
};
QuestionMatrixDropdownModelBase.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var errosInColumns = this.hasErrorInColumns(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInColumns;
};
QuestionMatrixDropdownModelBase.prototype.getIsRunningValidators = function () {
if (_super.prototype.getIsRunningValidators.call(this))
return true;
if (!this.generatedVisibleRows)
return false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
if (!!question && question.isRunningValidators)
return true;
}
}
return false;
};
QuestionMatrixDropdownModelBase.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
var rows = this.generatedVisibleRows;
if (rows === null)
return result;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
for (var j = 0; j < row.cells.length; j++) {
var errors = row.cells[j].question.getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.hasErrorInColumns = function (fireCallback) {
var _this = this;
if (!this.generatedVisibleRows)
return false;
var res = false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
if (!question || !question.visible)
continue;
question.onCompletedAsyncValidators = function (hasErrors) {
_this.raiseOnCompletedAsyncValidators();
};
res = question.hasErrors(fireCallback) || res;
}
}
return res;
};
QuestionMatrixDropdownModelBase.prototype.getFirstInputElementId = function () {
var question = this.getFirstCellQuestion(false);
return question ? question.inputId : _super.prototype.getFirstInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstErrorInputElementId = function () {
var question = this.getFirstCellQuestion(true);
return question ? question.inputId : _super.prototype.getFirstErrorInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstCellQuestion = function (onError) {
if (!this.generatedVisibleRows)
return null;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!onError)
return cells[colIndex].question;
if (cells[colIndex].question.currentErrorCount > 0)
return cells[colIndex].question;
}
}
return null;
};
QuestionMatrixDropdownModelBase.prototype.onReadOnlyChanged = function () {
_super.prototype.onReadOnlyChanged.call(this);
if (!this.generateRows)
return;
for (var i = 0; i < this.visibleRows.length; i++) {
this.visibleRows[i].onQuestionReadOnlyChanged(this.isReadOnly);
}
};
//IMatrixDropdownData
QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) {
return this.createQuestionCore(row, column);
};
QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) {
var question = column.createCellQuestion(row);
if (this.isReadOnly) {
question.readOnly = true;
}
question.setSurveyImpl(row);
return question;
};
QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) {
if (!newValue)
return newValue;
delete newValue[row.rowName];
return this.isObject(newValue) && Object.keys(newValue).length == 0
? null
: newValue;
};
QuestionMatrixDropdownModelBase.prototype.onAnyValueChanged = function (name) {
if (this.isLoadingFromJson ||
this.isDoingonAnyValueChanged ||
!this.generatedVisibleRows)
return;
this.isDoingonAnyValueChanged = true;
var rows = this.visibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].onAnyValueChanged(name);
}
var totalRow = this.visibleTotalRow;
if (!!totalRow) {
totalRow.onAnyValueChanged(name);
}
this.isDoingonAnyValueChanged = false;
};
QuestionMatrixDropdownModelBase.prototype.isObject = function (value) {
return value !== null && typeof value === "object";
};
QuestionMatrixDropdownModelBase.prototype.getOnCellValueChangedOptions = function (row, columnName, rowValue) {
var self = this;
var getQuestion = function (colName) {
for (var i = 0; self.columns.length; i++) {
if (self.columns[i].name === colName) {
return row.cells[i].question;
}
}
return null;
};
return {
row: row,
columnName: columnName,
rowValue: rowValue,
value: !!rowValue ? rowValue[columnName] : null,
getCellQuestion: getQuestion
};
};
QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = function (row, columnName, rowValue) {
if (!this.survey)
return;
var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);
this.survey.matrixCellValueChanged(this, options);
};
QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) {
if (!this.survey)
return;
var self = this;
var getQuestion = function (colName) {
for (var i = 0; self.columns.length; i++) {
if (self.columns[i].name === colName) {
return row.cells[i].question;
}
}
return null;
};
var options = {
row: row,
columnName: columnName,
rowValue: rowValue,
value: rowValue[columnName],
getCellQuestion: getQuestion
};
return this.survey.matrixCellValidate(this, options);
};
QuestionMatrixDropdownModelBase.prototype.onRowChanging = function (row, columnName, rowValue) {
if (!this.survey)
return !!rowValue ? rowValue[columnName] : null;
var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);
var oldRowValue = this.getRowValueCore(row, this.createNewValue(), true);
options.oldValue = !!oldRowValue ? oldRowValue[columnName] : null;
this.survey.matrixCellValueChanging(this, options);
return options.value;
};
QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue, isDeletingValue) {
var oldValue = this.createNewValue(true);
var combine = this.getNewValueOnRowChanged(row, columnName, newRowValue, isDeletingValue, this.createNewValue());
if (this.isTwoValueEquals(oldValue, combine.value))
return;
this.isRowChanging = true;
this.setNewValue(combine.value);
this.isRowChanging = false;
if (columnName) {
this.onCellValueChanged(row, columnName, combine.rowValue);
}
};
QuestionMatrixDropdownModelBase.prototype.getNewValueOnRowChanged = function (row, columnName, newRowValue, isDeletingValue, newValue) {
var rowValue = this.getRowValueCore(row, newValue, true);
if (isDeletingValue) {
delete rowValue[columnName];
}
for (var i = 0; i < row.cells.length; i++) {
var key = row.cells[i].question.getValueName();
delete rowValue[key];
}
if (newRowValue) {
newRowValue = JSON.parse(JSON.stringify(newRowValue));
for (var key in newRowValue) {
if (!this.isValueEmpty(newRowValue[key])) {
rowValue[key] = newRowValue[key];
}
}
}
if (this.isObject(rowValue) && Object.keys(rowValue).length === 0) {
newValue = this.deleteRowValue(newValue, row);
}
return { value: newValue, rowValue: rowValue };
};
QuestionMatrixDropdownModelBase.prototype.getRowIndex = function (row) {
return this.visibleRows.indexOf(row);
};
QuestionMatrixDropdownModelBase.prototype.getSharedQuestionByName = function (columnName, row) {
if (!this.survey || !this.valueName)
return null;
var index = this.getRowIndex(row);
if (index < 0)
return null;
return (this.survey.getQuestionByValueNameFromArray(this.valueName, columnName, index));
};
QuestionMatrixDropdownModelBase.prototype.onTotalValueChanged = function () {
if (!!this.data && !!this.visibleTotalRow) {
this.data.setValue(this.getValueName() + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixTotalValuePostFix, this.totalValue, false);
}
};
QuestionMatrixDropdownModelBase.prototype.getQuestionFromArray = function (name, index) {
if (index >= this.visibleRows.length)
return null;
return this.visibleRows[index].getQuestionByColumnName(name);
};
QuestionMatrixDropdownModelBase.prototype.isMatrixValueEmpty = function (val) {
if (!val)
return;
if (Array.isArray(val)) {
for (var i = 0; i < val.length; i++) {
if (this.isObject(val[i]) && Object.keys(val[i]).length > 0)
return false;
}
return true;
}
return Object.keys(val).length == 0;
};
QuestionMatrixDropdownModelBase.prototype.getSurvey = function () {
return this.survey;
};
return QuestionMatrixDropdownModelBase;
}(__WEBPACK_IMPORTED_MODULE_2__martixBase__["a" /* QuestionMatrixBaseModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("matrixdropdowncolumn", [
"!name",
{ name: "title", serializationProperty: "locTitle" },
{
name: "cellType",
default: "default",
choices: function () {
var res = MatrixDropdownColumn.getColumnTypes();
res.splice(0, 0, "default");
return res;
}
},
{ name: "colCount", default: -1, choices: [-1, 0, 1, 2, 3, 4] },
"isRequired:boolean",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText"
},
"hasOther:boolean",
"readOnly:boolean",
"minWidth",
"width",
"visibleIf:condition",
"enableIf:condition",
"requiredIf:condition",
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
},
{
name: "totalType",
default: "none",
choices: ["none", "sum", "count", "min", "max", "avg"]
},
"totalExpression:expression",
{ name: "totalFormat", serializationProperty: "locTotalFormat" },
{
name: "totalDisplayStyle",
default: "none",
choices: ["none", "decimal", "currency", "percent"]
},
{
name: "totalCurrency",
choices: function () {
return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__question_expression__["b" /* getCurrecyCodes */])();
},
default: "USD"
},
{ name: "totalMaximumFractionDigits:number", default: -1 },
{ name: "totalMinimumFractionDigits:number", default: -1 }
], function () {
return new MatrixDropdownColumn("");
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("matrixdropdownbase", [
{
name: "columns:matrixdropdowncolumns",
className: "matrixdropdowncolumn"
},
{
name: "columnLayout",
alternativeName: "columnsLocation",
default: "horizontal",
choices: ["horizontal", "vertical"]
},
"horizontalScroll:boolean",
{
name: "choices:itemvalue[]"
},
{ name: "optionsCaption", serializationProperty: "locOptionsCaption" },
{
name: "cellType",
default: "dropdown",
choices: function () {
return MatrixDropdownColumn.getColumnTypes();
}
},
{ name: "columnColCount", default: 0, choices: [0, 1, 2, 3, 4] },
"columnMinWidth"
], function () {
return new QuestionMatrixDropdownModelBase("");
}, "matrixbase");
/***/ }),
/* 30 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return StylesManager; });
var StylesManager = /** @class */ (function () {
function StylesManager() {
this.sheet = null;
if (StylesManager.Enabled) {
this.sheet = StylesManager.findSheet(StylesManager.SurveyJSStylesSheetId);
if (!this.sheet) {
this.sheet = StylesManager.createSheet(StylesManager.SurveyJSStylesSheetId);
this.initializeStyles(this.sheet);
}
}
}
StylesManager.findSheet = function (styleSheetId) {
for (var i = 0; i < document.styleSheets.length; i++) {
if (!!document.styleSheets[i].ownerNode &&
document.styleSheets[i].ownerNode["id"] === styleSheetId) {
return document.styleSheets[i];
}
}
return null;
};
StylesManager.createSheet = function (styleSheetId) {
var style = document.createElement("style");
style.id = styleSheetId;
// Add a media (and/or media query) here if you'd like!
// style.setAttribute("media", "screen")
// style.setAttribute("media", "only screen and (max-width : 1024px)")
style.appendChild(document.createTextNode(""));
document.head.appendChild(style);
return style.sheet;
};
StylesManager.applyTheme = function (themeName, themeSelector) {
if (themeName === void 0) { themeName = "default"; }
if (themeSelector === void 0) { themeSelector = ".sv_main"; }
var ThemeCss;
if (themeName === "modern")
themeSelector = ".sv-root-modern ";
if (["bootstrap", "bootstrapmaterial", "modern"].indexOf(themeName) !== -1) {
ThemeCss = StylesManager[themeName + "ThemeCss"];
__WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__["b" /* surveyCss */].currentType = themeName;
}
else {
ThemeCss = StylesManager.ThemeCss;
__WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__["b" /* surveyCss */].currentType = "standard";
}
if (StylesManager.Enabled) {
var sheet_1 = StylesManager.findSheet(themeName + themeSelector);
if (!sheet_1) {
sheet_1 = StylesManager.createSheet(themeName + themeSelector);
var theme_1 = StylesManager.ThemeColors[themeName] ||
StylesManager.ThemeColors["default"];
Object.keys(ThemeCss).forEach(function (selector) {
var cssRuleText = ThemeCss[selector];
Object.keys(theme_1).forEach(function (colorVariableName) {
return (cssRuleText = cssRuleText.replace(new RegExp("\\" + colorVariableName, "g"), theme_1[colorVariableName]));
});
sheet_1.insertRule(themeSelector + selector + " { " + cssRuleText + " }", 0);
});
}
}
};
StylesManager.prototype.initializeStyles = function (sheet) {
if (StylesManager.Enabled) {
Object.keys(StylesManager.Styles).forEach(function (selector) {
return sheet.insertRule(selector + " { " + StylesManager.Styles[selector] + " }", 0);
});
Object.keys(StylesManager.Media).forEach(function (selector) {
sheet.insertRule(StylesManager.Media[selector].media +
" { " +
selector +
" { " +
StylesManager.Media[selector].style +
" } }", 0);
});
}
};
StylesManager.SurveyJSStylesSheetId = "surveyjs";
StylesManager.Styles = {
// ".sv_bootstrap_css":
// "position: relative; width: 100%; background-color: #f4f4f4",
// ".sv_bootstrap_css .sv_custom_header":
// "position: absolute; width: 100%; height: 275px; background-color: #e7e7e7;",
// ".sv_bootstrap_css .sv_container":
// "max-width: 80%; margin: auto; position: relative; color: #6d7072; padding: 0 1em;",
// ".sv_bootstrap_css .panel-body":
// "background-color: white; padding: 1em 1em 5em 1em; border-top: 2px solid lightgray;",
".sv_main span": "word-break: break-word;",
".sv_main legend": "border: none; margin: 0;",
".sv_bootstrap_css .sv_qstn": "padding: 0.5em 1em 1.5em 1em;",
".sv_bootstrap_css .sv_qcbc input[type=checkbox], .sv_bootstrap_css .sv_qcbc input[type=radio]": "vertical-align: middle; margin-top: -1px",
".sv_bootstrap_css .sv_qstn fieldset": "display: block;",
".sv_bootstrap_css .sv_qstn .sv_q_checkbox_inline, .sv_bootstrap_css .sv_qstn .sv_q_radiogroup_inline": "display: inline-block;",
".sv_bootstrap_css .sv-paneldynamic__progress-container ": "position: relative; margin-right: 250px; margin-left: 40px; margin-top: 10px;",
".sv_main.sv_bootstrapmaterial_css .sv_q_radiogroup_control_label": "display: inline; position: static;",
".sv_main.sv_bootstrapmaterial_css .checkbox": "margin-top:10px;margin-bottom:10px;",
".sv_row": "clear: both;",
".sv_row .sv_qstn": "float: left",
".sv_row .sv_qstn:last-child": "float: none",
".sv_qstn": "display: inline-block; vertical-align: top; overflow: auto;",
".progress": "width: 60%;",
".progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;",
".sv_p_container": "display: inline-block; vertical-align: top;",
".sv_qbln .checkbox-material": "margin-right: 3px;",
".sv_qcbx .checkbox-material": "margin-right: 5px;",
".sv_qcbx .checkbox label": "justify-content: left; display: inline-block;",
".sv_qstn .radio label": "justify-content: left; display: inline-block;",
".sv_qstn .sv_q_imgsel > label img": "pointer-events: none;",
".sv_qstn .sv_q_imgsel.sv_q_imagepicker_inline": "display: inline-block;",
".sv_qstn label.sv_q_m_label": "position: absolute; margin: 0; display: block; width: 100%;",
".sv_qstn td": "position: relative;",
".sv_q_mt_item_value": "float: left;",
"[dir=\"rtl\"] .sv_q_mt_item_value": "float: right;",
".sv_qstn.sv_qstn_left": "margin-top: 0.75em;",
".sv_qstn .title-left": "float: left; margin-right: 1em;",
"[dir=\"rtl\"] .sv_qstn .title-left": "float: right; margin-left: 1em;",
".sv_qstn .content-left": "overflow: hidden",
".sv_q_radiogroup_inline .sv_q_radiogroup_other": "display: inline-block;",
".sv_q_checkbox_inline .sv_q_checkbox_other": "display: inline-block;",
".sv_q_checkbox_inline, .sv_q_radiogroup_inline, .sv_q_imagepicker_inline": "line-height: 2.5em;",
".form-inline .sv_q_checkbox_inline:not(:last-child)": "margin-right: 1em;",
".form-inline .sv_q_radiogroup_inline:not(:last-child)": "margin-right: 1em;",
".sv_imgsel .sv_q_imagepicker_inline:not(:last-child)": "margin-right: 1em;",
".sv_qstn fieldset": "border: none; margin: 0; padding: 0;",
".sv_qstn .sv_q_file_placeholder": "display:none",
".sv_p_title": "padding-left: 1em; padding-bottom: 0.3em;",
".sv_p_title_expandable": "cursor: pointer;",
".sv_p_title .sv_panel_icon": "float: right; margin-right: 1em;",
".sv_p_title .sv_panel_icon::before": "content: ''; background-repeat: no-repeat; background-position: center; padding: 0.5em; display: inline-block; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMCAxMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAgMTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM2RDcwNzI7fQ0KPC9zdHlsZT4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICIvPg0KPC9zdmc+DQo=);",
".sv_p_title .sv_panel_icon.sv_expanded::before": "transform: rotate(180deg);",
".sv_q_file > input[type=file], .sv_q_file > button": "display: inline-block;",
".sv_q_file_preview": "display: inline-block; vertical-align: top; border: 1px solid lightgray; padding: 5px; margin-top: 10px;",
".sv_q_file_preview > a": "display: block; overflow: hidden; vertical-align: top; white-space: nowrap; text-overflow: ellipsis;",
".sv_q_file_remove_button": "line-height: normal;",
".sv_q_file_remove": "display: block; cursor: pointer;",
".sv_q_m_cell_text": "cursor: pointer;",
".sv_q_dd_other": "margin-top: 1em;",
".sv_q_dd_other input": "width: 100%;",
".sv_qstn .sv-q-col-1, .sv-question .sv-q-col-1": "width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-2, .sv-question .sv-q-col-2": "width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-3, .sv-question .sv-q-col-3": "width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-4, .sv-question .sv-q-col-4": "width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-5, .sv-question .sv-q-col-5": "width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-1, .sv-question .sv-q-column-1": "width: 100%; max-width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-2, .sv-question .sv-q-column-2": "max-width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-3, .sv-question .sv-q-column-3": "max-width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-4, .sv-question .sv-q-column-4": "max-width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-5, .sv-question .sv-q-column-5": "max-width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv_q_file_input": "color: transparent;",
".sv_qstn .sv_q_imgsel label > div": "overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 4px; border: 1px solid lightgray; border-radius: 4px;",
".sv_qstn .sv_q_imgsel label > div > img, .sv_qstn .sv_q_imgsel label > div > embed": "display: block;",
".sv_qstn table tr td .sv_q_m_cell_label": "position: absolute; left: 0; right: 0; top: 0; bottom: 0;",
"f-panel": "padding: 0.5em 1em; display: inline-block; line-height: 2em;",
".sv_progress_bar > span": "white-space: nowrap;",
".sv_qstn .sv_q_select_column": "display: inline-block; vertical-align: top; min-width: 10%;",
".sv_qstn .sv_q_select_column > *:not(.sv_technical)": "display: block;",
".sv_main .sv_container .sv_body .sv_p_root .sv_qstn .sv_q_select_column textarea": "margin-left: 0; padding-left: 0; line-height: initial;",
".sv_main .sv-hidden": "display: none !important;",
".sv_main .sv-visuallyhidden": "position: absolute; height: 1px; width: 1px; overflow: hidden; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);",
// paneldynamic progress
".sv_main .sv-progress": "height: 0.19em; background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color; height: 100%; position: relative;",
// EO paneldynamic progress
// paneldynamic
".sv_main .sv-paneldynamic__progress-container": "position: relative; margin-right: 250px; margin-top: 20px;",
".sv_main .sv-paneldynamic__add-btn": "float: right; margin-top: -18px;",
".sv_main .sv-paneldynamic__add-btn--list-mode": " float: none; margin-top: 1em;",
".sv_main .sv-paneldynamic__remove-btn ": "margin-top: 1.25em;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "box-sizing: border-box; display: inline-block; cursor: pointer; width: 0.7em; top: -0.28em; position: absolute;",
".sv_main .sv-paneldynamic__prev-btn": "left: -1.3em; transform: rotate(90deg);",
".sv_main .sv-paneldynamic__next-btn ": "right: -1.3em; transform: rotate(270deg);",
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "cursor: auto;",
".sv_main .sv-paneldynamic__progress-text": "font-weight: bold; font-size: 0.87em; margin-top: 0.69em; margin-left: 4em",
// EO paneldynamic
//boolean
".sv_main .sv-boolean__switch": "display: inline-block; box-sizing: border-box; width: 63px; height: 24px; margin-right: 17px; margin-left: 21px; padding: 2px 3px; vertical-align: middle; border-radius: 12px; cursor: pointer;",
".sv_main .sv-boolean__slider": "display: inline-block; width: 20px; height: 20px; transition-duration: .4s; transition-property: margin-left; border: none; border-radius: 100%;",
".sv_main sv-boolean__label": "vertical-align: middle",
".sv_main .sv-boolean--indeterminate .sv-boolean__slider": "margin-left: calc(50% - 10px);",
".sv_main .sv-boolean--checked .sv-boolean__slider": "margin-left: calc(100% - 20px);"
// EO boolean
};
StylesManager.Media = {
".sv_qstn fieldset .sv-q-col-1": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)"
},
".sv_qstn fieldset .sv-q-col-2": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)"
},
".sv_qstn fieldset .sv-q-col-3": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)"
},
".sv_qstn fieldset .sv-q-col-4": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)"
},
".sv_qstn fieldset .sv-q-col-5": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn": {
style: "display: block; width: 100% !important;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .title-left": {
style: "float: none;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_radiogroup_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_checkbox_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_imagepicker_inline": {
style: "display: block;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table": {
style: "display: block;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table thead": {
style: "display: none;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tbody, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tr, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table td": {
style: "display: block;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table:not(.sv_q_matrix) td:before": {
style: "content: attr(headers);",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.sv_q_matrix td:after": {
style: "content: attr(headers); padding-left: 1em",
media: "@media (max-width: 600px)"
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .radio label, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .checkbox label": {
style: "line-height: 12px; vertical-align: top;",
media: "@media (max-width: 600px)"
},
".sv_qstn label.sv_q_m_label": {
style: "display: inline;",
media: "@media (max-width: 600px)"
},
".sv_main .sv_custom_header": {
style: "display: none;",
media: "@media (max-width: 1300px)"
},
".sv_main .sv_container .sv_header h3": {
style: "font-size: 1.5em;",
media: "@media (max-width: 1300px)"
},
".sv_main .sv_container .sv_header h3 span": {
style: "font-size: 0.75em;",
media: "@media (max-width: 700px)"
},
".sv_main.sv_bootstrap_css .sv-progress__text": {
style: "margin-left: 8em;",
media: "@media (min-width: 768px)"
}
};
StylesManager.ThemeColors = {
default: {
"$header-background-color": "#e7e7e7",
"$body-container-background-color": "#f4f4f4",
"$main-color": "#1ab394",
"$main-hover-color": "#0aa384",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#6d7072",
"$header-color": "#6d7072",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
orange: {
"$header-background-color": "#4a4a4a",
"$body-container-background-color": "#f8f8f8",
"$main-color": "#f78119",
"$main-hover-color": "#e77109",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#4a4a4a",
"$header-color": "#f78119",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
darkblue: {
"$header-background-color": "#d9d8dd",
"$body-container-background-color": "#f6f7f2",
"$main-color": "#3c4f6d",
"$main-hover-color": "#2c3f5d",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#4a4a4a",
"$header-color": "#6d7072",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
darkrose: {
"$header-background-color": "#ddd2ce",
"$body-container-background-color": "#f7efed",
"$main-color": "#68656e",
"$main-hover-color": "#58555e",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#4a4a4a",
"$header-color": "#6d7072",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
stone: {
"$header-background-color": "#cdccd2",
"$body-container-background-color": "#efedf4",
"$main-color": "#0f0f33",
"$main-hover-color": "#191955",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#0f0f33",
"$header-color": "#0f0f33",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
winter: {
"$header-background-color": "#82b8da",
"$body-container-background-color": "#dae1e7",
"$main-color": "#3c3b40",
"$main-hover-color": "#1e1d20",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#000",
"$header-color": "#000",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$disable-color": "#dbdbdb",
"$progress-text-color": "#9d9d9d",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
winterstone: {
"$header-background-color": "#323232",
"$body-container-background-color": "#f8f8f8",
"$main-color": "#5ac8fa",
"$main-hover-color": "#06a1e7",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#000",
"$header-color": "#fff",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$disable-color": "#dbdbdb",
"$progress-text-color": "#9d9d9d",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
modern: {
"$main-color": "#1ab394",
"$add-button-color": "#1948b3",
"$remove-button-color": "#ff1800",
"$disable-color": "#dbdbdb",
"$progress-text-color": "#9d9d9d",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
bootstrap: {
"$main-color": "#18a689",
"$text-color": "#404040;",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$header-background-color": "#e7e7e7",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
},
bootstrapmaterial: {
"$main-color": "#18a689",
"$text-color": "#404040;",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$header-background-color": "#e7e7e7",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf"
}
};
StylesManager.ThemeCss = {
".sv_default_css": "background-color: $body-container-background-color;",
".sv_default_css hr": "border-color: $border-color;",
".sv_default_css input[type='button'], .sv_default_css button": "color: $body-background-color; background-color: $main-color;",
".sv_default_css input[type='button']:hover, .sv_default_css button:hover": "background-color: $main-hover-color;",
".sv_default_css .sv_header": "color: $header-color;",
".sv_default_css .sv_custom_header": "background-color: $header-background-color;",
".sv_default_css .sv_container": "color: $text-color;",
".sv_default_css .sv_body": "background-color: $body-background-color; border-color: $main-color;",
".sv_default_css .sv_progress": "background-color: $border-color;",
".sv_default_css .sv_progress_bar": "background-color: $main-color;",
".sv_default_css .sv_p_root > .sv_row": "border-color: $border-color;",
".sv_default_css .sv_p_root > .sv_row:nth-child(odd)": "background-color: $body-background-color;",
".sv_default_css .sv_p_root > .sv_row:nth-child(even)": "background-color: $body-container-background-color;",
".sv_default_css .sv_q_other input": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css .sv_q_text_root": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css .sv_q_dropdown_control": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css input[type='text']": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css select": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css textarea": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio'])": "border: 1px solid $border-color; background-color: $inputs-background-color;color: $text-color;",
".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio']):focus": "border: 1px solid $main-color;",
".sv_default_css .sv_container .sv_body .sv_p_root .sv_q .sv_select_wrapper .sv_q_dropdown_control ": "background-color: $inputs-background-color;",
".sv_default_css .sv_q_other input:focus": "border-color: $main-color;",
".sv_default_css .sv_q_text_root:focus": "border-color: $main-color;",
".sv_default_css .sv_q_dropdown_control:focus": "border-color: $main-color;",
".sv_default_css input[type='text']:focus": "border-color: $main-color;",
'.sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="radio"]:focus, .sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="checkbox"]:focus': "outline: 1px dotted $main-color;",
".sv_default_css select:focus": "border-color: $main-color;",
".sv_default_css textarea:focus": "border-color: $main-color;",
".sv_default_css .sv_select_wrapper": "background-color: $body-background-color;",
".sv_default_css .sv_select_wrapper::before": "background-color: $main-color;",
".sv_default_css .sv_q_rating_item.active .sv_q_rating_item_text": "background-color: $main-hover-color; border-color: $main-hover-color; color: $body-background-color;",
".sv_default_css .sv_q_rating_item .sv_q_rating_item_text": "border-color: $border-color;",
".sv_default_css .sv_q_rating_item .sv_q_rating_item_text:hover": "border-color: $main-hover-color;",
".sv_default_css table.sv_q_matrix tr": "border-color: $border-color;",
".sv_default_css table.sv_q_matrix_dropdown tr": "border-color: $border-color;",
".sv_default_css table.sv_q_matrix_dynamic tr": "border-color: $border-color;",
".sv_default_css .sv_q_m_cell_selected": "color: $body-background-color; background-color: $main-hover-color;",
".sv_main .sv_q_file_remove:hover": "color: $main-color;",
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color",
".sv_default_css .sv_p_description": "padding-left: 1.29em;",
//progress bar
".sv_main .sv-progress": "background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color;",
//paneldynamic
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color",
//boolean
".sv_main .sv-boolean__switch": "background-color: $main-color;",
".sv_main .sv-boolean__slider": "background-color: $slider-color;",
".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;"
//eo boolean
};
StylesManager.modernThemeCss = {
".sv-paneldynamic__add-btn": "background-color: $add-button-color;",
".sv-paneldynamic__remove-btn": "background-color: $remove-button-color;",
".sv-boolean__switch": "background-color: $main-color;",
".sv-boolean__slider": "background-color: $slider-color;",
".sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;"
};
StylesManager.bootstrapThemeCss = {
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color",
".sv_main .sv_p_description": "padding-left: 1.66em;",
".sv_main .sv_qstn_error_bottom": "margin-top: 20px; margin-bottom: 0;",
".sv_main .progress": "width: 60%;",
".sv_main .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;",
".sv_main .table>tbody>tr>td": "min-width: 90px;",
".sv_main f-panel .sv_qstn": "padding: 0; vertical-align: middle;",
//progress bar
".sv_main .sv-progress": "background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color;",
//paneldynamic
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color",
//boolean
".sv_main .sv-boolean__switch": "background-color: $main-color;",
".sv_main .sv-boolean__slider": "background-color: $slider-color;",
".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;"
//eo boolean
};
StylesManager.bootstrapmaterialThemeCss = {
".sv_main.sv_bootstrapmaterial_css .form-group.is-focused .form-control": "background-image: linear-gradient($main-color, $main-color), linear-gradient(#D2D2D2, #D2D2D2);",
".sv_main.sv_bootstrapmaterial_css .form-group.is-focused label": "color:$main-color;",
".sv_main.sv_bootstrapmaterial_css .sv_qstn label.sv_q_m_label": "height: 100%;",
".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .circle": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .circle": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .check": "background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .check": "background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .btn-default.active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .btn-default:active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .btn-secondary.active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .btn-secondary:active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .open>.dropdown-toggle.btn-default": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary, .sv_main.sv_bootstrapmaterial_css button.btn-primary": "color: $body-background-color; background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary:hover, .sv_main.sv_bootstrapmaterial_css button.btn-primary:hover": "background-color: $main-hover-color;",
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .sv_q_file_remove:hover": "color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .form-group input[type=file]": "position: relative; opacity: 1;",
".sv_main.sv_bootstrapmaterial_css .progress": "width: 60%;",
".sv_main.sv_bootstrapmaterial_css .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;",
//progress bar
".sv_main .sv-progress": "background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color;",
//paneldynamic
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color",
//boolean
".sv_main .sv-boolean__switch": "background-color: $main-color;",
".sv_main .sv-boolean__slider": "background-color: $slider-color;",
".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;"
//eo boolean
};
StylesManager.Enabled = true;
return StylesManager;
}());
/***/ }),
/* 31 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__page__ = __webpack_require__(44);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__textPreProcessor__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__dxSurveyService__ = __webpack_require__(41);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__stylesmanager__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__surveytimer__ = __webpack_require__(52);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyModel; });
/**
* Survey object contains information about the survey. Pages, Questions, flow logic and etc.
*/
var SurveyModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyModel, _super);
function SurveyModel(jsonObj) {
if (jsonObj === void 0) { jsonObj = null; }
var _this = _super.call(this) || this;
_this.valuesHash = {};
_this.variablesHash = {};
_this.localeValue = "";
_this.completedStateValue = "";
_this.completedStateTextValue = "";
_this.isTimerStarted = false;
/**
* The event is fired before the survey is completed and onComplete event is fired. You may prevent the survey from completing by setting options.allowComplete to false
*
sender the survey object that fires the event
*
options.allowComplete set it false to prevent the survey from completing. The default value is true.
* @see onComplete
*/
_this.onCompleting = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after a user click on 'Complete' button and finished the survey. You may use it to send the data to your web server.
*
sender the survey object that fires the event
*
options.showDataSaving(text) call this method to show that the survey is saving the data on your server. The text is an optional parameter to show your message instead of default.
*
options.showDataSavingError(text) call this method to show that there is an error on saving the data on your server. If you want to show a custom error, use an optional text parameter.
*
options.showDataSavingSuccess(text) call this method to show that the data were successful saved on the server.
*
options.showDataSavingClear call this method to hide the text about the saving progress.
* @see data
* @see clearInvisibleValues
* @see completeLastPage
* @see surveyPostId
*/
_this.onComplete = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after a user click on 'Complete' button. It allows you to change the url where survey will navigate to.
* You have to setup up navigateToUrl properties to let survey to navigate to another url.
*
sender the survey object that fires the event
*
options.url change it to navigate to another url. Set it to empty string to cancel the navigation and show the completed survey page.
* @see navigateToUrl
* @see navigateToUrlOnCondition
*/
_this.onNavigateToUrl = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after the survey changed it's state from "starting" to "running". The "starting" state means that survey shows the started page.
* The firstPageIsStarted property should be set to the true, if you want to have the started page in your survey. The end-user should click on the "Start" button to start the survey.
* @see firstPageIsStarted
*/
_this.onStarted = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on clicking 'Next' page if sendResultOnPageNext is set to true. You may use it to save the intermediate results, for example, if your survey is large enough.
*
sender the survey object that fires the event
* @see sendResultOnPageNext
*/
_this.onPartialSend = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before another page becomes the current. Typically it happens when a user click on 'Next' or 'Prev' buttons.
*
sender the survey object that fires the event
*
option.oldCurrentPage the previous current/active page
*
option.newCurrentPage a new current/active page
*
option.allowChanging set it to false to disable the current page changing. It is true by default.
* @see currentPage
* @see currentPageNo
* @see nextPage
* @see prevPage
* @see completeLastPage
* @see onCurrentPageChanged
**/
_this.onCurrentPageChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when another page becomes the current. Typically it happens when a user click on 'Next' or 'Prev' buttons.
*
sender the survey object that fires the event
*
option.oldCurrentPage the previous current/active page
*
option.newCurrentPage a new current/active page
* @see currentPage
* @see currentPageNo
* @see nextPage
* @see prevPage
* @see completeLastPage
* @see onCurrentPageChanging
*/
_this.onCurrentPageChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before the question value is changed. It can be done via UI by a user or programmatically on calling setValue method.
*
sender the survey object that fires the event
*
options.name the value name that has being changed
*
options.question a question which question.name equals to the value name. If there are several questions with the same name, the first question is taken. If there is no such questions, the options.question is null.
*
options.oldValue old, previous value.
*
options.value a new value. You may change it
* @see setValue
* @see onValueChanged
*/
_this.onValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when the question value is changed. It can be done via UI by a user or programmatically on calling setValue method.
* Please use onDynamicPanelItemValueChanged and onMatrixCellValueChanged events to handle changes a question in the Panel Dynamic and a cell question in matrices.
*
sender the survey object that fires the event
*
options.name the value name that has been changed
*
options.question a question which question.name equals to the value name. If there are several questions with the same name, the first question is taken. If there is no such questions, the options.question is null.
*
options.value a new value
* @see setValue
* @see onValueChanging
* @see onDynamicPanelItemValueChanged
* @see onMatrixCellValueChanged
*/
_this.onValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing a question visibility.
*
sender the survey object that fires the event
*
options.question a question which visibility has been changed
*
options.name a question name
*
options.visible a question visible boolean value
* @see Question.visibile
* @see Question.visibileIf
*/
_this.onVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing a page visibility.
*
sender the survey object that fires the event
*
options.page a page which visibility has been changed
*
options.visible a page visible boolean value
* @see PageModel.visibile
* @see PageModel.visibileIf
*/
_this.onPageVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing a panel visibility.
*
sender the survey object that fires the event
*
options.panel a panel which visibility has been changed
*
options.visible a panel visible boolean value
* @see PanelModel.visibile
* @see PanelModel.visibileIf
*/
_this.onPanelVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a new question into survey.
* 'question': question, 'name': question.name, 'index': index, 'parentPanel': parentPanel, 'rootPanel': rootPanel
*
sender the survey object that fires the event
*
options.question a newly added question object.
*
options.name a question name
*
options.index a index of the question in the container (page or panel)
*
options.parentPanel a container where question is located. It can be page or panel.
*
options.rootPanel typically it is a page.
* @see Question
*/
_this.onQuestionAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a question from survey
*
sender the survey object that fires the event
*
options.question a removed question object.
*
options.name a question name
* @see Question
*/
_this.onQuestionRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a panel into survey
*
sender the survey object that fires the event
*
options.panel a newly added panel object.
*
options.name a panel name
*
options.index a index of the panel in the container (page or panel)
*
options.parentPanel a container where question is located. It can be page or panel.
*
options.rootPanel typically it is a page.
* @see PanelModel
*/
_this.onPanelAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a panel from survey
*
sender the survey object that fires the event
*
options.panel a removed panel object.
*
options.name a panel name
* @see PanelModel
*/
_this.onPanelRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a page into survey
*
sender the survey object that fires the event
*
options.page a newly added panel object.
* @see PanelModel
*/
_this.onPageAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on validating value in a question. Set your error to options.error and survey will show the error for the question and block completing the survey or going to the next page.
*
sender the survey object that fires the event
*
options.question a question
*
options.name a question name
*
options.value the current question value
*
options.error an error string. It is empty by default.
* @see onServerValidateQuestions
* @see onSettingQuestionErrors
*/
_this.onValidateQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before errors are setting into question. You may add/remove/modify errors for a question.
*
sender the survey object that fires the event
*
options.question a question
*
options.errors the list of errors. The list can be empty if by default there is no errors
* @see onValidateQuestion
*/
_this.onSettingQuestionErrors = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to validate data on your server.
*
sender the survey object that fires the event
*
options.data the values of all non-empty questions on the current page. You can get a question value as options.data["myQuestionName"].
*
options.errors set your errors to this object as: options.errors["myQuestionName"] = "Error text";. It will be shown as a question error.
*
options.complete() call this function to tell survey that your server callback has been processed.
* @see onValidateQuestion
* @see onValidatePanel
*/
_this.onServerValidateQuestions = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to modify the html before rendering, for example html on 'Thank you' page. Options has one parameter: options.html.
*
sender the survey object that fires the event
*
options.html an html that you may change before text processing and then rendering.
* @see completedHtml
* @see loadingHtml
* @see QuestionHtmlModel.html
*/
/**
* The event is fired on validating a panel. Set your error to options.error and survey will show the error for the panel and block completing the survey or going to the next page.
*
sender the survey object that fires the event
*
options.name a panel name
*
options.error an error string. It is empty by default.
* @see onValidateQuestion
*/
_this.onValidatePanel = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use the event to change the default error text.
*
sender the survey object that fires the event
*
options.text an error text
*
options.error an instance of SurveyError object
*
options.name the error name. The following error name are available:
* required, requireoneanswer, requirenumeric, exceedsize, webrequest, webrequestempty, otherempty,
* uploadingfile, requiredinallrowserror, minrowcounterror, keyduplicationerror, custom
*/
_this.onErrorCustomText = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use the this event to be notified when the survey finished validate questions on the current page. It commonly happens when a user try to go to the next page or complete the survey
* options.questions - the list of questions that have errors
* options.errors - the list of errors
*/
_this.onValidatedErrorsOnCurrentPage = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to modify the html before rendering, for example completeHtml or loadingHtml.
* options.html - change this html property before the library rendered it
* @see completedHtml
* @see loadingHtml
*/
_this.onProcessHtml = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to change the question title in the code.
*
sender the survey object that fires the event
*
options.title a calcualted question title, based on question title, name, isRequired, visibleIndex (no)
*
options.question a question object.
*/
_this.onGetQuestionTitle = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to process the markdown text.
*
sender the survey object that fires the event
*
options.element SurveyJS element where the string is going to be rendered. It is a question, panel, page or survey
*
options.text a text that is going to be rendered
*
options.html a html. It is null by default. Set it and survey will use it instead of options.text
*/
_this.onTextMarkdown = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event fires when it get response from the [dxsurvey.com](http://www.dxsurvey.com) service on saving survey results. Use it to find out if the results have been saved successful.
*
sender the survey object that fires the event
*
options.success it is true if the results were sent to the service successful
*
options.response a response from the service
*/
_this.onSendResult = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use it to get results after calling the getResult method. It returns a simple analytic from [dxsurvey.com](http://www.dxsurvey.com) service.
*
sender the survey object that fires the event
*
options.success it is true if the results were got from the service successful
*
options.data the object {AnswersCount, QuestionResult : {} }. AnswersCount is the number of posted survey results. QuestionResult is an object with all possible unique answers to the question and number of these answers.
*
options.dataList an array of objects {name, value}, where 'name' is an unique value/answer to the question and value is a number/count of such answers.
*
options.response the server response
* @see getResult
*/
_this.onGetResult = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on uploading the file in QuestionFile when storeDataAsText is set to false. You may use it to change the file name or tells the library do not accept the file. There are three properties in options: options.name, options.file and options.accept.
*
sender the survey object that fires the event
* name: name, file: file, accept: accept
*
name the file name
*
file the Javascript File object
*
accept a boolean value, true by default. Set it to false to deny this file to upload
* @see uploadFiles
* @see QuestionFileModel.storeDataAsText
*/
_this.onUploadFiles = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on downloading the file in QuestionFile. You may use it to pass the file for the preview. There are four properties in options: options.name, options.content, optins.fileValue and options.callback.
*
sender the survey object that fires the event
* name: name, content: content, fileValue: fileValue
*
name the question name
*
content the file content
*
fileValue single file question value
*
callback a call back function to get the status on downloading the file and the downloaded file content
* @see downloadFile
*/
_this.onDownloadFile = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on clearing the value in QuestionFile. You may use it to remove files stored on your server. There are three properties in options: options.name, options.value and options.callback.
*
sender the survey object that fires the event
* name: name, value: value
*
name the question name
*
value the question value
*
fileName of the removed file, pass null to clear all files
*
callback a call back function to get the status on clearing the files operation
* @see clearFiles
*/
_this.onClearFiles = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after choices for radiogroup, checkbox and dropdown has been loaded from the RESTful service and before they are assign to the question.
* You may change the choices, before it was assign or disable/enabled make visible/invisible question, based on loaded results
*
question - the question where loaded choices are going to be assigned
*
choices - the loaded choices. You may change them to assign the correct one
*
serverResult - a result that comes from the server as it is.
*/
_this.onLoadChoicesFromServer = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on processing the text when it finds a text in brackets: {somevalue}. By default it uses the value of survey question values and variables.
* For example, you may use the text processing in loading choices from the web. If your choicesByUrl.url equals to "UrlToServiceToGetAllCities/{country}/{state}",
* you may set on this event options.value to "all" or empty string when the "state" value/question is non selected by a user.
*
name - the name of the processing value, for example, "state" in our example
*
value - the value of the processing text
*
isExists - a boolean value. Set it to true if you want to use the value and set it to false if you don't.
*/
_this.onProcessTextValue = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering a question. Use it to override the default question css classes.
* There are two parameters in options: options.question and options.cssClasses
*
sender the survey object that fires the event
*
options.question a question for which you may change the css classes
*
options.cssClasses an object with css classes. For example {root: "table", button: "button"}. You may change them to your own css classes.
*/
_this.onUpdateQuestionCssClasses = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering a panel or page. Use it to override the default panel/page css classes.
* There are two parameters in options: options.panel and options.cssClasses
*
sender the survey object that fires the event
*
options.panel a panel for which you may change the css classes
*
options.cssClasses an object with css classes. For example {title: "sv_p_title", description: "small"}. You may change them to your own css classes.
*/
_this.onUpdatePanelCssClasses = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after survey is rendered in DOM. options.htmlElement is the root element.
*
sender the survey object that fires the event
*
options.htmlElement a root html element binded with the survey object
*/
_this.onAfterRenderSurvey = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a page is rendred in DOM. Use it to modify html elements. There are two parameters in options: options.currentPage, options.htmlElement
*
sender the survey object that fires the event
*
options.page a page object for which the event is fired. Typically the current/active page.
*
options.htmlElement an html element binded with the page object
*/
_this.onAfterRenderPage = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a question is rendred in DOM. Use it to modify html elements. There are two parameters in options: options.question, options.htmlElement
*
sender the survey object that fires the event
*
options.question a question object for which the event is fired
*
options.htmlElement an html element binded with the question object
*/
_this.onAfterRenderQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a panel is rendred in DOM. Use it to modify html elements. There are two parameters in options: options.panel, options.htmlElement
*
sender the survey object that fires the event
*
options.panel a panel object for which the event is fired
*
options.htmlElement an html element binded with the panel object
*/
_this.onAfterRenderPanel = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a new row in Matrix Dynamic question.
*
sender the survey object that fires the event
*
options.question a matrix question.
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixRowAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before adding a new row in Matrix Dynamic question.
*
sender the survey object that fires the event
*
options.question a matrix question.
*
options.canAddRow an allowing flag.
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixBeforeRowAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a row from Matrix Dynamic question.
*
sender the survey object that fires the event
*
options.question a matrix question.
*
options.rowIndex a removed row index.
*
options.row a removed row object.
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixRowRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering "Remove" button for removing a row from Matrix Dynamic question.
*
sender the survey object that fires the event
*
options.question a matrix question.
*
options.rowIndex a row index.
*
options.row a row object.
*
options.allow a boolean property. Set it to false to disable the row removing.
* @see QuestionMatrixDynamicModel
*/
_this.onMatrixAllowRemoveRow = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired for every cell created in Matrix Dymic and Matrix Dropdown questions.
*
options.question - the matrix question
*
options.cell - the matrix cell
*
options.cellQuestion - the question/editor in the cell. You may customize it, change it's properties, like choices or visible.
*
options.rowValue - the value of the current row. To access the value of paticular column use: options.rowValue["columnValue"]
*
options.column - the matrix column object
*
options.columName - the matrix column name
*
options.row - the matrix row object
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellCreated = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired for every cell after is has been rendered in DOM.
*
options.question - the matrix question
*
options.cell - the matrix cell
*
options.cellQuestion - the question/editor in the cell.
*
options.htmlElement a html element binded with the cellQuestion object
*
options.column - the matrix column object
*
options.row - the matrix row object
* @see onMatrixCellCreated
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixAfterCellRender = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when cell value is changed in Matrix Dymic and Matrix Dropdown questions.
*
options.question - the matrix question
*
options.columName - the matrix column name
*
options.value - a new value
*
options.row - the matrix row object
*
options.getCellQuestion(columnName) - the function that returns the cell question by column name.
* @see onMatrixCellValueChanging
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing cell value in Matrix Dymic and Matrix Dropdown questions. You may change the options.value property to change the value in the cell.
*
options.question - the matrix question
*
options.columName - the matrix column name
*
options.value - a new value
*
options.oldValue - the old value
*
options.row - the matrix row object
*
options.getCellQuestion(columnName) - the function that returns the cell question by column name.
* @see onMatrixCellValueChanged
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when Matrix Dymic and Matrix Dropdown questions validate the cell value.
*
options.question - the matrix question
*
options.columName - the matrix column name
*
options.value - a cell value
*
options.row - the matrix row object
*
options.getCellQuestion(columnName) - the function that returns the cell question by column name.
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValidate = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a new panel in Panel Dynamic question.
*
sender the survey object that fires the event
*
options.question a panel question.
* @see QuestionPanelDynamicModel
* @see QuestionPanelDynamicModel.panels
*/
_this.onDynamicPanelAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a panel from Panel Dynamic question.
*
sender the survey object that fires the event
*
options.question a panel question.
*
options.panelIndex a removed panel index.
* @see QuestionPanelDynamicModel
* @see QuestionPanelDynamicModel.panels
*/
_this.onDynamicPanelRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired every second if the method startTimer has been called.
* @see startTimer
* @see timeSpent
* @see Page.timeSpent
*/
_this.onTimer = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before displaying a new information in the Timer Panel. Use it to change the default text.
*
options.text - the timer panel info text.
*/
_this.onTimerPanelInfoText = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when item value is changed in Panel Dynamic question.
*
options.question - the panel question
*
options.panel - the dynamic panel item
*
options.name - the item name
*
options.value - a new value
*
options.itemIndex - the panel item index
*
options.itemValue - the panel item object
* @see onDynamicPanelAdded
* @see QuestionPanelDynamicModel
*/
_this.onDynamicPanelItemValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to define, if the answer on the question is correct or not.
*
sender the survey object that fires the event
*
options.question a question on which you have to decide if the answer is correct or not.
*
options.result return true, if the answer is correct or false if the answer is not correct. Use questions value and correctAnswer properties to return the correct value.
*
options.correctAnswers - you may change the default number of correct or incorrect answers in the question, for example for matrix, where each row is a quiz question.
* @see Question.value
* @see Question.correctAnswer
*/
_this.onIsAnswerCorrect = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to control drag&drop operations during design mode.
*
sender the survey object that fires the event.
*
options.allow set it to false to disable dragging.
*
options.target a target element that is dragging.
*
options.source a source element. It can be null, if it is a new element, dragging from toolbox.
*
options.parent a page or panel where target element is dragging.
*
options.insertBefore an element before the target element is dragging. It can be null if parent container (page or panel) is empty or dragging an element under the last element of the container.
*
options.insertAfter an element after the target element is dragging. It can be null if parent container (page or panel) is empty or dragging element to the top of the parent container.
* @see setDesignMode
* @see isDesignMode
*/
_this.onDragDropAllow = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The list of errors on loading survey json. If the list is empty after loading a json then the json is correct and there is no errors in it.
* @see JsonError
*/
_this.jsonErrors = null;
_this.cssValue = null;
/**
* Set this property to true to make all requried errors invisible
*/
_this.hideRequiredErrors = false;
_this.questionTitleTemplateCache = undefined;
_this.conditionVersion = 0;
_this._isDesignMode = false;
/**
* Set it to true, to ignore validation, like requried questions and others, on nextPage and completeLastPage functions.
* @see nextPage
* @see completeLastPage
* @see mode
*/
_this.ignoreValidation = false;
_this.origionalPages = null;
_this.isEndLoadingFromJson = null;
_this.questionHashes = {
names: {},
namesInsensitive: {},
valueNames: {},
valueNamesInsensitive: {}
};
_this.timerFunc = null;
/**
* Returns the time in seconds end-user spends on the survey
* @see startTimer
* @see PageModel.timeSpent
*/
_this.timeSpent = 0;
var self = _this;
if (typeof document !== "undefined") {
SurveyModel.stylesManager = new __WEBPACK_IMPORTED_MODULE_12__stylesmanager__["a" /* StylesManager */]();
}
_this.createLocalizableString("title", _this, true);
_this.createLocalizableString("description", _this, true);
_this.createLocalizableString("completedHtml", _this);
_this.createLocalizableString("completedBeforeHtml", _this);
_this.createLocalizableString("loadingHtml", _this);
_this.createLocalizableString("startSurvey", _this);
_this.createLocalizableString("pagePrev", _this);
_this.createLocalizableString("pageNext", _this);
_this.createLocalizableString("complete", _this);
_this.createLocalizableString("questionTitleTemplate", _this, true);
_this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_6__textPreProcessor__["a" /* TextPreProcessor */]();
_this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
_this.pagesValue = _this.createNewArray("pages", function (value) {
self.doOnPageAdded(value);
});
_this.createNewArray("triggers", function (value) {
value.setOwner(self);
});
_this.createNewArray("calculatedValues", function (value) {
value.setOwner(self);
});
_this.createNewArray("completedHtmlOnCondition", function (value) {
value.locOwner = self;
});
_this.createNewArray("navigateToUrlOnCondition", function (value) {
value.locOwner = self;
});
_this.registerFunctionOnPropertyValueChanged("questionTitleTemplate", function () {
self.questionTitleTemplateCache = undefined;
});
_this.registerFunctionOnPropertyValueChanged("firstPageIsStarted", function () {
self.onFirstPageIsStartedChanged();
});
_this.registerFunctionOnPropertyValueChanged("mode", function () {
self.onModeChanged();
});
_this.onBeforeCreating();
if (jsonObj) {
if (typeof jsonObj === "string" || jsonObj instanceof String) {
jsonObj = JSON.parse(jsonObj);
}
if (jsonObj && jsonObj.clientId) {
_this.clientId = jsonObj.clientId;
}
_this.fromJSON(jsonObj);
if (_this.surveyId) {
_this.loadSurveyFromService(_this.surveyId, _this.clientId);
}
}
_this.onCreating();
return _this;
}
Object.defineProperty(SurveyModel.prototype, "platformName", {
get: function () {
return SurveyModel.platform;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "commentPrefix", {
/**
* You may show comments input for the most of questions. The entered text in the comment input will be saved as 'question name' + 'commentPrefix'.
* @see data
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_15__settings__["a" /* settings */].commentPrefix;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_15__settings__["a" /* settings */].commentPrefix = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPageValue", {
get: function () {
return this.getPropertyValue("currentPageValue", null);
},
set: function (val) {
this.setPropertyValue("currentPageValue", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getType = function () {
return "survey";
};
SurveyModel.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {
if (name === "questionsOnPageMode") {
this.onQuestionsOnPageModeChanged(oldValue);
}
};
Object.defineProperty(SurveyModel.prototype, "pages", {
/**
* The list of all pages in the survey, including invisible.
* @see PageModel
* @see visiblePages
*/
get: function () {
return this.pagesValue;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getCss = function () {
return this.css;
};
Object.defineProperty(SurveyModel.prototype, "css", {
get: function () {
if (!this.cssValue) {
this.cssValue = {};
this.copyCssClasses(this.cssValue, __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__["b" /* surveyCss */].getCss());
}
return this.cssValue;
},
set: function (value) {
this.mergeValues(value, this.css);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "triggers", {
/**
* The list of triggers in the survey.
* @see SurveyTrigger
*/
get: function () {
return this.getPropertyValue("triggers");
},
set: function (val) {
this.setPropertyValue("triggers", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "calculatedValues", {
/**
* The list of calculated values in the survey.
* @see CalculatedValue
*/
get: function () {
return this.getPropertyValue("calculatedValues");
},
set: function (val) {
this.setPropertyValue("calculatedValues", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyId", {
/**
* Set this property to automatically load survey Json from [dxsurvey.com](http://www.dxsurvey.com) service.
* @see loadSurveyFromService
*/
get: function () {
return this.getPropertyValue("surveyId", "");
},
set: function (val) {
this.setPropertyValue("surveyId", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyPostId", {
/**
* Set this property to automatically save the data into the [dxsurvey.com](http://www.dxsurvey.com) service.
* @see onComplete
* @see surveyShowDataSaving
*/
get: function () {
return this.getPropertyValue("surveyPostId", "");
},
set: function (val) {
this.setPropertyValue("surveyPostId", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "clientId", {
/**
* Use this property as indentificator for a user, for example e-mail or unique customer id in your web application. If you are loading survey or posting survey results from/to [dxsurvey.com](http://www.dxsurvey.com) service, then the library do not allow to run the same survey the second time. On the second run, the user will see the 'Thank you' page.
*/
get: function () {
return this.getPropertyValue("clientId", "");
},
set: function (val) {
this.setPropertyValue("clientId", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cookieName", {
/**
* If the property is not empty, before starting to run the survey, the library checkes if the cookie with this name exists. If it is true, the survey goes to complete mode and an user sees the 'Thank you' page. On completing the survey the cookie with this name is created.
*/
get: function () {
return this.getPropertyValue("cookieName", "");
},
set: function (val) {
this.setPropertyValue("cookieName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "sendResultOnPageNext", {
/**
* Set it to true, to save results on completing every page. onPartialSend event is fired.
* @see onPartialSend
* @see clientId
*/
get: function () {
return this.getPropertyValue("sendResultOnPageNext", false);
},
set: function (val) {
this.setPropertyValue("sendResultOnPageNext", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyShowDataSaving", {
/**
* Set this property to true, to show the progress on saving/sending data into the [dxsurvey.com](http://www.dxsurvey.com) service.
* @see surveyPostId
*/
get: function () {
return this.getPropertyValue("surveyShowDataSaving", false);
},
set: function (val) {
this.setPropertyValue("surveyShowDataSaving", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "focusFirstQuestionAutomatic", {
/**
* On showing the next or previous page, a first input is focused, if the property set to true.
*/
get: function () {
return this.getPropertyValue("focusFirstQuestionAutomatic", true);
},
set: function (val) {
this.setPropertyValue("focusFirstQuestionAutomatic", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "focusOnFirstError", {
/**
* Set this property to false (default value is true) if you do not want to bring the focus to the first question that has error on the page.
*/
get: function () {
return this.getPropertyValue("focusOnFirstError", true);
},
set: function (val) {
this.setPropertyValue("focusOnFirstError", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showNavigationButtons", {
/**
* Possible values: 'bottom' (default), 'top', 'both' and 'none'. Set it to 'none' to hide 'Prev', 'Next' and 'Complete' buttons. It makes sense if you are going to create a custom navigation or have just one page or on setting goNextPageAutomatic property.
* @see goNextPageAutomatic
* @see showPrevButton
*/
get: function () {
return this.getPropertyValue("showNavigationButtons");
},
set: function (val) {
if (val === true || val === undefined) {
val = "bottom";
}
if (val === false) {
val = "none";
}
this.setPropertyValue("showNavigationButtons", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPrevButton", {
/**
* Set it to false to hide the 'Prev' to disable for end-users go back to their answers.
* @see showNavigationButtons
*/
get: function () {
return this.getPropertyValue("showPrevButton", true);
},
set: function (val) {
this.setPropertyValue("showPrevButton", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showTitle", {
/**
* Set it to false hide survey title.
* @see title
*/
get: function () {
return this.getPropertyValue("showTitle", true);
},
set: function (val) {
this.setPropertyValue("showTitle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPageTitles", {
/**
* Set it to false to hide page titles.
* @see PageModel.title
*/
get: function () {
return this.getPropertyValue("showPageTitles", true);
},
set: function (val) {
this.setPropertyValue("showPageTitles", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showCompletedPage", {
/**
* On finishing the survey the 'Thank you', page on complete, is shown. Set the property to false, to hide the 'Thank you' page.
* @see data
* @see onComplete
* @see navigateToUrl
*/
get: function () {
return this.getPropertyValue("showCompletedPage", true);
},
set: function (val) {
this.setPropertyValue("showCompletedPage", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "navigateToUrl", {
/**
* Set this property to a url you want to navigate after a user completing the survey
*/
get: function () {
return this.getPropertyValue("navigateToUrl");
},
set: function (val) {
this.setPropertyValue("navigateToUrl", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "navigateToUrlOnCondition", {
/**
* The list of url condition items. If the expression of this item returns true, then survey will navigate to item url
* @see UrlConditionItem
* @see navigateToUrl
*/
get: function () {
return this.getPropertyValue("navigateToUrlOnCondition");
},
set: function (val) {
this.setPropertyValue("navigateToUrlOnCondition", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getNavigateToUrl = function () {
var item = this.getExpressionItemOnRunCondition(this.navigateToUrlOnCondition);
var url = !!item ? item.url : this.navigateToUrl;
if (!!url) {
url = this.processText(url, true);
}
return url;
};
SurveyModel.prototype.navigateTo = function () {
var url = this.getNavigateToUrl();
var options = { url: url };
this.onNavigateToUrl.fire(this, options);
if (!options.url || !window || !window.location)
return;
window.location.href = options.url;
};
Object.defineProperty(SurveyModel.prototype, "requiredText", {
/**
* A char/string that will be rendered in the title required questions.
* @see Question.title
*/
get: function () {
return this.getPropertyValue("requiredText", "*");
},
set: function (val) {
this.setPropertyValue("requiredText", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.beforeSettingQuestionErrors = function (question, errors) {
if (this.hideRequiredErrors) {
for (var i = 0; i < errors.length; i++) {
if (errors[i].getErrorType() == "required") {
errors[i].visible = false;
}
}
}
this.onSettingQuestionErrors.fire(this, {
question: question,
errors: errors
});
};
Object.defineProperty(SurveyModel.prototype, "questionStartIndex", {
/**
* By default the first question index is 1. You may start it from 100 or from 'A', by setting 100 or 'A' to this property.
* @see Question.title
* @see requiredText
*/
get: function () {
return this.getPropertyValue("questionStartIndex", "");
},
set: function (val) {
this.setPropertyValue("questionStartIndex", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "storeOthersAsComment", {
/**
* By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key.
* @see commentPrefix
*/
get: function () {
return this.getPropertyValue("storeOthersAsComment", true);
},
set: function (val) {
this.setPropertyValue("storeOthersAsComment", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxTextLength", {
/**
* The default maximum length for questions like text and comment, including matrix cell questions.
* The default value is 0, it is unlimited maxLength - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp
* @see maxOthersLength
*/
get: function () {
return this.getPropertyValue("maxTextLength", 0);
},
set: function (val) {
this.setPropertyValue("maxTextLength", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxOthersLength", {
/**
* The default maximum length for question comments and others
* The default value is 0, it is unlimited maxLength - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp
* @see Question.hasComment
* @see Question.hasOther
* @see maxTextLength
*/
get: function () {
return this.getPropertyValue("maxOthersLength", 0);
},
set: function (val) {
this.setPropertyValue("maxOthersLength", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "goNextPageAutomatic", {
/**
* Set it to the one of the following constants if you want to go to the next page without pressing 'Next' button when all questions are anwered.
* true - go next page and submit automatically
* "autogonext" - go next page automatically but do not submit
* false - do not go next page and not submit automatically
* @see showNavigationButtons
*/
get: function () {
return this.getPropertyValue("goNextPageAutomatic", false);
},
set: function (val) {
this.setPropertyValue("goNextPageAutomatic", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "allowCompleteSurveyAutomatic", {
/**
* Set it to false if you do not want to submit survey automatically if goNextPageAutomatic=true.
* @see goNextPageAutomatic
*/
get: function () {
return this.getPropertyValue("allowCompleteSurveyAutomatic", true);
},
set: function (val) {
this.setPropertyValue("allowCompleteSurveyAutomatic", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "checkErrorsMode", {
/**
* Change this property from 'onNextPage' to 'onValueChanged' to check erorrs on every question value changing,
* or change it to 'onComplete' to validate all visible questions on complete button. If there is the error on some pages,
* then the page with the first error becomes the current.
* By default, library checks errors on changing current page to the next or on completing the survey.
*/
get: function () {
return this.getPropertyValue("checkErrorsMode");
},
set: function (val) {
this.setPropertyValue("checkErrorsMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "textUpdateMode", {
/**
* Change this property from 'onBlur' to 'onTyping' to update the value of text questions, "text" and "comment",
* on every key press. By default, the value is updated an input losts the focus.
* Please note, setting to "onTyping" may lead to a performance degradation, in case you have many expressions in the survey
*/
get: function () {
return this.getPropertyValue("textUpdateMode");
},
set: function (val) {
this.setPropertyValue("textUpdateMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "clearInvisibleValues", {
/**
* Set it to 'none' to include the invisible values into the survey data.
* Set it to 'onHidden' to clear the question value when it becomes invisible. If a question has value and it was invisible initially then survey clears the value on completing.
* Leave it equals to 'onComplete', to remove from data property values of invisible questions on survey complete. In this case, the invisible questions will not be stored on the server.
* The default value is 'onComplete'.
* @see Question.visible
* @see onComplete
*/
get: function () {
return this.getPropertyValue("clearInvisibleValues");
},
set: function (val) {
if (val === true)
val = "onComplete";
if (val === false)
val = "none";
this.setPropertyValue("clearInvisibleValues", val);
},
enumerable: true,
configurable: true
});
/**
* Call this function to remove all question values from the survey, that end-user will not be able to enter.
* For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.
* Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions.
* In fact this function just call clearIncorrectValues function of all questions in the survery
* @see Question.clearIncorrectValues
* @see Page.clearIncorrectValues
* @see Panel.clearIncorrectValues
*/
SurveyModel.prototype.clearIncorrectValues = function () {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].clearIncorrectValues();
}
};
Object.defineProperty(SurveyModel.prototype, "locale", {
/**
* Use it to change the survey locale. By default it is empty, 'en'. You may set it to 'de' - german, 'fr' - french and so on. The library has built-in localization for several languages. The library has a multi-language support as well.
*/
get: function () {
return this.localeValue;
},
set: function (value) {
this.questionTitleTemplateCache = undefined;
__WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].currentLocale = value;
this.localeValue = __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].currentLocale;
this.setPropertyValue("locale", this.localeValue);
this.locStrsChanged();
this.onLocaleChanged();
},
enumerable: true,
configurable: true
});
/**
* Return the array of locales that used in the current survey
*/
SurveyModel.prototype.getUsedLocales = function () {
var locs = new Array();
this.addUsedLocales(locs);
//Replace the default locale with the real one
var index = locs.indexOf("default");
if (index > -1) {
var defaultLoc = __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].defaultLocale;
//Remove the defaultLoc
var defIndex = locs.indexOf(defaultLoc);
if (defIndex > -1) {
locs.splice(defIndex, 1);
}
index = locs.indexOf("default");
locs[index] = defaultLoc;
}
return locs;
};
SurveyModel.prototype.onLocaleChanged = function () { };
//ILocalizableOwner
SurveyModel.prototype.getLocale = function () {
return this.locale;
};
SurveyModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
if (this.currentPage) {
this.currentPage.locStrsChanged();
}
};
SurveyModel.prototype.getMarkdownHtml = function (text) {
return this.getSurveyMarkdownHtml(this, text);
};
SurveyModel.prototype.getProcessedText = function (text) {
return this.processText(text, true);
};
SurveyModel.prototype.getLocString = function (str) {
return __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].getString(str);
};
//ISurveyErrorOwner
SurveyModel.prototype.getErrorCustomText = function (text, error) {
var options = { text: text, name: error.getErrorType(), error: error };
this.onErrorCustomText.fire(this, options);
return options.text;
};
Object.defineProperty(SurveyModel.prototype, "emptySurveyText", {
/**
* Returns the text that renders when there is no any visible page and question.
*/
get: function () {
return this.getLocString("emptySurvey");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "title", {
/**
* Survey title.
* @see description
*/
get: function () {
return this.getLocalizableStringText("title");
},
set: function (value) {
this.setLocalizableStringText("title", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locTitle", {
get: function () {
return this.getLocalizableString("title");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "description", {
/**
* Survey description. It shows under survey title
* @see title
*/
get: function () {
return this.getLocalizableStringText("description");
},
set: function (value) {
this.setLocalizableStringText("description", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locDescription", {
get: function () {
return this.getLocalizableString("description");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedHtml", {
/**
* The html that shows on completed ('Thank you') page. Set it to change the default text.
* @see showCompletedPage
* @see completedHtmlOnCondition
* @see locale
*/
get: function () {
return this.getLocalizableStringText("completedHtml");
},
set: function (value) {
this.setLocalizableStringText("completedHtml", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompletedHtml", {
get: function () {
return this.getLocalizableString("completedHtml");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedHtmlOnCondition", {
/**
* The list of html condition items. If the expression of this item returns true, then survey will use this item html instead of completedHtml
* @see HtmlConditionItem
* @see completeHtml
*/
get: function () {
return this.getPropertyValue("completedHtmlOnCondition");
},
set: function (val) {
this.setPropertyValue("completedHtmlOnCondition", val);
},
enumerable: true,
configurable: true
});
/**
* Perform the calculation of the given expression and returns the result value
* @param expression
*/
SurveyModel.prototype.runExpression = function (expression) {
if (!expression)
return null;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
return new __WEBPACK_IMPORTED_MODULE_14__conditions__["a" /* ExpressionRunner */](expression).run(values, properties);
};
/**
* Perform the calculation of the given expression and true or false
* @param expression
*/
SurveyModel.prototype.runCondition = function (expression) {
if (!expression)
return false;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
return new __WEBPACK_IMPORTED_MODULE_14__conditions__["b" /* ConditionRunner */](expression).run(values, properties);
};
Object.defineProperty(SurveyModel.prototype, "renderedCompletedHtml", {
get: function () {
var item = this.getExpressionItemOnRunCondition(this.completedHtmlOnCondition);
return !!item ? item.html : this.completedHtml;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getExpressionItemOnRunCondition = function (items) {
if (items.length == 0)
return null;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
for (var i = 0; i < items.length; i++) {
if (items[i].runCondition(values, properties)) {
return items[i];
}
}
return null;
};
Object.defineProperty(SurveyModel.prototype, "completedBeforeHtml", {
/**
* The html that shows if the end user has already completed the survey.
* @see clientId
* @see locale
*/
get: function () {
return this.getLocalizableStringText("completedBeforeHtml");
},
set: function (value) {
this.setLocalizableStringText("completedBeforeHtml", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompletedBeforeHtml", {
get: function () {
return this.getLocalizableString("completedBeforeHtml");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "loadingHtml", {
/**
* The html that shows on loading survey Json from the dxsurvey.com service.
* @see surveyId
* @see locale
*/
get: function () {
return this.getLocalizableStringText("loadingHtml");
},
set: function (value) {
this.setLocalizableStringText("loadingHtml", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locLoadingHtml", {
get: function () {
return this.getLocalizableString("loadingHtml");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "startSurveyText", {
/**
* A text that renders on the 'Start' button. Set it to change the default text.
* The start button is shown on the started page. You have to set firstPageIsStarted property to true, to have the started page.
* @see firstPageIsStarted
* @see locale
*/
get: function () {
return this.getLocalizableStringText("startSurvey", this.getLocString("startSurveyText"));
},
set: function (newValue) {
this.setLocalizableStringText("startSurvey", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locStartSurveyText", {
get: function () {
return this.getLocalizableString("startSurvey");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pagePrevText", {
/**
* A text that renders on the 'Prev' button. Set it to change the default text.
* @see locale
*/
get: function () {
return this.getLocalizableStringText("pagePrev", this.getLocString("pagePrevText"));
},
set: function (newValue) {
this.setLocalizableStringText("pagePrev", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPagePrevText", {
get: function () {
return this.getLocalizableString("pagePrev");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageNextText", {
/**
* A text that renders on the 'Next' button. Set it to change the default text.
* @see locale
*/
get: function () {
return this.getLocalizableStringText("pageNext", this.getLocString("pageNextText"));
},
set: function (newValue) {
this.setLocalizableStringText("pageNext", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPageNextText", {
get: function () {
return this.getLocalizableString("pageNext");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completeText", {
/**
* A text that renders on the 'Complete' button. Set it to change the default text.
* @see locale
*/
get: function () {
return this.getLocalizableStringText("complete", this.getLocString("completeText"));
},
set: function (newValue) {
this.setLocalizableStringText("complete", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompleteText", {
get: function () {
return this.getLocalizableString("complete");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionTitleTemplate", {
/**
* A template for a question title.
* @see QuestionModel.title
*/
get: function () {
return this.getLocalizableStringText("questionTitleTemplate");
},
set: function (value) {
if (!!value && value.indexOf("{no}") !== -1) {
var noIndex = value.indexOf("{no}");
var prevBrIndex = noIndex;
var nextBrIndex = noIndex + 4;
while (prevBrIndex >= 0 && value[prevBrIndex] !== "}")
prevBrIndex--;
while (nextBrIndex < value.length && value[nextBrIndex] !== "{")
nextBrIndex++;
value =
value.substring(0, prevBrIndex + 1) + value.substring(nextBrIndex);
}
this.setLocalizableStringText("questionTitleTemplate", value);
},
enumerable: true,
configurable: true
});
/**
* Returns the question title template
* @see questionTitleTemplate
* @see QuestionModel.title
*/
SurveyModel.prototype.getQuestionTitleTemplate = function () {
if (this.questionTitleTemplateCache === undefined) {
this.questionTitleTemplateCache = this.locQuestionTitleTemplate.textOrHtml;
}
return this.questionTitleTemplateCache;
};
Object.defineProperty(SurveyModel.prototype, "locQuestionTitleTemplate", {
get: function () {
return this.getLocalizableString("questionTitleTemplate");
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getUpdatedQuestionTitle = function (question, title) {
if (this.onGetQuestionTitle.isEmpty)
return title;
var options = { question: question, title: title };
this.onGetQuestionTitle.fire(this, options);
return options.title;
};
Object.defineProperty(SurveyModel.prototype, "showPageNumbers", {
/**
* Set this property to false to turn off the numbering on pages titles.
*/
get: function () {
return this.getPropertyValue("showPageNumbers", false);
},
set: function (value) {
if (value === this.showPageNumbers)
return;
this.setPropertyValue("showPageNumbers", value);
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showQuestionNumbers", {
/**
* Set this property to "off" to turn off the numbering on questions titles or "onpage" to start numbering on every page. The default value is "on".
*/
get: function () {
return this.getPropertyValue("showQuestionNumbers");
},
set: function (value) {
value = value.toLowerCase();
value = value === "onpage" ? "onPage" : value;
if (value === this.showQuestionNumbers)
return;
this.setPropertyValue("showQuestionNumbers", value);
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showProgressBar", {
/**
* Set this property to "top" to show the progress bar on the bottom or to "bottom" to show it on the bottom.
*/
get: function () {
return this.getPropertyValue("showProgressBar");
},
set: function (newValue) {
this.setPropertyValue("showProgressBar", newValue.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "progressBarType", {
/**
* Type of info in the progress bar: "pages" (default), "questions" or "correctQuestions".
*/
get: function () {
return this.getPropertyValue("progressBarType");
},
set: function (newValue) {
this.setPropertyValue("progressBarType", newValue.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnTop", {
get: function () {
return this.showProgressBar === "top" || this.showProgressBar === "both";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnBottom", {
get: function () {
return this.showProgressBar === "bottom" || this.showProgressBar === "both";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedTitle", {
/**
* Returns the text/html that renders as survey title.
*/
get: function () {
return this.locTitle.renderedHtml;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionTitleLocation", {
/**
* Set this property to 'bottom' or 'left' to show question title under the question or on the left.
*
Note: Some questions, for example matrixes, do not support 'left' value. The title for them will be displayed on the top.
*/
get: function () {
return this.getPropertyValue("questionTitleLocation");
},
set: function (value) {
this.setPropertyValue("questionTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionErrorLocation", {
/**
* Set this property to 'bottom' to show question error(s) under the question.
*/
get: function () {
return this.getPropertyValue("questionErrorLocation");
},
set: function (value) {
this.setPropertyValue("questionErrorLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionDescriptionLocation", {
/**
* Set this property to 'underInput' to show question description under the question input instead of question title.
*/
get: function () {
return this.getPropertyValue("questionDescriptionLocation");
},
set: function (value) {
this.setPropertyValue("questionDescriptionLocation", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "mode", {
/**
* Set this mode to 'display' to make the survey read-only. The default value is 'edit'.
*/
get: function () {
return this.getPropertyValue("mode");
},
set: function (value) {
value = value.toLowerCase();
if (value == this.mode)
return;
if (value != "edit" && value != "display")
return;
this.setPropertyValue("mode", value);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.onModeChanged = function () {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
page.setPropertyValue("isReadOnly", page.isReadOnly);
}
};
Object.defineProperty(SurveyModel.prototype, "data", {
/**
* An object that stores the survey results/data. You may set it directly as { 'question name': questionValue, ... }
* Note: If you are setting the data after creatig the survey, you may need to set the currentPageNo to 0, if you are using visibleIf properties for questions/pages/panels to ensure that you are starting from the first page.
* @see setValue
* @see getValue
* @see currentPageNo
*/
get: function () {
var result = {};
for (var i = 0; i < this.calculatedValues.length; i++) {
var calValue = this.calculatedValues[i];
if (calValue.includeIntoResult &&
!!calValue.name &&
this.getVariable(calValue.name) !== undefined) {
result[calValue.name] = this.getVariable(calValue.name);
}
}
for (var key in this.valuesHash) {
var dataValue = this.getDataValueCore(this.valuesHash, key);
if (dataValue !== undefined) {
result[key] = dataValue;
}
}
return result;
},
set: function (data) {
this.valuesHash = {};
if (data) {
for (var key in data) {
this.setDataValueCore(this.valuesHash, key, data[key]);
}
}
this.updateAllQuestionsValue();
this.notifyAllQuestionsOnValueChanged();
this.notifyElementsOnAnyValueOrVariableChanged("");
this.runConditions();
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getAllValues = function () {
return this.data;
};
/**
* Returns survey result data as an array of plain objects: with question title, name, value and displayValue.
* For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows)
* set options.includeEmpty to false if you want to skip empty answers
*/
SurveyModel.prototype.getPlainData = function (options) {
if (options === void 0) { options = {
includeEmpty: true
}; }
var result = [];
this.getAllQuestions().forEach(function (question) {
var resultItem = question.getPlainData(options);
if (!!resultItem) {
result.push(resultItem);
}
});
return result;
};
SurveyModel.prototype.getFilteredValues = function () {
var values = {};
for (var key in this.variablesHash)
values[key] = this.variablesHash[key];
for (var key in this.valuesHash)
values[key] = this.getDataValueCore(this.valuesHash, key);
values["conditionVersion"] = ++this.conditionVersion;
return values;
};
SurveyModel.prototype.getFilteredProperties = function () {
return { survey: this };
};
SurveyModel.prototype.getDataValueCore = function (valuesHash, key) {
return valuesHash[key];
};
SurveyModel.prototype.setDataValueCore = function (valuesHash, key, value) {
valuesHash[key] = value;
};
SurveyModel.prototype.deleteDataValueCore = function (valuesHash, key) {
delete valuesHash[key];
};
Object.defineProperty(SurveyModel.prototype, "comments", {
// protected iterateDataValuesHash(func: (hash: any, key: any) => void) {
// var keys: any[] = [];
// for (var key in this.valuesHash) {
// keys.push(key);
// }
// keys.forEach(key => func(this.valuesHash, key));
// }
/**
* Returns all comments from the data.
* @see data
*/
get: function () {
var result = {};
for (var key in this.valuesHash) {
if (key.indexOf(this.commentPrefix) > 0) {
result[key] = this.getDataValueCore(this.valuesHash, key);
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePages", {
/**
* Returns the list of visible pages. If all pages are visible then it is the same as pages property.
* @see pages
* @see PageModel.visible
* @see PageModel.visibleIf
*/
get: function () {
if (this.isDesignMode)
return this.pages;
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].isVisible) {
result.push(this.pages[i]);
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEmpty", {
/**
* Returns true if there is no any page in the survey. The survey is empty.
*/
get: function () {
return this.pages.length == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "PageCount", {
/**
* depricated, misspelling, use pageCount property
*/
get: function () {
return this.pageCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageCount", {
/**
* Returns the survey pages count.
* @see visiblePageCount
* @see pages
*/
get: function () {
return this.pages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePageCount", {
/**
* Returns the survey visible pages count
* @see pageCount
* @see visiblePages
*/
get: function () {
return this.visiblePages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "startedPage", {
/**
* Returns the started Page. firstPageIsStarted property should be equals to true
* @see firstPageIsStarted
*/
get: function () {
var page = this.firstPageIsStarted && this.pages.length > 0 ? this.pages[0] : null;
if (!!page) {
page.onFirstRendering();
}
return page;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPage", {
/**
* Returns the current survey page. If survey is rendred then it is a page that a user can see/edit.
*/
get: function () {
var vPages = this.visiblePages;
if (this.currentPageValue != null) {
if (vPages.indexOf(this.currentPageValue) < 0) {
this.currentPage = null;
}
}
if (this.currentPageValue == null && vPages.length > 0) {
this.currentPage = vPages[0];
}
return this.currentPageValue;
},
set: function (value) {
var newPage = this.getPageByObject(value);
if (!!value && !newPage)
return;
var vPages = this.visiblePages;
if (newPage != null && vPages.indexOf(newPage) < 0)
return;
if (newPage == this.currentPageValue)
return;
var oldValue = this.currentPageValue;
if (!this.currentPageChanging(newPage, oldValue))
return;
if (!!newPage) {
newPage.onFirstRendering();
}
this.currentPageValue = newPage;
if (!!newPage) {
newPage.updateCustomWidgets();
newPage.setWasShown(true);
}
this.locStrsChanged();
this.currentPageChanged(newPage, oldValue);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getPageByObject = function (value) {
if (!value)
return null;
if (value.getType && value.getType() == "page")
return value;
if (typeof value === "string" || value instanceof String)
return this.getPageByName(String(value));
if (!isNaN(value)) {
var index = Number(value);
var vPages = this.visiblePages;
if (value < 0 || value >= vPages.length)
return null;
return vPages[index];
}
return value;
};
Object.defineProperty(SurveyModel.prototype, "currentPageNo", {
/**
* The index of the current page in the visible pages array. It starts from 0.
*/
get: function () {
return this.visiblePages.indexOf(this.currentPage);
},
set: function (value) {
var vPages = this.visiblePages;
if (value < 0 || value >= vPages.length)
return;
this.currentPage = vPages[value];
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionsOrder", {
/**
* Use this property to randomize questions. Set it to 'random' to randomize questions, 'initial' to keep them in the same order. You can randomize questions on a specific page.
* @see SurveyPage.questionsOrder
*/
get: function () {
return this.getPropertyValue("questionsOrder");
},
set: function (val) {
this.setPropertyValue("questionsOrder", val);
},
enumerable: true,
configurable: true
});
/**
* Set the input focus to the first question with the input.
*/
SurveyModel.prototype.focusFirstQuestion = function () {
var page = this.currentPage;
if (page) {
page.scrollToTop();
page.focusFirstQuestion();
}
};
SurveyModel.prototype.scrollToTopOnPageChange = function () {
var page = this.currentPage;
if (!page)
return;
page.scrollToTop();
if (this.focusFirstQuestionAutomatic) {
page.focusFirstQuestion();
}
};
Object.defineProperty(SurveyModel.prototype, "state", {
/**
* Returns the current survey state: 'loading' - loading from the json, 'completed' - a user has completed the survey,
* 'starting' - the started page is showing, running' - a user answers a questions right now, 'empty' - there is nothing to show in the current survey.
*/
get: function () {
if (this.isLoading)
return "loading";
if (this.isCompleted)
return "completed";
if (this.isCompletedBefore)
return "completedbefore";
if (!this.isDesignMode &&
this.isEditMode &&
this.isStartedState &&
this.startedPage)
return "starting";
return this.currentPage ? "running" : "empty";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isCompleted", {
get: function () {
return this.getPropertyValue("isCompleted", false);
},
set: function (val) {
this.setPropertyValue("isCompleted", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isStartedState", {
get: function () {
return this.getPropertyValue("isStartedState", false);
},
set: function (val) {
this.setPropertyValue("isStartedState", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isCompletedBefore", {
get: function () {
return this.getPropertyValue("isCompletedBefore", false);
},
set: function (val) {
this.setPropertyValue("isCompletedBefore", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLoading", {
get: function () {
return this.getPropertyValue("isLoading", false);
},
set: function (val) {
this.setPropertyValue("isLoading", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedState", {
get: function () {
return this.completedStateValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedStateText", {
get: function () {
return this.completedStateTextValue;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setCompletedState = function (value, text) {
this.completedStateValue = value;
if (!text) {
if (value == "saving")
text = this.getLocString("savingData");
if (value == "error")
text = this.getLocString("savingDataError");
if (value == "success")
text = this.getLocString("savingDataSuccess");
}
this.completedStateTextValue = text;
};
/**
* Clear the survey data and state. If the survey has a 'completed' state, it will have a 'running' state.
* @param clearData clear the data
* @param gotoFirstPage make the first page as a current page.
* @see data
* @see state
* @see currentPage
*/
SurveyModel.prototype.clear = function (clearData, gotoFirstPage) {
if (clearData === void 0) { clearData = true; }
if (gotoFirstPage === void 0) { gotoFirstPage = true; }
if (clearData) {
this.data = null;
this.variablesHash = {};
}
this.timeSpent = 0;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].timeSpent = 0;
this.pages[i].setWasShown(false);
}
this.isCompleted = false;
this.isCompletedBefore = false;
this.isLoading = false;
this.isStartedState = this.firstPageIsStarted;
if (gotoFirstPage && this.visiblePageCount > 0) {
this.currentPage = this.visiblePages[0];
}
if (clearData) {
this.updateValuesWithDefaults();
}
};
SurveyModel.prototype.mergeValues = function (src, dest) {
if (!dest || !src)
return;
for (var key in src) {
var value = src[key];
if (value && typeof value === "object") {
if (!dest[key])
dest[key] = {};
this.mergeValues(value, dest[key]);
}
else {
dest[key] = value;
}
}
};
SurveyModel.prototype.updateValuesWithDefaults = function () {
if (this.isDesignMode || this.isLoading)
return;
for (var i = 0; i < this.pages.length; i++) {
var questions = this.pages[i].questions;
for (var j = 0; j < questions.length; j++) {
questions[j].updateValueWithDefaults();
}
}
};
SurveyModel.prototype.updateCustomWidgets = function (page) {
if (!page)
return;
page.updateCustomWidgets();
};
SurveyModel.prototype.currentPageChanging = function (newValue, oldValue) {
var options = {
oldCurrentPage: oldValue,
newCurrentPage: newValue,
allowChanging: true
};
this.onCurrentPageChanging.fire(this, options);
return options.allowChanging;
};
SurveyModel.prototype.currentPageChanged = function (newValue, oldValue) {
this.onCurrentPageChanged.fire(this, {
oldCurrentPage: oldValue,
newCurrentPage: newValue
});
};
/**
* Returns the progress that a user made by answering on the survey.
*/
SurveyModel.prototype.getProgress = function () {
if (this.currentPage == null)
return 0;
if (this.progressBarType === "questions") {
var questions = this.getAllQuestions();
var answeredQuestionsCount = questions.reduce(function (a, b) { return a + (b.isEmpty() ? 0 : 1); }, 0);
return Math.ceil((answeredQuestionsCount * 100) / questions.length);
}
if (this.progressBarType === "correctQuestions") {
var questions = this.getAllQuestions();
var correctAnswersCount = this.getCorrectedAnswerCount();
return Math.ceil((correctAnswersCount * 100) / questions.length);
}
var index = this.visiblePages.indexOf(this.currentPage) + 1;
return Math.ceil((index * 100) / this.visiblePageCount);
};
Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowing", {
/**
* Returns true if navigation buttons: 'Prev', 'Next' or 'Complete' are shown.
*/
get: function () {
if (this.isDesignMode)
return "none";
var page = this.currentPage;
if (!page)
return "none";
if (page.navigationButtonsVisibility === "show") {
return "bottom";
}
if (page.navigationButtonsVisibility === "hide") {
return "none";
}
return this.showNavigationButtons;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEditMode", {
/**
* Returns true if the survey in the edit mode.
* @see mode
*/
get: function () {
return this.mode == "edit";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDisplayMode", {
/**
* Returns true if the survey in the display mode.
* @see mode
*/
get: function () {
return this.mode == "display";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isUpdateValueTextOnTyping", {
get: function () {
return this.textUpdateMode == "onTyping";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDesignMode", {
/**
* Returns true if the survey in the design mode. It is used by SurveyJS Editor
* @see setDesignMode
*/
get: function () {
return this._isDesignMode;
},
enumerable: true,
configurable: true
});
/**
* Call it to set the survey into the design mode.
* @param value use true to set the survey into the design mode.
*/
SurveyModel.prototype.setDesignMode = function (value) {
this._isDesignMode = value;
this.onQuestionsOnPageModeChanged("standard");
};
Object.defineProperty(SurveyModel.prototype, "showInvisibleElements", {
/**
* Set this property to true, to show all elements in the survey, regardless their visibility. It is false by default.
*/
get: function () {
return this.getPropertyValue("showInvisibleElements", false);
},
set: function (val) {
var visPages = this.visiblePages;
this.setPropertyValue("showInvisibleElements", val);
this.updateAllElementsVisibility(visPages);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.updateAllElementsVisibility = function (visPages) {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
page.updateElementVisibility();
if (visPages.indexOf(page) > -1 != page.isVisible) {
this.onPageVisibleChanged.fire(this, {
page: page,
visible: page.isVisible
});
}
}
};
Object.defineProperty(SurveyModel.prototype, "areInvisibleElementsShowing", {
get: function () {
return this.isDesignMode || this.showInvisibleElements;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "hasCookie", {
/**
* Returns true, if a user has already completed the survey on this browser and there is a cookie about it. Survey goes to 'completed' state if the function returns true.
* @see cookieName
* @see setCookie
* @see deleteCookie
* @see state
*/
get: function () {
if (!this.cookieName)
return false;
var cookies = document.cookie;
return cookies && cookies.indexOf(this.cookieName + "=true") > -1;
},
enumerable: true,
configurable: true
});
/**
* Set the cookie with cookieName in the browser. It is done automatically on survey complete if cookieName is not empty.
* @see cookieName
* @see hasCookie
* @see deleteCookie
*/
SurveyModel.prototype.setCookie = function () {
if (!this.cookieName)
return;
document.cookie =
this.cookieName + "=true; expires=Fri, 31 Dec 9999 0:0:0 GMT";
};
/**
* Delete the cookie with cookieName in the browser.
* @see cookieName
* @see hasCookie
* @see setCookie
*/
SurveyModel.prototype.deleteCookie = function () {
if (!this.cookieName)
return;
document.cookie = this.cookieName + "=;";
};
/**
* Call it to go to the next page. It returns false, if it is the last page. If there is an error, for example required question is empty, the function returns false as well.
* @see isCurrentPageHasErrors
* @see prevPage
* @see completeLastPage
*/
SurveyModel.prototype.nextPage = function () {
if (this.isLastPage)
return false;
return this.doCurrentPageComplete(false);
};
SurveyModel.prototype.hasErrorsOnNavigate = function (doComplete) {
if (this.ignoreValidation || !this.isEditMode)
return false;
if (this.checkErrorsMode == "onComplete") {
if (!this.isLastPage)
return false;
if (this.hasErrors(true, true))
return true;
}
else {
if (this.isCurrentPageHasErrors)
return true;
}
return this.checkForAsyncQuestionValidation(doComplete);
};
SurveyModel.prototype.checkForAsyncQuestionValidation = function (doComplete) {
var _this = this;
this.clearAsyncValidationQuesitons();
var questions = this.currentPage.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].isRunningValidators) {
questions[i].onCompletedAsyncValidators = function (hasErrors) {
_this.onCompletedAsyncQuestionValidators(doComplete, hasErrors);
};
this.asyncValidationQuesitons.push(questions[i]);
}
}
return this.asyncValidationQuesitons.length > 0;
};
SurveyModel.prototype.clearAsyncValidationQuesitons = function () {
if (!!this.asyncValidationQuesitons) {
var asynQuestions = this.asyncValidationQuesitons;
for (var i = 0; i < asynQuestions.length; i++) {
asynQuestions[i].onCompletedAsyncValidators = null;
}
}
this.asyncValidationQuesitons = [];
};
SurveyModel.prototype.onCompletedAsyncQuestionValidators = function (doComplete, hasErrors) {
if (hasErrors) {
this.clearAsyncValidationQuesitons();
return;
}
var asynQuestions = this.asyncValidationQuesitons;
for (var i = 0; i < asynQuestions.length; i++) {
if (asynQuestions[i].isRunningValidators)
return;
}
this.doCurrentPageCompleteCore(doComplete);
};
Object.defineProperty(SurveyModel.prototype, "isCurrentPageHasErrors", {
/**
* Returns true, if there is any error on the current page. For example, the required question is empty or a question validation is failed.
* @see nextPage
*/
get: function () {
return this.checkIsCurrentPageHasErrors();
},
enumerable: true,
configurable: true
});
/**
* Returns true, if there is an error on any visible page
* @param fireCallback set it to true, to show errors in UI
* @param focusOnFirstError set it to true to focus on the first question that doesn't pass the validation and make the page, where question located, the current.
*/
SurveyModel.prototype.hasErrors = function (fireCallback, focusOnFirstError) {
if (fireCallback === void 0) { fireCallback = true; }
if (focusOnFirstError === void 0) { focusOnFirstError = false; }
var visPages = this.visiblePages;
var firstErrorPage = null;
var res = false;
for (var i = 0; i < visPages.length; i++) {
if (visPages[i].hasErrors(fireCallback, focusOnFirstError)) {
if (!firstErrorPage)
firstErrorPage = visPages[i];
res = true;
}
}
if (focusOnFirstError && !!firstErrorPage) {
this.currentPage = firstErrorPage;
}
return res;
};
/**
* Ensure that pages, panels and questions have unique question names.
* You may ensure unique names for individual page and panel (and all their elements) or question
* If the parameter is underfined then survey ensure that all its elements are unique.
* @param element page, panel or question, it is null by default, that means all survey elements will be checked
*/
SurveyModel.prototype.ensureUniqueNames = function (element) {
if (element === void 0) { element = null; }
if (element == null) {
for (var i = 0; i < this.pages.length; i++) {
this.ensureUniqueName(this.pages[i]);
}
}
else {
this.ensureUniqueName(element);
}
};
SurveyModel.prototype.ensureUniqueName = function (element) {
if (element.isPage) {
this.ensureUniquePageName(element);
}
if (element.isPanel) {
this.ensureUniquePanelName(element);
}
if (element.isPage || element.isPanel) {
var elements = element.elements;
for (var i = 0; i < elements.length; i++) {
this.ensureUniqueNames(elements[i]);
}
}
else {
this.ensureUniqueQuestionName(element);
}
};
SurveyModel.prototype.ensureUniquePageName = function (element) {
var _this = this;
return this.ensureUniqueElementName(element, function (name) {
return _this.getPageByName(name);
});
};
SurveyModel.prototype.ensureUniquePanelName = function (element) {
var _this = this;
return this.ensureUniqueElementName(element, function (name) {
return _this.getPanelByName(name);
});
};
SurveyModel.prototype.ensureUniqueQuestionName = function (element) {
var _this = this;
return this.ensureUniqueElementName(element, function (name) {
return _this.getQuestionByName(name);
});
};
SurveyModel.prototype.ensureUniqueElementName = function (element, getElementByName) {
var existingElement = getElementByName(element.name);
if (!existingElement || existingElement == element)
return;
var newName = this.getNewName(element.name);
while (!!getElementByName(newName)) {
var newName = this.getNewName(element.name);
}
element.name = newName;
};
SurveyModel.prototype.getNewName = function (name) {
var pos = name.length;
while (pos > 0 && name[pos - 1] >= "0" && name[pos - 1] <= "9") {
pos--;
}
var base = name.substr(0, pos);
var num = 0;
if (pos < name.length) {
num = parseInt(name.substr(pos));
}
num++;
return base + num;
};
SurveyModel.prototype.checkIsCurrentPageHasErrors = function (isFocuseOnFirstError) {
if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; }
if (isFocuseOnFirstError === undefined) {
isFocuseOnFirstError = this.focusOnFirstError;
}
if (this.currentPage == null)
return true;
var res = this.currentPage.hasErrors(true, isFocuseOnFirstError);
this.fireValidatedErrorsOnCurrentPage();
return res;
};
SurveyModel.prototype.fireValidatedErrorsOnCurrentPage = function () {
if (this.onValidatedErrorsOnCurrentPage.isEmpty)
return;
var questionsOnPage = this.currentPage.questions;
var questions = new Array();
var errors = new Array();
for (var i = 0; i < questionsOnPage.length; i++) {
var q = questionsOnPage[i];
if (q.errors.length > 0) {
questions.push(q);
for (var j = 0; j < q.errors.length; j++) {
errors.push(q.errors[j]);
}
}
}
this.onValidatedErrorsOnCurrentPage.fire(this, {
questions: questions,
errors: errors
});
};
/**
* Call it to go to the previous page. It returns false if the current page is the first page already. It doesn't perform any checks, required questions can be empty.
* @see isFirstPage
*/
SurveyModel.prototype.prevPage = function () {
if (this.isFirstPage)
return false;
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index - 1];
};
/**
* Call it to complete the survey, if the current page is the last one. It returns false if there is an error on the page. If there is no errors on the page, it calls doComplete and returns true.
* @see isCurrentPageHasErrors
* @see nextPage
* @see doComplete
*/
SurveyModel.prototype.completeLastPage = function () {
return this.doCurrentPageComplete(true);
};
SurveyModel.prototype.doCurrentPageComplete = function (doComplete) {
if (this.hasErrorsOnNavigate(doComplete))
return false;
return this.doCurrentPageCompleteCore(doComplete);
};
SurveyModel.prototype.doCurrentPageCompleteCore = function (doComplete) {
if (this.doServerValidation())
return false;
if (doComplete) {
this.doComplete();
}
else {
this.doNextPage();
}
return true;
};
Object.defineProperty(SurveyModel.prototype, "isSinglePage", {
/**
* Set this property to true, if you want to combine all your pages in one page. Pages will be converted into panels.
* Please use questionsOnPageMode property. This property becomes obsolete
* @see questionsOnPageMode
*/
get: function () {
return this.questionsOnPageMode == "singlePage";
},
set: function (val) {
this.questionsOnPageMode = val ? "singlePage" : "standard";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionsOnPageMode", {
/**
* Set this property to 'singlePage', if you want to combine all your pages in one page. Pages will be converted into panels.
* Set it to 'questionPerPage', if you want to have one question per page. Survey will create a separate page for every question.
* This property made isSinglePage property obsolete
*/
get: function () {
return this.getPropertyValue("questionsOnPageMode", "standard");
},
set: function (val) {
this.setPropertyValue("questionsOnPageMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "firstPageIsStarted", {
/**
* Set this property to true, to make the first page your starting page. The end-user could not comeback to the start page and it is not count in the progress.
*/
get: function () {
return this.getPropertyValue("firstPageIsStarted", false);
},
set: function (val) {
this.setPropertyValue("firstPageIsStarted", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.isPageStarted = function (page) {
return (this.firstPageIsStarted && this.pages.length > 0 && this.pages[0] === page);
};
SurveyModel.prototype.onFirstPageIsStartedChanged = function () {
if (this.pages.length == 0)
return;
this.isStartedState = this.firstPageIsStarted;
this.pageVisibilityChanged(this.pages[0], !this.firstPageIsStarted);
};
SurveyModel.prototype.onQuestionsOnPageModeChanged = function (oldValue) {
if (this.questionsOnPageMode == "standard" || this.isDesignMode) {
if (this.origionalPages) {
this.questionHashesClear();
this.pages.splice(0, this.pages.length);
for (var i = 0; i < this.origionalPages.length; i++) {
this.pages.push(this.origionalPages[i]);
}
}
this.origionalPages = null;
}
else {
this.questionHashesClear();
if (!oldValue || oldValue == "standard") {
this.origionalPages = this.pages.slice(0, this.pages.length);
}
var startIndex = this.firstPageIsStarted ? 1 : 0;
_super.prototype.startLoadingFromJson.call(this);
var newPages = this.createPagesForQuestionOnPageMode(startIndex);
var deletedLen = this.pages.length - startIndex;
this.pages.splice(startIndex, deletedLen);
for (var i = 0; i < newPages.length; i++) {
this.pages.push(newPages[i]);
}
_super.prototype.endLoadingFromJson.call(this);
for (var i = 0; i < newPages.length; i++) {
newPages[i].endLoadingFromJson();
newPages[i].setSurveyImpl(this);
}
this.doElementsOnLoad();
}
this.updateVisibleIndexes();
};
SurveyModel.prototype.createPagesForQuestionOnPageMode = function (startIndex) {
if (this.isSinglePage) {
return [this.createSinglePage(startIndex)];
}
return this.createPagesForEveryQuestion(startIndex);
};
SurveyModel.prototype.createSinglePage = function (startIndex) {
var single = this.createNewPage("all");
single.setSurveyImpl(this);
for (var i = startIndex; i < this.pages.length; i++) {
var page = this.pages[i];
var panel = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].createClass("panel");
single.addPanel(panel);
var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toJsonObject(page);
new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toObject(json, panel);
if (!this.showPageTitles) {
panel.title = "";
}
}
return single;
};
SurveyModel.prototype.createPagesForEveryQuestion = function (startIndex) {
var res = [];
for (var i = startIndex; i < this.pages.length; i++) {
var origionalPage = this.pages[i];
for (var j = 0; j < origionalPage.elements.length; j++) {
var origionalElement = origionalPage.elements[j];
var element = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].createClass(origionalElement.getType());
if (!element)
continue;
var page = this.createNewPage("page" + (res.length + 1));
page.setSurveyImpl(this);
res.push(page);
var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toJsonObject(origionalElement);
new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toObject(json, element);
page.addElement(element);
}
}
return res;
};
Object.defineProperty(SurveyModel.prototype, "isFirstPage", {
/**
* Returns true if the current page is the first one.
*/
get: function () {
if (this.currentPage == null)
return true;
return this.visiblePages.indexOf(this.currentPage) == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowPrevButton", {
get: function () {
if (this.isFirstPage || !this.showPrevButton)
return false;
var page = this.visiblePages[this.currentPageNo - 1];
return this.getPageMaxTimeToFinish(page) <= 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLastPage", {
/**
* Returns true if the current page is the last one.
*/
get: function () {
if (this.currentPage == null)
return true;
var vPages = this.visiblePages;
return vPages.indexOf(this.currentPage) == vPages.length - 1;
},
enumerable: true,
configurable: true
});
/**
* Call it to complete the survey. It writes cookie if cookieName property is not empty, set the survey into 'completed' state, fire onComplete event and sendResult into [dxsurvey.com](http://www.dxsurvey.com) service if surveyPostId property is not empty. It doesn't perform any validation, unlike completeLastPage function.
* @see cookieName
* @see state
* @see onComplete
* @see surveyPostId
* @see completeLastPage
*/
SurveyModel.prototype.doComplete = function () {
var onCompletingOptions = { allowComplete: true };
this.onCompleting.fire(this, onCompletingOptions);
if (!onCompletingOptions.allowComplete)
return;
var previousCookie = this.hasCookie;
this.stopTimer();
this.setCompleted();
this.clearUnusedValues();
this.setCookie();
var self = this;
var onCompleteOptions = {
showDataSaving: function (text) {
self.setCompletedState("saving", text);
},
showDataSavingError: function (text) {
self.setCompletedState("error", text);
},
showDataSavingSuccess: function (text) {
self.setCompletedState("success", text);
},
showDataSavingClear: function (text) {
self.setCompletedState("", "");
}
};
this.onComplete.fire(this, onCompleteOptions);
if (!previousCookie && this.surveyPostId) {
this.sendResult();
}
this.navigateTo();
};
/**
* Start the survey. Change the mode from "starting" to "running". You need to call it, if there is a started page in your survey, otherwise it does nothing.
* @see firstPageIsStarted
*/
SurveyModel.prototype.start = function () {
if (!this.firstPageIsStarted)
return;
this.isStartedState = false;
this.startTimerFromUI();
this.onStarted.fire(this, {});
};
Object.defineProperty(SurveyModel.prototype, "isValidatingOnServer", {
/**
* Returns true, if at the current moment the question values on the current page are validating on the server.
* @see onServerValidateQuestions
*/
get: function () {
return this.getPropertyValue("isValidatingOnServer", false);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setIsValidatingOnServer = function (val) {
if (val == this.isValidatingOnServer)
return;
this.setPropertyValue("isValidatingOnServer", val);
this.onIsValidatingOnServerChanged();
};
SurveyModel.prototype.onIsValidatingOnServerChanged = function () { };
SurveyModel.prototype.doServerValidation = function () {
if (!this.onServerValidateQuestions ||
this.onServerValidateQuestions.isEmpty)
return false;
var self = this;
var options = {
data: {},
errors: {},
survey: this,
complete: function () {
self.completeServerValidation(options);
}
};
for (var i = 0; i < this.currentPage.questions.length; i++) {
var question = this.currentPage.questions[i];
if (!question.visible)
continue;
var value = this.getValue(question.getValueName());
if (!this.isValueEmpty(value))
options.data[question.getValueName()] = value;
}
this.setIsValidatingOnServer(true);
if (typeof this.onServerValidateQuestions === "function") {
this.onServerValidateQuestions(this, options);
}
else {
this.onServerValidateQuestions.fire(this, options);
}
return true;
};
SurveyModel.prototype.completeServerValidation = function (options) {
this.setIsValidatingOnServer(false);
if (!options && !options.survey)
return;
var self = options.survey;
var hasErrors = false;
if (options.errors) {
for (var name in options.errors) {
var question = self.getQuestionByName(name);
if (question && question["errors"]) {
hasErrors = true;
question["addError"](new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.errors[name], this));
}
}
}
if (!hasErrors) {
if (self.isLastPage)
self.doComplete();
else
self.doNextPage();
}
};
SurveyModel.prototype.doNextPage = function () {
this.checkOnPageTriggers();
if (!this.isCompleted) {
if (this.sendResultOnPageNext) {
this.sendResult(this.surveyPostId, this.clientId, true);
}
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index + 1];
}
else {
this.doComplete();
}
};
SurveyModel.prototype.setCompleted = function () {
this.isCompleted = true;
};
Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", {
/**
* Returns the html for completed 'Thank you' page.
* @see completedHtml
*/
get: function () {
var html = this.renderedCompletedHtml;
if (html) {
return this.processHtml(html);
}
return "
" + this.getLocString("completingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedCompletedBeforeHtml", {
/**
* Returns the html showing that the user has already completed the survey
* @see completedHtml
*/
get: function () {
if (this.completedBeforeHtml) {
return this.processHtml(this.completedBeforeHtml);
}
return "" + this.getLocString("completingSurveyBefore") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedLoadingHtml", {
/**
* Returns the html that shows on loading the json.
*/
get: function () {
if (this.loadingHtml) {
return this.processHtml(this.loadingHtml);
}
return "" + this.getLocString("loadingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "progressText", {
/**
* Returns the text for the current progress.
*/
get: function () {
if (this.currentPage == null)
return "";
if (this.progressBarType === "questions") {
var questions = this.getAllQuestions();
var answeredQuestionsCount = questions.reduce(function (a, b) { return a + (b.isEmpty() ? 0 : 1); }, 0);
return this.getLocString("questionsProgressText")["format"](answeredQuestionsCount, questions.length);
}
if (this.progressBarType === "correctQuestions") {
var questions = this.getAllQuestions();
var correctAnswersCount = this.getCorrectedAnswerCount();
return this.getLocString("questionsProgressText")["format"](correctAnswersCount, questions.length);
}
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage) + 1;
return this.getLocString("progressText")["format"](index, vPages.length);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.afterRenderSurvey = function (htmlElement) {
this.onAfterRenderSurvey.fire(this, {
survey: this,
htmlElement: htmlElement
});
};
SurveyModel.prototype.updateQuestionCssClasses = function (question, cssClasses) {
this.onUpdateQuestionCssClasses.fire(this, {
question: question,
cssClasses: cssClasses
});
};
SurveyModel.prototype.updatePanelCssClasses = function (panel, cssClasses) {
this.onUpdatePanelCssClasses.fire(this, {
panel: panel,
cssClasses: cssClasses
});
};
SurveyModel.prototype.afterRenderPage = function (htmlElement) {
if (this.onAfterRenderPage.isEmpty)
return;
this.onAfterRenderPage.fire(this, {
page: this.currentPage,
htmlElement: htmlElement
});
};
SurveyModel.prototype.afterRenderQuestion = function (question, htmlElement) {
this.onAfterRenderQuestion.fire(this, {
question: question,
htmlElement: htmlElement
});
};
SurveyModel.prototype.afterRenderPanel = function (panel, htmlElement) {
this.onAfterRenderPanel.fire(this, {
panel: panel,
htmlElement: htmlElement
});
};
SurveyModel.prototype.matrixBeforeRowAdded = function (options) {
this.onMatrixBeforeRowAdded.fire(this, options);
};
SurveyModel.prototype.matrixRowAdded = function (question) {
this.onMatrixRowAdded.fire(this, { question: question });
};
SurveyModel.prototype.getQuestionByValueNameFromArray = function (valueName, name, index) {
var questions = this.getQuestionsByValueNameCore(valueName);
if (!questions)
return;
for (var i = 0; i < questions.length; i++) {
var res = questions[i].getQuestionFromArray(name, index);
if (!!res)
return res;
}
return null;
};
SurveyModel.prototype.matrixRowRemoved = function (question, rowIndex, row) {
this.onMatrixRowRemoved.fire(this, {
question: question,
rowIndex: rowIndex,
row: row
});
};
SurveyModel.prototype.matrixAllowRemoveRow = function (question, rowIndex, row) {
var options = {
question: question,
rowIndex: rowIndex,
row: row,
allow: true
};
this.onMatrixAllowRemoveRow.fire(this, options);
return options.allow;
};
SurveyModel.prototype.matrixCellCreated = function (question, options) {
options.question = question;
this.onMatrixCellCreated.fire(this, options);
};
SurveyModel.prototype.matrixAfterCellRender = function (question, options) {
options.question = question;
this.onMatrixAfterCellRender.fire(this, options);
};
SurveyModel.prototype.matrixCellValueChanged = function (question, options) {
options.question = question;
this.onMatrixCellValueChanged.fire(this, options);
};
SurveyModel.prototype.matrixCellValueChanging = function (question, options) {
options.question = question;
this.onMatrixCellValueChanging.fire(this, options);
};
SurveyModel.prototype.matrixCellValidate = function (question, options) {
options.question = question;
this.onMatrixCellValidate.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.error, this) : null;
};
SurveyModel.prototype.dynamicPanelAdded = function (question) {
this.onDynamicPanelAdded.fire(this, { question: question });
};
SurveyModel.prototype.dynamicPanelRemoved = function (question, panelIndex) {
this.onDynamicPanelRemoved.fire(this, {
question: question,
panelIndex: panelIndex
});
};
SurveyModel.prototype.dynamicPanelItemValueChanged = function (question, options) {
options.question = question;
this.onDynamicPanelItemValueChanged.fire(this, options);
};
SurveyModel.prototype.dragAndDropAllow = function (options) {
options.allow = true;
this.onDragDropAllow.fire(this, options);
return options.allow;
};
/**
* Upload the file into server
* @param name question name
* @param file uploading file
* @param storeDataAsText set it to true to encode file content into the survey results
* @param uploadingCallback a call back function to get the status on uploading the file
*/
SurveyModel.prototype.uploadFiles = function (name, files, uploadingCallback) {
if (this.onUploadFiles.isEmpty) {
uploadingCallback("error", files);
}
else {
this.onUploadFiles.fire(this, {
name: name,
files: files || [],
callback: uploadingCallback
});
}
if (this.surveyPostId) {
this.uploadFilesCore(name, files, uploadingCallback);
}
};
/**
* Download the file from server
* @param name question name
* @param fileValue single file question value
* @param callback a call back function to get the status on downloading the file and the downloaded file content
*/
SurveyModel.prototype.downloadFile = function (questionName, fileValue, callback) {
if (this.onDownloadFile.isEmpty) {
!!callback && callback("success", fileValue.content || fileValue);
}
this.onDownloadFile.fire(this, {
name: questionName,
content: fileValue.content || fileValue,
fileValue: fileValue,
callback: callback
});
};
/**
* Clear files from server
* @param name question name
* @param value file question value
* @param callback a call back function to get the status of the clearing operation
*/
SurveyModel.prototype.clearFiles = function (name, value, fileName, callback) {
if (this.onClearFiles.isEmpty) {
!!callback && callback("success", value);
}
this.onClearFiles.fire(this, {
name: name,
value: value,
fileName: fileName,
callback: callback
});
};
SurveyModel.prototype.updateChoicesFromServer = function (question, choices, serverResult) {
var options = {
question: question,
choices: choices,
serverResult: serverResult
};
this.onLoadChoicesFromServer.fire(this, options);
return options.choices;
};
SurveyModel.prototype.createSurveyService = function () {
return new __WEBPACK_IMPORTED_MODULE_8__dxSurveyService__["a" /* dxSurveyService */]();
};
SurveyModel.prototype.uploadFilesCore = function (name, files, uploadingCallback) {
var _this = this;
var responses = [];
files.forEach(function (file) {
if (uploadingCallback)
uploadingCallback("uploading", file);
_this.createSurveyService().sendFile(_this.surveyPostId, file, function (success, response) {
if (success) {
responses.push({ content: response, file: file });
if (responses.length === files.length) {
if (uploadingCallback)
uploadingCallback("success", responses);
}
}
else {
if (uploadingCallback)
uploadingCallback("error", { response: response, file: file });
}
});
});
};
SurveyModel.prototype.getPage = function (index) {
return this.pages[index];
};
/**
* Add a page into the survey
* @param page
* @see addNewPage
*/
SurveyModel.prototype.addPage = function (page) {
if (page == null)
return;
this.pages.push(page);
this.updateVisibleIndexes();
};
/**
* Creates a new page and adds it into the survey. Genarates a new name if the name parameter is not set.
* @param name a page name
* @see addPage
*/
SurveyModel.prototype.addNewPage = function (name) {
if (name === void 0) { name = null; }
var page = this.createNewPage(name);
this.addPage(page);
return page;
};
/**
* Remove the page from the survey
* @param page
*/
SurveyModel.prototype.removePage = function (page) {
var index = this.pages.indexOf(page);
if (index < 0)
return;
this.pages.splice(index, 1);
if (this.currentPageValue == page) {
this.currentPage = this.pages.length > 0 ? this.pages[0] : null;
}
this.updateVisibleIndexes();
};
/**
* Returns a question by its name
* @param name a question name
* @param caseInsensitive
* @see getQuestionByValueName
*/
SurveyModel.prototype.getQuestionByName = function (name, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var hash = !!caseInsensitive
? this.questionHashes.namesInsensitive
: this.questionHashes.names;
var res = hash[name];
if (!res)
return null;
return res[0];
};
/**
* Returns a question by its value name
* @param valueName a question name
* @param caseInsensitive
* @see getQuestionByName
* @see Question.valueName
*/
SurveyModel.prototype.getQuestionByValueName = function (valueName, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var res = this.getQuestionsByValueNameCore(valueName, caseInsensitive);
return !!res ? res[0] : null;
};
SurveyModel.prototype.getQuestionsByValueNameCore = function (valueName, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var hash = !!caseInsensitive
? this.questionHashes.valueNamesInsensitive
: this.questionHashes.valueNames;
var res = hash[valueName];
if (!res)
return null;
return res;
};
/**
* Get a list of questions by their names
* @param names the array of names
* @param caseInsensitive
*/
SurveyModel.prototype.getQuestionsByNames = function (names, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var result = [];
if (!names)
return result;
for (var i = 0; i < names.length; i++) {
if (!names[i])
continue;
var question = this.getQuestionByName(names[i], caseInsensitive);
if (question)
result.push(question);
}
return result;
};
/**
* Returns a page on which an element (question or panel) is placed.
* @param element Question or Panel
*/
SurveyModel.prototype.getPageByElement = function (element) {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
if (page.containsElement(element))
return page;
}
return null;
};
/**
* Returns a page on which a question is located
* @param question
*/
SurveyModel.prototype.getPageByQuestion = function (question) {
return this.getPageByElement(question);
};
/**
* Returns a page by it's name.
* @param name
*/
SurveyModel.prototype.getPageByName = function (name) {
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].name == name)
return this.pages[i];
}
return null;
};
/**
* Rertuns a list of pages by their names
* @param names a list of pages names
*/
SurveyModel.prototype.getPagesByNames = function (names) {
var result = [];
if (!names)
return result;
for (var i = 0; i < names.length; i++) {
if (!names[i])
continue;
var page = this.getPageByName(names[i]);
if (page)
result.push(page);
}
return result;
};
/**
* Returns the list of all questions in the survey
* @param visibleOnly set it true, if you want to get only visible questions
*/
SurveyModel.prototype.getAllQuestions = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addQuestionsToList(result, visibleOnly, includingDesignTime);
}
return result;
};
/**
* Returns quiz questions. All visible questions that has input(s) widgets.
* @see getQuizQuestionCount
*/
SurveyModel.prototype.getQuizQuestions = function () {
var result = new Array();
var startIndex = this.firstPageIsStarted ? 1 : 0;
for (var i = startIndex; i < this.pages.length; i++) {
if (!this.pages[i].isVisible)
continue;
var questions = this.pages[i].questions;
for (var j = 0; j < questions.length; j++) {
var q = questions[j];
if (q.quizQuestionCount > 0) {
result.push(q);
}
}
}
return result;
};
/**
* Returns a panel by its name
* @param name a panel name
* @param caseInsensitive
* @see getQuestionByName
*/
SurveyModel.prototype.getPanelByName = function (name, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var panels = this.getAllPanels();
if (caseInsensitive)
name = name.toLowerCase();
for (var i = 0; i < panels.length; i++) {
var panelName = panels[i].name;
if (caseInsensitive)
panelName = panelName.toLowerCase();
if (panelName == name)
return panels[i];
}
return null;
};
/**
* Returns the list of all panels in the survey
*/
SurveyModel.prototype.getAllPanels = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addPanelsIntoList(result, visibleOnly, includingDesignTime);
}
return result;
};
SurveyModel.prototype.createNewPage = function (name) {
return new __WEBPACK_IMPORTED_MODULE_5__page__["a" /* PageModel */](name);
};
SurveyModel.prototype.questionOnValueChanging = function (valueName, newValue) {
if (this.onValueChanging.isEmpty)
return newValue;
var options = {
name: valueName,
question: this.getQuestionByValueName(valueName),
value: newValue,
oldValue: this.getValue(valueName)
};
this.onValueChanging.fire(this, options);
return options.value;
};
SurveyModel.prototype.updateQuestionValue = function (valueName, newValue) {
if (this.isLoadingFromJson)
return;
var questions = this.getQuestionsByValueNameCore(valueName);
if (!!questions) {
for (var i = 0; i < questions.length; i++) {
if (this.isTwoValueEquals(questions[i].value, newValue))
continue;
questions[i].updateValueFromSurvey(newValue);
}
}
};
SurveyModel.prototype.notifyQuestionOnValueChanged = function (valueName, newValue) {
if (this.isLoadingFromJson)
return;
var questions = this.getQuestionsByValueNameCore(valueName);
if (!!questions) {
for (var i = 0; i < questions.length; i++) {
var question = questions[i];
if (this.checkErrorsMode == "onValueChanged") {
var oldErrorCount = question.errors.length;
question.hasErrors(true);
if (oldErrorCount > 0 || question.errors.length > 0) {
this.fireValidatedErrorsOnCurrentPage();
}
}
question.onSurveyValueChanged(newValue);
this.onValueChanged.fire(this, {
name: valueName,
question: question,
value: newValue
});
}
}
else {
this.onValueChanged.fire(this, {
name: valueName,
question: null,
value: newValue
});
}
this.notifyElementsOnAnyValueOrVariableChanged(valueName);
};
SurveyModel.prototype.notifyElementsOnAnyValueOrVariableChanged = function (name) {
if (this.isEndLoadingFromJson === "processing")
return;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onAnyValueChanged(name);
}
if (!this.isEndLoadingFromJson) {
this.locStrsChanged();
}
};
SurveyModel.prototype.updateAllQuestionsValue = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
var valName = q.getValueName();
q.updateValueFromSurvey(this.getValue(valName));
if (q.requireUpdateCommentValue) {
q.updateCommentFromSurvey(this.getComment(valName));
}
}
};
SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].onSurveyValueChanged(this.getValue(questions[i].getValueName()));
}
};
SurveyModel.prototype.checkOnPageTriggers = function () {
var questions = this.getCurrentPageQuestions();
var values = {};
for (var i = 0; i < questions.length; i++) {
var question = questions[i];
var name = question.getValueName();
values[name] = this.getValue(name);
}
this.checkTriggers(values, true);
};
SurveyModel.prototype.getCurrentPageQuestions = function () {
var result = [];
var page = this.currentPage;
if (!page)
return result;
for (var i = 0; i < page.questions.length; i++) {
var question = page.questions[i];
if (!question.visible || !question.name)
continue;
result.push(question);
}
return result;
};
SurveyModel.prototype.checkTriggers = function (key, isOnNextPage) {
if (this.isCompleted || this.triggers.length == 0)
return;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
for (var i = 0; i < this.triggers.length; i++) {
var trigger = this.triggers[i];
if (trigger.isOnNextPage == isOnNextPage) {
trigger.checkExpression(key, values, properties);
}
}
};
SurveyModel.prototype.doElementsOnLoad = function () {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onSurveyLoad();
}
};
SurveyModel.prototype.runConditions = function () {
if (this.isCompleted || this.isEndLoadingFromJson === "processing")
return;
var pages = this.pages;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
for (var i = 0; i < this.calculatedValues.length; i++) {
this.calculatedValues[i].runExpression(values, properties);
}
for (var i = 0; i < pages.length; i++) {
pages[i].runCondition(values, properties);
}
};
/**
* Send the survey result into [dxsurvey.com](http://www.dxsurvey.com) service.
* @param postId [dxsurvey.com](http://www.dxsurvey.com) service postId
* @param clientId Typically a customer e-mail or an identificator
* @param isPartialCompleted Set it to true if the survey is not completed yet and it is an intermediate results
* @see surveyPostId
* @see clientId
*/
SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) {
if (postId === void 0) { postId = null; }
if (clientId === void 0) { clientId = null; }
if (isPartialCompleted === void 0) { isPartialCompleted = false; }
if (!this.isEditMode)
return;
if (isPartialCompleted && this.onPartialSend) {
this.onPartialSend.fire(this, null);
}
if (!postId && this.surveyPostId) {
postId = this.surveyPostId;
}
if (!postId)
return;
if (clientId) {
this.clientId = clientId;
}
if (isPartialCompleted && !this.clientId)
return;
var self = this;
if (this.surveyShowDataSaving) {
this.setCompletedState("saving", "");
}
this.createSurveyService().sendResult(postId, this.data, function (success, response, request) {
if (self.surveyShowDataSaving) {
if (success) {
self.setCompletedState("success", "");
}
else {
self.setCompletedState("error", "");
}
}
self.onSendResult.fire(self, {
success: success,
response: response,
request: request
});
}, this.clientId, isPartialCompleted);
};
/**
* It calls the [dxsurvey.com](http://www.dxsurvey.com) service and on callback fires onGetResult event with all answers that your users made for a question.
* @param resultId [dxsurvey.com](http://www.dxsurvey.com) service resultId
* @param name The question name
* @see onGetResult
*/
SurveyModel.prototype.getResult = function (resultId, name) {
var self = this;
this.createSurveyService().getResult(resultId, name, function (success, data, dataList, response) {
self.onGetResult.fire(self, {
success: success,
data: data,
dataList: dataList,
response: response
});
});
};
/**
* Loads the survey Json from the [dxsurvey.com](http://www.dxsurvey.com) service. If clientId is not null and user has already completed the survey, the survey will go into "completedbefore" state.
* @param surveyId [dxsurvey.com](http://www.dxsurvey.com) service surveyId
* @param clientId indentificator for a user, for example e-mail or unique customer id in your web application.
* @see state
*/
SurveyModel.prototype.loadSurveyFromService = function (surveyId, cliendId) {
if (surveyId === void 0) { surveyId = null; }
if (cliendId === void 0) { cliendId = null; }
if (surveyId) {
this.surveyId = surveyId;
}
if (cliendId) {
this.clientId = cliendId;
}
var self = this;
this.isLoading = true;
this.onLoadingSurveyFromService();
if (cliendId) {
this.createSurveyService().getSurveyJsonAndIsCompleted(this.surveyId, this.clientId, function (success, json, isCompleted, response) {
self.isLoading = false;
if (success) {
self.isCompletedBefore = isCompleted == "completed";
self.loadSurveyFromServiceJson(json);
}
});
}
else {
this.createSurveyService().loadSurvey(this.surveyId, function (success, result, response) {
self.isLoading = false;
if (success) {
self.loadSurveyFromServiceJson(result);
}
});
}
};
SurveyModel.prototype.loadSurveyFromServiceJson = function (json) {
if (!json)
return;
this.fromJSON(json);
this.notifyAllQuestionsOnValueChanged();
this.onLoadSurveyFromService();
};
SurveyModel.prototype.onLoadingSurveyFromService = function () { };
SurveyModel.prototype.onLoadSurveyFromService = function () { };
SurveyModel.prototype.updateVisibleIndexes = function () {
if (this.isLoadingFromJson || !!this.isEndLoadingFromJson)
return;
this.updatePageVisibleIndexes(this.showPageNumbers);
if (this.showQuestionNumbers == "onPage") {
var visPages = this.visiblePages;
for (var i = 0; i < visPages.length; i++) {
visPages[i].setVisibleIndex(0);
}
}
else {
var index = this.showQuestionNumbers == "on" ? 0 : -1;
for (var i = 0; i < this.pages.length; i++) {
index += this.pages[i].setVisibleIndex(index);
}
}
};
SurveyModel.prototype.updatePageVisibleIndexes = function (showIndex) {
var index = 0;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].visibleIndex = this.pages[i].visible ? index++ : -1;
this.pages[i].num =
showIndex && this.pages[i].visible
? this.pages[i].visibleIndex + 1
: -1;
}
};
SurveyModel.prototype.fromJSON = function (json) {
if (!json)
return;
this.questionHashesClear();
this.jsonErrors = null;
var jsonConverter = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]();
jsonConverter.toObject(json, this);
if (jsonConverter.errors.length > 0) {
this.jsonErrors = jsonConverter.errors;
}
};
SurveyModel.prototype.setJsonObject = function (jsonObj) {
this.fromJSON(jsonObj);
};
SurveyModel.prototype.endLoadingFromJson = function () {
this.isEndLoadingFromJson = "processing";
this.isStartedState = this.firstPageIsStarted;
this.onQuestionsOnPageModeChanged("standard");
_super.prototype.endLoadingFromJson.call(this);
if (this.hasCookie) {
this.doComplete();
}
this.doElementsOnLoad();
this.isEndLoadingFromJson = "conditions";
this.runConditions();
this.notifyElementsOnAnyValueOrVariableChanged("");
this.isEndLoadingFromJson = null;
this.updateVisibleIndexes();
};
SurveyModel.prototype.onBeforeCreating = function () { };
SurveyModel.prototype.onCreating = function () { };
SurveyModel.prototype.getProcessedTextValue = function (textValue) {
this.getProcessedTextValueCore(textValue);
if (!this.onProcessTextValue.isEmpty) {
var wasEmpty = this.isValueEmpty(textValue.value);
this.onProcessTextValue.fire(this, textValue);
textValue.isExists =
textValue.isExists || (wasEmpty && !this.isValueEmpty(textValue.value));
}
};
SurveyModel.prototype.getProcessedTextValueCore = function (textValue) {
var name = textValue.name.toLocaleLowerCase();
if (["no", "require", "title"].indexOf(name) !== -1) {
return;
}
if (name === "pageno") {
textValue.isExists = true;
var page = this.currentPage;
textValue.value = page != null ? this.visiblePages.indexOf(page) + 1 : 0;
return;
}
if (name === "pagecount") {
textValue.isExists = true;
textValue.value = this.visiblePageCount;
return;
}
if (name === "locale") {
textValue.isExists = true;
textValue.value = !!this.locale
? this.locale
: __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].defaultLocale;
return;
}
if (name === "correctedanswers" || name === "correctedanswercount") {
textValue.isExists = true;
textValue.value = this.getCorrectedAnswerCount();
return;
}
if (name === "incorrectedanswers" || name === "incorrectedanswercount") {
textValue.isExists = true;
textValue.value = this.getInCorrectedAnswerCount();
return;
}
if (name === "questioncount") {
textValue.isExists = true;
textValue.value = this.getQuizQuestionCount();
return;
}
var firstName = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name, this.data);
var variable = this.getVariable(name);
if (variable !== undefined) {
textValue.isExists = true;
textValue.value = variable;
return;
}
if (!!firstName)
firstName = firstName.toLowerCase();
var question = this.getQuestionByValueName(firstName, true);
if (question) {
textValue.isExists = true;
name = question.getValueName() + name.substr(firstName.length);
name = name.toLocaleLowerCase();
var values = {};
values[firstName] = textValue.returnDisplayValue
? question.getDisplayValue(false, undefined)
: question.value;
textValue.value = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, values);
return;
}
var value = this.getValue(textValue.name);
if (value !== undefined) {
textValue.isExists = true;
textValue.value = value;
}
};
SurveyModel.prototype.clearUnusedValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].clearUnusedValues();
}
if (this.clearInvisibleValues != "none") {
this.clearInvisibleQuestionValues();
}
};
SurveyModel.prototype.hasVisibleQuestionByValueName = function (valueName) {
var questions = this.getQuestionsByValueNameCore(valueName);
if (!questions)
return false;
for (var i = 0; i < questions.length; i++) {
if (questions[i].isVisible)
return true;
}
return false;
};
SurveyModel.prototype.questionCountByValueName = function (valueName) {
var questions = this.getQuestionsByValueNameCore(valueName);
return !!questions ? questions.length : 0;
};
SurveyModel.prototype.clearInvisibleQuestionValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].clearValueIfInvisible();
}
};
/**
* Returns a variable value. Variable, unlike values, are not stored in the survey results.
* @param name A variable name
* @see SetVariable
*/
SurveyModel.prototype.getVariable = function (name) {
if (!name)
return null;
name = name.toLowerCase();
var res = this.variablesHash[name];
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(res))
return res;
if (name.indexOf(".") > -1 || name.indexOf("[") > -1) {
if (new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().hasValue(name, this.variablesHash))
return new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, this.variablesHash);
}
return res;
};
/**
* Sets a variable value. Variable, unlike values, are not stored in the survey results.
* @param name A variable name
* @param newValue
* @see GetVariable
*/
SurveyModel.prototype.setVariable = function (name, newValue) {
if (!name)
return;
name = name.toLowerCase();
this.variablesHash[name] = newValue;
this.notifyElementsOnAnyValueOrVariableChanged(name);
this.runConditions();
};
//ISurvey data
SurveyModel.prototype.getUnbindValue = function (value) {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(value);
};
/**
* Returns a question value
* @param name A question name
* @see data
* @see setValue
*/
SurveyModel.prototype.getValue = function (name) {
if (!name || name.length == 0)
return null;
var value = this.getDataValueCore(this.valuesHash, name);
return this.getUnbindValue(value);
};
/**
* Sets a question value. It runs all triggers and conditions (visibleIf properties). Goes to the next page if goNextPageAutomatic is true and all questions on the current page are answered correctly.
* @param name A question name
* @param newValue
* @see data
* @see getValue
* @see PageModel.visibleIf
* @see Question.visibleIf
* @see goNextPageAutomatic
*/
SurveyModel.prototype.setValue = function (name, newQuestionValue, locNotification) {
if (locNotification === void 0) { locNotification = false; }
var newValue = this.questionOnValueChanging(name, newQuestionValue);
if (this.isValueEqual(name, newValue) &&
this.isTwoValueEquals(newValue, newQuestionValue))
return;
if (this.isValueEmpty(newValue)) {
this.deleteDataValueCore(this.valuesHash, name);
}
else {
newValue = this.getUnbindValue(newValue);
this.setDataValueCore(this.valuesHash, name, newValue);
}
this.updateQuestionValue(name, newValue);
if (locNotification === true)
return;
var triggerKeys = {};
triggerKeys[name] = newValue;
this.checkTriggers(triggerKeys, false);
this.runConditions();
this.notifyQuestionOnValueChanged(name, newValue);
if (locNotification !== "text") {
this.tryGoNextPageAutomatic(name);
}
};
SurveyModel.prototype.isValueEqual = function (name, newValue) {
if (newValue === "" || newValue === undefined)
newValue = null;
var oldValue = this.getValue(name);
if (oldValue === "" || oldValue === undefined)
oldValue = null;
if (newValue === null || oldValue === null)
return newValue === oldValue;
return this.isTwoValueEquals(newValue, oldValue);
};
SurveyModel.prototype.doOnPageAdded = function (page) {
page.setSurveyImpl(this);
if (!page.name)
page.name = this.generateNewName(this.pages, "page");
this.questionHashesPanelAdded(page);
var options = { page: page };
this.onPageAdded.fire(this, options);
};
SurveyModel.prototype.generateNewName = function (elements, baseName) {
var keys = {};
for (var i = 0; i < elements.length; i++)
keys[elements[i]["name"]] = true;
var index = 1;
while (keys[baseName + index])
index++;
return baseName + index;
};
SurveyModel.prototype.tryGoNextPageAutomatic = function (name) {
if (!!this.isEndLoadingFromJson ||
!this.goNextPageAutomatic ||
!this.currentPage)
return;
var question = this.getQuestionByValueName(name);
if (!question ||
(!!question &&
(!question.visible || !question.supportGoNextPageAutomatic())))
return;
var questions = this.getCurrentPageQuestions();
if (questions.indexOf(question) < 0)
return;
for (var i = 0; i < questions.length; i++) {
if (questions[i].hasInput && questions[i].isEmpty())
return;
}
if (!this.checkIsCurrentPageHasErrors(false)) {
if (!this.isLastPage) {
this.nextPage();
}
else {
if (this.goNextPageAutomatic === true &&
this.allowCompleteSurveyAutomatic) {
this.completeLastPage();
}
}
}
};
/**
* Returns the comment value
* @param name
* @see setComment
*/
SurveyModel.prototype.getComment = function (name) {
var result = this.data[name + this.commentPrefix];
if (result == null)
result = "";
return result;
};
/**
* Set the comment value
* @param name
* @param newValue
* @see getComment
*/
SurveyModel.prototype.setComment = function (name, newValue, locNotification) {
if (locNotification === void 0) { locNotification = false; }
if (!newValue)
newValue = "";
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, this.getComment(name)))
return;
var commentName = name + this.commentPrefix;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(newValue)) {
this.deleteDataValueCore(this.valuesHash, commentName);
}
else {
this.setDataValueCore(this.valuesHash, commentName, newValue);
}
var questions = this.getQuestionsByValueNameCore(name);
if (!!questions) {
for (var i = 0; i < questions.length; i++) {
questions[i].updateCommentFromSurvey(newValue);
}
}
if (locNotification !== "text") {
this.tryGoNextPageAutomatic(name);
}
var question = this.getQuestionByName(name);
if (question) {
this.onValueChanged.fire(this, {
name: commentName,
question: question,
value: newValue
});
}
};
/**
* Remove the value from the survey result.
* @param {string} name The name of the value. Typically it is a question name
*/
SurveyModel.prototype.clearValue = function (name) {
this.setValue(name, null);
this.setComment(name, null);
};
Object.defineProperty(SurveyModel.prototype, "clearValueOnDisableItems", {
/**
* Set this value to true, to clear value on disable items in checkbox, dropdown and radiogroup questions.
* By default values are not cleared on disabled the corresponded items. This property is not persisted in survey json and you have to set it in code.
*/
get: function () {
return this.getPropertyValue("clearValueOnDisableItems", false);
},
set: function (val) {
this.setPropertyValue("clearValueOnDisableItems", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.questionVisibilityChanged = function (question, newValue) {
this.updateVisibleIndexes();
this.onVisibleChanged.fire(this, {
question: question,
name: question.name,
visible: newValue
});
if (question &&
!question.visible &&
this.clearInvisibleValues == "onHidden") {
question.clearValue();
}
};
SurveyModel.prototype.pageVisibilityChanged = function (page, newValue) {
this.updateVisibleIndexes();
this.onPageVisibleChanged.fire(this, { page: page, visible: newValue });
};
SurveyModel.prototype.panelVisibilityChanged = function (panel, newValue) {
this.updateVisibleIndexes();
this.onPanelVisibleChanged.fire(this, { panel: panel, visible: newValue });
};
SurveyModel.prototype.questionAdded = function (question, index, parentPanel, rootPanel) {
if (!question.name) {
question.name = this.generateNewName(this.getAllQuestions(false, true), "question");
}
if (!!question.page) {
this.questionHashesAdded(question);
}
if (!this.isLoadingFromJson) {
this.updateVisibleIndexes();
}
this.onQuestionAdded.fire(this, {
question: question,
name: question.name,
index: index,
parentPanel: parentPanel,
rootPanel: rootPanel
});
};
SurveyModel.prototype.questionRemoved = function (question) {
this.questionHashesRemoved(question, question.name, question.getValueName());
this.updateVisibleIndexes();
this.onQuestionRemoved.fire(this, {
question: question,
name: question.name
});
};
SurveyModel.prototype.questionRenamed = function (question, oldName, oldValueName) {
this.questionHashesRemoved(question, oldName, oldValueName);
this.questionHashesAdded(question);
};
SurveyModel.prototype.questionHashesClear = function () {
this.questionHashes.names = {};
this.questionHashes.namesInsensitive = {};
this.questionHashes.valueNames = {};
this.questionHashes.valueNamesInsensitive = {};
};
SurveyModel.prototype.questionHashesPanelAdded = function (panel) {
if (this.isLoadingFromJson)
return;
var questions = panel.questions;
for (var i = 0; i < questions.length; i++) {
this.questionHashesAdded(questions[i]);
}
};
SurveyModel.prototype.questionHashesAdded = function (question) {
this.questionHashAddedCore(this.questionHashes.names, question, question.name);
this.questionHashAddedCore(this.questionHashes.namesInsensitive, question, question.name.toLowerCase());
this.questionHashAddedCore(this.questionHashes.valueNames, question, question.getValueName());
this.questionHashAddedCore(this.questionHashes.valueNamesInsensitive, question, question.getValueName().toLowerCase());
};
SurveyModel.prototype.questionHashesRemoved = function (question, name, valueName) {
if (!!name) {
this.questionHashRemovedCore(this.questionHashes.names, question, name);
this.questionHashRemovedCore(this.questionHashes.namesInsensitive, question, name.toLowerCase());
}
if (!!valueName) {
this.questionHashRemovedCore(this.questionHashes.valueNames, question, valueName);
this.questionHashRemovedCore(this.questionHashes.valueNamesInsensitive, question, valueName.toLowerCase());
}
};
SurveyModel.prototype.questionHashAddedCore = function (hash, question, name) {
var res = hash[name];
if (!!res) {
var res = hash[name];
if (res.indexOf(question) < 0) {
res.push(question);
}
}
else {
hash[name] = [question];
}
};
SurveyModel.prototype.questionHashRemovedCore = function (hash, question, name) {
var res = hash[name];
if (!res)
return;
var index = res.indexOf(question);
if (index > -1) {
res.splice(index, 1);
}
if (res.length == 0) {
delete hash[name];
}
};
SurveyModel.prototype.panelAdded = function (panel, index, parentPanel, rootPanel) {
if (!panel.name) {
panel.name = this.generateNewName(this.getAllPanels(false, true), "panel");
}
this.questionHashesPanelAdded(panel);
this.updateVisibleIndexes();
this.onPanelAdded.fire(this, {
panel: panel,
name: panel.name,
index: index,
parentPanel: parentPanel,
rootPanel: rootPanel
});
};
SurveyModel.prototype.panelRemoved = function (panel) {
this.updateVisibleIndexes();
this.onPanelRemoved.fire(this, { panel: panel, name: panel.name });
};
SurveyModel.prototype.validateQuestion = function (question) {
if (this.onValidateQuestion.isEmpty)
return null;
var options = {
name: question.name,
question: question,
value: question.value,
error: null
};
this.onValidateQuestion.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.error, this) : null;
};
SurveyModel.prototype.validatePanel = function (panel) {
if (this.onValidatePanel.isEmpty)
return null;
var options = {
name: panel.name,
panel: panel,
error: null
};
this.onValidatePanel.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.error, this) : null;
};
SurveyModel.prototype.processHtml = function (html) {
var options = { html: html };
this.onProcessHtml.fire(this, options);
return this.processText(options.html, true);
};
SurveyModel.prototype.processText = function (text, returnDisplayValue) {
return this.processTextEx(text, returnDisplayValue, false).text;
};
SurveyModel.prototype.processTextEx = function (text, returnDisplayValue, doEncoding) {
var res = {
text: this.processTextCore(text, returnDisplayValue, doEncoding),
hasAllValuesOnLastRun: true
};
res.hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
return res;
};
SurveyModel.prototype.processTextCore = function (text, returnDisplayValue, doEncoding) {
if (doEncoding === void 0) { doEncoding = false; }
if (this.isDesignMode)
return text;
return this.textPreProcessor.process(text, returnDisplayValue, doEncoding);
};
SurveyModel.prototype.getSurveyMarkdownHtml = function (element, text) {
var options = { element: element, text: text, html: null };
this.onTextMarkdown.fire(this, options);
return options.html;
};
/**
* Returns the number of corrected answers on quiz
*/
SurveyModel.prototype.getCorrectedAnswerCount = function () {
return this.getCorrectedAnswerCountCore(true);
};
/**
* Returns quiz question number. It may be different from getQuizQuestions.length because some widgets like matrix may have several questions. For example by number of rows
* @see getQuizQuestions
*/
SurveyModel.prototype.getQuizQuestionCount = function () {
var questions = this.getQuizQuestions();
var res = 0;
for (var i = 0; i < questions.length; i++) {
res += questions[i].quizQuestionCount;
}
return res;
};
/**
* Returns the number of incorrected answers on quiz
*/
SurveyModel.prototype.getInCorrectedAnswerCount = function () {
return this.getCorrectedAnswerCountCore(false);
};
SurveyModel.prototype.getCorrectedAnswerCountCore = function (isCorrect) {
var questions = this.getQuizQuestions();
var counter = 0;
var options = {
question: null,
result: false,
correctAnswers: 0,
incorrectAnswers: 0
};
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
var quizQuestionCount = q.quizQuestionCount;
options.question = q;
options.correctAnswers = q.correctAnswerCount;
options.incorrectAnswers = quizQuestionCount - options.correctAnswers;
options.result = options.question.isAnswerCorrect();
this.onIsAnswerCorrect.fire(this, options);
if (isCorrect) {
if (options.result || options.correctAnswers < quizQuestionCount) {
var addCount = options.correctAnswers;
if (addCount == 0 && options.result)
addCount = 1;
counter += addCount;
}
}
else {
if (!options.result || options.incorrectAnswers < quizQuestionCount) {
counter += options.incorrectAnswers;
}
}
}
return counter;
};
SurveyModel.prototype.getCorrectedAnswers = function () {
return this.getCorrectedAnswerCount();
};
SurveyModel.prototype.getInCorrectedAnswers = function () {
return this.getInCorrectedAnswerCount();
};
Object.defineProperty(SurveyModel.prototype, "showTimerPanel", {
/**
* Set it to 'top' or 'bottom' if you want to show the Panel with information about how much time the end-user spent of the survey/page.
* If the value doesn't equal 'none' then survey calls startTimer() method on survey rendering.
* @see showTimerPanelMode
* @see startTimer
* @see stopTimer
*/
get: function () {
return this.getPropertyValue("showTimerPanel", "none");
},
set: function (val) {
this.setPropertyValue("showTimerPanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnTop", {
get: function () {
return this.isTimerStarted && this.showTimerPanel == "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnBottom", {
get: function () {
return this.isTimerStarted && this.showTimerPanel == "bottom";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showTimerPanelMode", {
/**
* Set this property to 'page' or 'survey' to show the timer information for page or survey only.
* Use onTimerPanelInfoText event to change the default text.
* @see showTimerPanel
* @see onTimerPanelInfoText
*/
get: function () {
return this.getPropertyValue("showTimerPanelMode", "all");
},
set: function (val) {
this.setPropertyValue("showTimerPanelMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "timerInfoText", {
get: function () {
var options = { text: this.getTimerInfoText() };
this.onTimerPanelInfoText.fire(this, options);
var loc = new __WEBPACK_IMPORTED_MODULE_11__localizablestring__["a" /* LocalizableString */](this, true);
loc.text = options.text;
return loc.textOrHtml;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getTimerInfoText = function () {
var page = this.currentPage;
if (!page)
return "";
var pageSpent = this.getDisplayTime(page.timeSpent);
var surveySpent = this.getDisplayTime(this.timeSpent);
var pageLimitSec = this.getPageMaxTimeToFinish(page);
var pageLimit = this.getDisplayTime(pageLimitSec);
var surveyLimit = this.getDisplayTime(this.maxTimeToFinish);
if (this.showTimerPanelMode == "page")
return this.getTimerInfoPageText(page, pageSpent, pageLimit);
if (this.showTimerPanelMode == "survey")
return this.getTimerInfoSurveyText(surveySpent, surveyLimit);
if (this.showTimerPanelMode == "all") {
if (pageLimitSec <= 0 && this.maxTimeToFinish <= 0) {
return this.getLocString("timerSpentAll")["format"](pageSpent, surveySpent);
}
if (pageLimitSec > 0 && this.maxTimeToFinish > 0) {
return this.getLocString("timerLimitAll")["format"](pageSpent, pageLimit, surveySpent, surveyLimit);
}
var pageText = this.getTimerInfoPageText(page, pageSpent, pageLimit);
var surveyText = this.getTimerInfoSurveyText(surveySpent, surveyLimit);
return pageText + " " + surveyText;
}
return "";
};
SurveyModel.prototype.getTimerInfoPageText = function (page, pageSpent, pageLimit) {
return this.getPageMaxTimeToFinish(page) > 0
? this.getLocString("timerLimitPage")["format"](pageSpent, pageLimit)
: this.getLocString("timerSpentPage")["format"](pageSpent, pageLimit);
};
SurveyModel.prototype.getTimerInfoSurveyText = function (surveySpent, surveyLimit) {
return this.maxTimeToFinish > 0
? this.getLocString("timerLimitSurvey")["format"](surveySpent, surveyLimit)
: this.getLocString("timerSpentSurvey")["format"](surveySpent, surveyLimit);
};
SurveyModel.prototype.getDisplayTime = function (val) {
var min = Math.floor(val / 60);
var sec = val % 60;
var res = "";
if (min > 0) {
res += min + " " + this.getLocString("timerMin");
}
if (res && sec == 0)
return res;
if (res)
res += " ";
return res + sec + " " + this.getLocString("timerSec");
};
/**
* Call this method to start timer that will calculate how much time end-user spends on the survey or on pages
* @see stopTimer
* @see timeSpent
*/
SurveyModel.prototype.startTimer = function () {
if (this.isTimerStarted || this.isDesignMode)
return;
var self = this;
this.timerFunc = function () {
self.doTimer();
};
this.isTimerStarted = true;
__WEBPACK_IMPORTED_MODULE_13__surveytimer__["a" /* SurveyTimer */].instance.start(this.timerFunc);
};
SurveyModel.prototype.startTimerFromUI = function () {
if (this.showTimerPanel != "none" && this.state === "running") {
this.startTimer();
}
};
/**
* Stop the timer.
* @see startTimer
* @see timeSpent
*/
SurveyModel.prototype.stopTimer = function () {
if (!this.isTimerStarted)
return;
this.isTimerStarted = false;
__WEBPACK_IMPORTED_MODULE_13__surveytimer__["a" /* SurveyTimer */].instance.stop(this.timerFunc);
};
Object.defineProperty(SurveyModel.prototype, "maxTimeToFinish", {
/**
* The maximum time in seconds that end-user has to complete the survey. If the value is 0 or less, the end-user has unlimited number of time to finish the survey.
* @see startTimer
* @see maxTimeToFinishPage
*/
get: function () {
return this.getPropertyValue("maxTimeToFinish", 0);
},
set: function (val) {
this.setPropertyValue("maxTimeToFinish", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxTimeToFinishPage", {
/**
* The maximum time in seconds that end-user has to complete a page in the survey. If the value is 0 or less, the end-user has unlimited time. You may override this value for every page.
* @see startTimer
* @see maxTimeToFinish
* @see PageModel.maxTimeToFinish
*/
get: function () {
return this.getPropertyValue("maxTimeToFinishPage", 0);
},
set: function (val) {
this.setPropertyValue("maxTimeToFinishPage", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getPageMaxTimeToFinish = function (page) {
if (!page || page.maxTimeToFinish < 0)
return 0;
return page.maxTimeToFinish > 0
? page.maxTimeToFinish
: this.maxTimeToFinishPage;
};
SurveyModel.prototype.doTimer = function () {
var page = this.currentPage;
if (page) {
page.timeSpent = page.timeSpent + 1;
}
this.timeSpent = this.timeSpent + 1;
this.onTimer.fire(this, {});
if (this.maxTimeToFinish > 0 && this.maxTimeToFinish == this.timeSpent) {
this.completeLastPage();
}
if (page) {
var pageLimit = this.getPageMaxTimeToFinish(page);
if (pageLimit > 0 && pageLimit == page.timeSpent) {
if (this.isLastPage) {
this.completeLastPage();
}
else {
this.nextPage();
}
}
}
};
//ISurveyImplementor
SurveyModel.prototype.geSurveyData = function () {
return this;
};
SurveyModel.prototype.getSurvey = function () {
return this;
};
SurveyModel.prototype.getTextProcessor = function () {
return this;
};
//ISurveyTriggerOwner
SurveyModel.prototype.getObjects = function (pages, questions) {
var result = [];
Array.prototype.push.apply(result, this.getPagesByNames(pages));
Array.prototype.push.apply(result, this.getQuestionsByNames(questions));
return result;
};
SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) {
if (!name)
return;
if (isVariable) {
this.setVariable(name, value);
}
else {
var processor = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]();
var firstName = processor.getFirstName(name);
if (firstName == name) {
this.setValue(name, value);
}
else {
if (!this.getValue(firstName))
return;
var data = this.getUnbindValue(this.getFilteredValues());
processor.setValue(data, name, value);
this.setValue(firstName, data[firstName]);
}
}
};
SurveyModel.prototype.copyTriggerValue = function (name, fromName) {
if (!name || !fromName)
return;
var processor = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]();
var value = processor.getValue(fromName, this.getFilteredValues());
this.setTriggerValue(name, value, false);
};
SurveyModel.prototype.focusQuestion = function (name) {
var question = this.getQuestionByName(name, true);
if (!question || !question.isVisible || !question.page)
return false;
this.currentPage = question.page;
question.focus();
return true;
};
SurveyModel.stylesManager = null;
SurveyModel.platform = "unknown";
return SurveyModel;
}(__WEBPACK_IMPORTED_MODULE_3__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("survey", [
{
name: "locale",
choices: function () {
return __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].getLocales();
},
onGetValue: function (obj) {
return obj.locale == __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].defaultLocale ? null : obj.locale;
}
},
{ name: "title", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" },
{ name: "focusFirstQuestionAutomatic:boolean", default: true },
{ name: "focusOnFirstError:boolean", default: true },
{ name: "completedHtml:html", serializationProperty: "locCompletedHtml" },
{
name: "completedBeforeHtml:html",
serializationProperty: "locCompletedBeforeHtml"
},
{
name: "completedHtmlOnCondition:htmlconditions",
className: "htmlconditionitem"
},
{ name: "loadingHtml:html", serializationProperty: "locLoadingHtml" },
{ name: "pages", className: "page", visible: false },
{
name: "questions",
alternativeName: "elements",
baseClassName: "question",
visible: false,
isLightSerializable: false,
onGetValue: function (obj) {
return null;
},
onSetValue: function (obj, value, jsonConverter) {
var page = obj.addNewPage("");
jsonConverter.toObject({ questions: value }, page);
}
},
{
name: "triggers:triggers",
baseClassName: "surveytrigger",
classNamePart: "trigger"
},
{
name: "calculatedValues:calculatedvalues",
className: "calculatedvalue"
},
{ name: "surveyId", visible: false },
{ name: "surveyPostId", visible: false },
{ name: "surveyShowDataSaving:boolean", visible: false },
"cookieName",
"sendResultOnPageNext:boolean",
{
name: "showNavigationButtons",
default: "bottom",
choices: ["none", "top", "bottom", "both"]
},
{ name: "showPrevButton:boolean", default: true },
{ name: "showTitle:boolean", default: true },
{ name: "showPageTitles:boolean", default: true },
{ name: "showCompletedPage:boolean", default: true },
"navigateToUrl",
{
name: "navigateToUrlOnCondition:urlconditions",
className: "urlconditionitem",
visible: false
},
{
name: "questionsOrder",
default: "initial",
choices: ["initial", "random"]
},
"showPageNumbers:boolean",
{
name: "showQuestionNumbers",
default: "on",
choices: ["on", "onPage", "off"]
},
{
name: "questionTitleLocation",
default: "top",
choices: ["top", "bottom", "left"]
},
{
name: "questionDescriptionLocation",
default: "underTitle",
choices: ["underInput", "underTitle"]
},
{ name: "questionErrorLocation", default: "top", choices: ["top", "bottom"] },
{
name: "showProgressBar",
default: "off",
choices: ["off", "top", "bottom", "both"]
},
{
name: "progressBarType",
default: "pages",
choices: ["pages", "questions", "correctQuestions"]
},
{ name: "mode", default: "edit", choices: ["edit", "display"] },
{ name: "storeOthersAsComment:boolean", default: true },
{ name: "maxTextLength:number", default: 0, minValue: 0 },
{ name: "maxOthersLength:number", default: 0, minValue: 0 },
"goNextPageAutomatic:boolean",
{
name: "clearInvisibleValues",
default: "onComplete",
choices: ["none", "onComplete", "onHidden"]
},
{
name: "checkErrorsMode",
default: "onNextPage",
choices: ["onNextPage", "onValueChanged", "onComplete"]
},
{
name: "textUpdateMode",
default: "onBlur",
choices: ["onBlur", "onTyping"]
},
{ name: "startSurveyText", serializationProperty: "locStartSurveyText" },
{ name: "pagePrevText", serializationProperty: "locPagePrevText" },
{ name: "pageNextText", serializationProperty: "locPageNextText" },
{ name: "completeText", serializationProperty: "locCompleteText" },
{ name: "requiredText", default: "*" },
"questionStartIndex",
{
name: "questionTitleTemplate",
serializationProperty: "locQuestionTitleTemplate"
},
{ name: "firstPageIsStarted:boolean", default: false },
{
name: "isSinglePage:boolean",
default: false,
visible: false,
isSerializable: false
},
{
name: "questionsOnPageMode",
default: "standard",
choices: ["singlePage", "standard", "questionPerPage"]
},
{ name: "maxTimeToFinish:number", default: 0, minValue: 0 },
{ name: "maxTimeToFinishPage:number", default: 0, minValue: 0 },
{
name: "showTimerPanel",
default: "none",
choices: ["none", "top", "bottom"]
},
{
name: "showTimerPanelMode",
default: "all",
choices: ["all", "page", "survey"]
}
]);
/***/ }),
/* 32 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return ValidatorResult; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return SurveyValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return ValidatorRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return NumericValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return TextValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return AnswerCountValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return RegexValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return EmailValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return ExpressionValidator; });
var ValidatorResult = /** @class */ (function () {
function ValidatorResult(value, error) {
if (error === void 0) { error = null; }
this.value = value;
this.error = error;
}
return ValidatorResult;
}());
/**
* Base SurveyJS validator class.
*/
var SurveyValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyValidator, _super);
function SurveyValidator() {
var _this = _super.call(this) || this;
_this.createLocalizableString("text", _this, true);
return _this;
}
Object.defineProperty(SurveyValidator.prototype, "text", {
get: function () {
return this.getLocalizableStringText("text");
},
set: function (value) {
this.setLocalizableStringText("text", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyValidator.prototype, "isValidateAllValues", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyValidator.prototype, "locText", {
get: function () {
return this.getLocalizableString("text");
},
enumerable: true,
configurable: true
});
SurveyValidator.prototype.getErrorText = function (name) {
if (this.text)
return this.text;
return this.getDefaultErrorText(name);
};
SurveyValidator.prototype.getDefaultErrorText = function (name) {
return "";
};
SurveyValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
return null;
};
Object.defineProperty(SurveyValidator.prototype, "isRunning", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyValidator.prototype, "isAsync", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
SurveyValidator.prototype.getLocale = function () {
return !!this.errorOwner ? this.errorOwner.getLocale() : "";
};
SurveyValidator.prototype.getMarkdownHtml = function (text) {
return !!this.errorOwner ? this.errorOwner.getMarkdownHtml(text) : null;
};
SurveyValidator.prototype.getProcessedText = function (text) {
return !!this.errorOwner ? this.errorOwner.getProcessedText(text) : text;
};
SurveyValidator.prototype.createCustomError = function (name) {
return new __WEBPACK_IMPORTED_MODULE_2__error__["a" /* CustomError */](this.getErrorText(name), this.errorOwner);
};
SurveyValidator.prototype.toString = function () {
var res = this.getType().replace("validator", "");
if (!!this.text) {
res += ", " + this.text;
}
return res;
};
return SurveyValidator;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
var ValidatorRunner = /** @class */ (function () {
function ValidatorRunner() {
}
ValidatorRunner.prototype.run = function (owner) {
var _this = this;
var res = [];
var values = null;
var properties = null;
this.prepareAsyncValidators();
var asyncResults = [];
var validators = owner.getValidators();
for (var i = 0; i < validators.length; i++) {
var validator = validators[i];
if (!values && validator.isValidateAllValues) {
values = owner.getDataFilteredValues();
properties = owner.getDataFilteredProperties();
}
if (validator.isAsync) {
this.asyncValidators.push(validator);
validator.onAsyncCompleted = function (result) {
if (!!result && !!result.error)
asyncResults.push(result.error);
if (!_this.onAsyncCompleted)
return;
for (var i = 0; i < _this.asyncValidators.length; i++) {
if (_this.asyncValidators[i].isRunning)
return;
}
_this.onAsyncCompleted(asyncResults);
};
}
}
validators = owner.getValidators();
for (var i = 0; i < validators.length; i++) {
var validator = validators[i];
var validatorResult = validator.validate(owner.validatedValue, owner.getValidatorTitle(), values, properties);
if (!!validatorResult && !!validatorResult.error) {
res.push(validatorResult.error);
}
}
if (this.asyncValidators.length == 0 && !!this.onAsyncCompleted)
this.onAsyncCompleted([]);
return res;
};
ValidatorRunner.prototype.prepareAsyncValidators = function () {
if (!!this.asyncValidators) {
for (var i = 0; i < this.asyncValidators.length; i++) {
this.asyncValidators[i].onAsyncCompleted = null;
}
}
this.asyncValidators = [];
};
return ValidatorRunner;
}());
/**
* Validate numeric values.
*/
var NumericValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(NumericValidator, _super);
function NumericValidator(minValue, maxValue) {
if (minValue === void 0) { minValue = null; }
if (maxValue === void 0) { maxValue = null; }
var _this = _super.call(this) || this;
_this.minValue = minValue;
_this.maxValue = maxValue;
return _this;
}
NumericValidator.prototype.getType = function () {
return "numericvalidator";
};
NumericValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isNumber(value)) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["d" /* RequreNumericError */](null, this.errorOwner));
}
var result = new ValidatorResult(parseFloat(value));
if (this.minValue !== null && this.minValue > result.value) {
result.error = this.createCustomError(name);
return result;
}
if (this.maxValue !== null && this.maxValue < result.value) {
result.error = this.createCustomError(name);
return result;
}
return typeof value === "number" ? null : result;
};
NumericValidator.prototype.getDefaultErrorText = function (name) {
var vName = name ? name : __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("value");
if (this.minValue !== null && this.maxValue !== null) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("numericMinMax")["format"](vName, this.minValue, this.maxValue);
}
else {
if (this.minValue !== null) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("numericMin")["format"](vName, this.minValue);
}
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("numericMax")["format"](vName, this.maxValue);
}
};
return NumericValidator;
}(SurveyValidator));
/**
* Validate text values.
*/
var TextValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(TextValidator, _super);
function TextValidator(minLength, maxLength, allowDigits) {
if (minLength === void 0) { minLength = 0; }
if (maxLength === void 0) { maxLength = 0; }
if (allowDigits === void 0) { allowDigits = true; }
var _this = _super.call(this) || this;
_this.minLength = minLength;
_this.maxLength = maxLength;
_this.allowDigits = allowDigits;
return _this;
}
TextValidator.prototype.getType = function () {
return "textvalidator";
};
TextValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (value !== "" && __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
if (!this.allowDigits) {
var reg = /^[A-Za-z\s]*$/;
if (!reg.test(value)) {
return new ValidatorResult(null, this.createCustomError(name));
}
}
if (this.minLength > 0 && value.length < this.minLength) {
return new ValidatorResult(null, this.createCustomError(name));
}
if (this.maxLength > 0 && value.length > this.maxLength) {
return new ValidatorResult(null, this.createCustomError(name));
}
return null;
};
TextValidator.prototype.getDefaultErrorText = function (name) {
if (this.minLength > 0 && this.maxLength > 0)
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("textMinMaxLength")["format"](this.minLength, this.maxLength);
if (this.minLength > 0)
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("textMinLength")["format"](this.minLength);
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("textMaxLength")["format"](this.maxLength);
};
return TextValidator;
}(SurveyValidator));
var AnswerCountValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(AnswerCountValidator, _super);
function AnswerCountValidator(minCount, maxCount) {
if (minCount === void 0) { minCount = null; }
if (maxCount === void 0) { maxCount = null; }
var _this = _super.call(this) || this;
_this.minCount = minCount;
_this.maxCount = maxCount;
return _this;
}
AnswerCountValidator.prototype.getType = function () {
return "answercountvalidator";
};
AnswerCountValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (value == null || value.constructor != Array)
return null;
var count = value.length;
if (this.minCount && count < this.minCount) {
return new ValidatorResult(null, this.createCustomError(__WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("minSelectError")["format"](this.minCount)));
}
if (this.maxCount && count > this.maxCount) {
return new ValidatorResult(null, this.createCustomError(__WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("maxSelectError")["format"](this.maxCount)));
}
return null;
};
AnswerCountValidator.prototype.getDefaultErrorText = function (name) {
return name;
};
return AnswerCountValidator;
}(SurveyValidator));
/**
* Use it to validate the text by regular expressions.
*/
var RegexValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(RegexValidator, _super);
function RegexValidator(regex) {
if (regex === void 0) { regex = null; }
var _this = _super.call(this) || this;
_this.regex = regex;
return _this;
}
RegexValidator.prototype.getType = function () {
return "regexvalidator";
};
RegexValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (!this.regex || __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
var re = new RegExp(this.regex);
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
var res = this.hasError(re, value[i], name);
if (res)
return res;
}
}
return this.hasError(re, value, name);
};
RegexValidator.prototype.hasError = function (re, value, name) {
if (re.test(value))
return null;
return new ValidatorResult(value, this.createCustomError(name));
};
return RegexValidator;
}(SurveyValidator));
/**
* Validate e-mail address in the text input
*/
var EmailValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(EmailValidator, _super);
function EmailValidator() {
var _this = _super.call(this) || this;
_this.re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()=[\]\.,;:\s@\"]+\.)+[^<>()=[\]\.,;:\s@\"]{2,})$/i;
return _this;
}
EmailValidator.prototype.getType = function () {
return "emailvalidator";
};
EmailValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (!value)
return null;
if (this.re.test(value))
return null;
return new ValidatorResult(value, this.createCustomError(name));
};
EmailValidator.prototype.getDefaultErrorText = function (name) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("invalidEmail");
};
return EmailValidator;
}(SurveyValidator));
/**
* Show error if expression returns false
*/
var ExpressionValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExpressionValidator, _super);
function ExpressionValidator(expression) {
if (expression === void 0) { expression = null; }
var _this = _super.call(this) || this;
_this.expression = expression;
_this.conditionRunner = null;
_this.isRunningValue = false;
return _this;
}
ExpressionValidator.prototype.getType = function () {
return "expressionvalidator";
};
Object.defineProperty(ExpressionValidator.prototype, "isValidateAllValues", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ExpressionValidator.prototype, "isAsync", {
get: function () {
if (!this.ensureConditionRunner())
return false;
return this.conditionRunner.isAsync;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ExpressionValidator.prototype, "isRunning", {
get: function () {
return this.isRunningValue;
},
enumerable: true,
configurable: true
});
ExpressionValidator.prototype.validate = function (value, name, values, properties) {
var _this = this;
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (!this.ensureConditionRunner())
return null;
this.conditionRunner.onRunComplete = function (res) {
_this.isRunningValue = false;
if (!!_this.onAsyncCompleted) {
_this.onAsyncCompleted(_this.generateError(res, value));
}
};
this.isRunningValue = true;
var res = this.conditionRunner.run(values, properties);
if (this.conditionRunner.isAsync)
return null;
this.isRunningValue = false;
return this.generateError(res, value);
};
ExpressionValidator.prototype.generateError = function (res, value) {
if (!res) {
return new ValidatorResult(value, this.createCustomError(name));
}
return null;
};
ExpressionValidator.prototype.getDefaultErrorText = function (name) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("invalidExpression")["format"](this.expression);
};
ExpressionValidator.prototype.ensureConditionRunner = function () {
if (!!this.conditionRunner) {
this.conditionRunner.expression = this.expression;
return true;
}
if (!this.expression)
return false;
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["b" /* ConditionRunner */](this.expression);
return true;
};
return ExpressionValidator;
}(SurveyValidator));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("surveyvalidator", [
{ name: "text", serializationProperty: "locText" }
]);
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () {
return new NumericValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("textvalidator", ["minLength:number", "maxLength:number", "allowDigits:boolean"], function () {
return new TextValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () {
return new AnswerCountValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("regexvalidator", ["regex"], function () {
return new RegexValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("emailvalidator", [], function () {
return new EmailValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("expressionvalidator", ["expression:condition"], function () {
return new ExpressionValidator();
}, "surveyvalidator");
/***/ }),
/* 33 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel_base__ = __webpack_require__(50);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPage; });
var SurveyPage = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyPage, _super);
function SurveyPage(props) {
return _super.call(this, props) || this;
}
SurveyPage.prototype.getPanelBase = function () {
return this.props.page;
};
Object.defineProperty(SurveyPage.prototype, "page", {
get: function () {
return this.panelBase;
},
enumerable: true,
configurable: true
});
SurveyPage.prototype.render = function () {
if (this.page == null || this.survey == null || this.creator == null)
return null;
var title = this.renderTitle();
var description = this.renderDescription();
var rows = this.renderRows(this.panelBase.cssClasses);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", className: this.panelBase.cssClasses.page.root },
title,
description,
rows));
};
SurveyPage.prototype.renderTitle = function () {
if (!this.survey.showPageTitles)
return null;
var text = __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.page.locTitle);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h4", { className: this.panelBase.cssClasses.pageTitle }, text);
};
SurveyPage.prototype.renderDescription = function () {
if (!this.survey.showPageTitles)
return null;
var text = __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.page.locDescription);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.panelBase.cssClasses.pageDescription }, text);
};
return SurveyPage;
}(__WEBPACK_IMPORTED_MODULE_3__panel_base__["a" /* SurveyPanelBase */]));
/***/ }),
/* 34 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__page__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactSurveyNavigation__ = __webpack_require__(35);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__reactSurveyProgress__ = __webpack_require__(36);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__reacttimerpanel__ = __webpack_require__(37);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__stylesmanager__ = __webpack_require__(30);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Survey; });
var Survey = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Survey, _super);
function Survey(props) {
var _this = _super.call(this, props) || this;
_this.isCurrentPageChanged = false;
_this.onCurrentPageChangedHandler = function (sender, options) {
_this.isCurrentPageChanged = true;
};
_this.handleTryAgainClick = _this.handleTryAgainClick.bind(_this);
_this.createSurvey(props);
_this.updateSurvey(props, {});
//set the first page
var dummy = _this.survey.currentPage;
return _this;
}
Object.defineProperty(Survey, "cssType", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__["b" /* surveyCss */].currentType;
},
set: function (value) {
__WEBPACK_IMPORTED_MODULE_10__stylesmanager__["a" /* StylesManager */].applyTheme(value);
},
enumerable: true,
configurable: true
});
Survey.prototype.getStateElement = function () {
return this.survey;
};
Survey.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
if (this.isCurrentPageChanged) {
this.isCurrentPageChanged = false;
this.survey.scrollToTopOnPageChange();
}
this.updateSurvey(this.props, prevProps);
};
Survey.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
var el = this.refs["root"];
if (el && this.survey)
this.survey.doAfterRenderSurvey(el);
if (this.survey) {
this.survey.startTimerFromUI();
}
};
Survey.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.survey) {
this.survey.stopTimer();
this.survey.onCurrentPageChanged.remove(this.onCurrentPageChangedHandler);
}
};
Survey.prototype.doRender = function () {
var renderResult;
if (this.survey.state == "completed") {
renderResult = this.renderCompleted();
}
else if (this.survey.state == "completedbefore") {
renderResult = this.renderCompletedBefore();
}
else if (this.survey.state == "loading") {
renderResult = this.renderLoading();
}
else if (this.survey.state == "starting") {
renderResult = this.renderStartPage();
}
else {
renderResult = this.renderSurvey();
}
var title = this.renderTitle();
var onSubmit = function (event) {
event.preventDefault();
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "root", className: this.css.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("form", { onSubmit: onSubmit },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "sv_custom_header" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.container },
title,
renderResult))));
};
Survey.prototype.render = function () {
return this.doRender();
};
Object.defineProperty(Survey.prototype, "css", {
get: function () {
return this.survey.css;
},
set: function (value) {
this.survey.css = value;
},
enumerable: true,
configurable: true
});
Survey.prototype.handleTryAgainClick = function (event) {
this.survey.doComplete();
};
Survey.prototype.renderCompleted = function () {
if (!this.survey.showCompletedPage)
return null;
var completedState = null;
if (this.survey.completedState) {
var tryAgainButton = null;
if (this.survey.completedState == "error") {
var btnText = this.survey.getLocString("saveAgainButton");
tryAgainButton = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "button", value: btnText, className: this.css.saveData.saveAgainButton, onClick: this.handleTryAgainClick }));
}
var css = this.css.saveData[this.survey.completedState];
completedState = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.saveData.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: css },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.survey.completedStateText),
tryAgainButton)));
}
var htmlValue = { __html: this.survey.processedCompletedHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue, className: [this.css.body, this.css.completedPage].join(" ") }),
completedState));
};
Survey.prototype.renderCompletedBefore = function () {
var htmlValue = { __html: this.survey.processedCompletedBeforeHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue, className: this.css.body }));
};
Survey.prototype.renderLoading = function () {
var htmlValue = { __html: this.survey.processedLoadingHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue, className: this.css.body }));
};
Survey.prototype.renderStartPage = function () {
var startedPage = this.survey.startedPage
? this.renderPage(this.survey.startedPage)
: null;
var pageId = this.survey.startedPage ? this.survey.startedPage.id : "";
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: pageId, className: this.css.body },
this.renderNavigation("top"),
startedPage,
this.renderNavigation("bottom"))));
};
Survey.prototype.renderSurvey = function () {
var currentPage = this.survey.currentPage
? this.renderPage(this.survey.currentPage)
: null;
var pageId = this.survey.currentPage ? this.survey.currentPage.id : "";
var topProgress = this.survey.isShowProgressBarOnTop
? this.renderProgress(true)
: null;
var bottomProgress = this.survey.isShowProgressBarOnBottom
? this.renderProgress(false)
: null;
if (!currentPage) {
currentPage = this.renderEmptySurvey();
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: pageId, className: !currentPage ? this.css.bodyEmpty : this.css.body },
topProgress,
this.renderTimerPanel("top"),
this.renderNavigation("top"),
currentPage,
this.renderTimerPanel("bottom"),
bottomProgress,
this.renderNavigation("bottom")));
};
Survey.prototype.renderTitle = function () {
var title = null;
var description = null;
if (this.survey.title && this.survey.showTitle) {
title = __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locTitle);
description = __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locDescription);
}
return title ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.header },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h3", { className: this.css.title }, title),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h5", { className: this.css.description }, description))) : null;
};
Survey.prototype.renderTimerPanel = function (location) {
if (this.survey.showTimerPanel != location)
return null;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_8__reacttimerpanel__["a" /* SurveyTimerPanel */], { survey: this.survey });
};
Survey.prototype.renderPage = function (page) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__page__["a" /* SurveyPage */], { survey: this.survey, page: page, css: this.css, creator: this }));
};
Survey.prototype.renderProgress = function (isTop) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_7__reactSurveyProgress__["a" /* SurveyProgress */], { survey: this.survey, css: this.css, isTop: isTop });
};
Survey.prototype.renderNavigation = function (navPosition) {
if (this.survey.isNavigationButtonsShowing !== "both" &&
(this.survey.isNavigationButtonsShowing === "none" ||
this.survey.isNavigationButtonsShowing !== navPosition)) {
return null;
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_4__reactSurveyNavigation__["a" /* SurveyNavigation */], { survey: this.survey, css: this.css });
};
Survey.prototype.renderEmptySurvey = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.survey.emptySurveyText);
};
Survey.prototype.createSurvey = function (newProps) {
if (!newProps)
newProps = {};
if (newProps) {
if (newProps.model) {
this.survey = newProps.model;
}
else {
if (newProps.json) {
this.survey = new __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__["a" /* ReactSurveyModel */](newProps.json);
}
}
}
else {
this.survey = new __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__["a" /* ReactSurveyModel */]();
}
if (!!newProps.css) {
this.survey.mergeCss(newProps.css, this.css);
}
this.setSurveyEvents();
};
Survey.prototype.updateSurvey = function (newProps, oldProps) {
if (!newProps)
return;
oldProps = oldProps || {};
for (var key in newProps) {
if (key == "model" || key == "children" || key == "css" || key == "json")
continue;
if (newProps[key] === oldProps[key])
continue;
if (key.indexOf("on") == 0 && this.survey[key] && this.survey[key].add) {
if (!!oldProps[key]) {
this.survey[key].remove(oldProps[key]);
}
this.survey[key].add(newProps[key]);
}
else {
this.survey[key] = newProps[key];
}
}
};
Survey.prototype.setSurveyEvents = function () {
var self = this;
this.survey.renderCallback = function () {
var counter = !!self.state && !!self.state.modelChanged ? self.state.modelChanged : 0;
self.setState({ modelChanged: counter + 1 });
};
this.survey.onPartialSend.add(function (sender) {
self.setState(self.state);
});
this.survey.onCurrentPageChanged.add(this.onCurrentPageChangedHandler);
};
//ISurveyCreator
Survey.prototype.createQuestionElement = function (question) {
return __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.createQuestion(question.getTemplate(), {
question: question,
isDisplayMode: question.isReadOnly,
creator: this
});
};
Survey.prototype.renderError = function (key, error, cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: key },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.error.icon, "aria-hidden": "true" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.error.item },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["e" /* SurveyLocString */], { locStr: error.locText }))));
};
Survey.prototype.questionTitleLocation = function () {
return this.survey.questionTitleLocation;
};
Survey.prototype.questionErrorLocation = function () {
return this.survey.questionErrorLocation;
};
return Survey;
}(__WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */]));
/***/ }),
/* 35 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__ = __webpack_require__(25);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyNavigation; });
var SurveyNavigation = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyNavigation, _super);
function SurveyNavigation(props) {
var _this = _super.call(this, props) || this;
_this.mouseDownPage = null;
_this.handlePrevClick = _this.handlePrevClick.bind(_this);
_this.handleNextClick = _this.handleNextClick.bind(_this);
_this.handleNextMouseDown = _this.handleNextMouseDown.bind(_this);
_this.handleCompleteClick = _this.handleCompleteClick.bind(_this);
_this.handleStartClick = _this.handleStartClick.bind(_this);
return _this;
}
SurveyNavigation.prototype.handlePrevClick = function (event) {
this.survey.prevPage();
};
SurveyNavigation.prototype.handleNextClick = function (event) {
if (!!this.mouseDownPage && this.mouseDownPage !== this.survey.currentPage)
return;
this.mouseDownPage = null;
this.survey.nextPage();
};
SurveyNavigation.prototype.handleNextMouseDown = function (event) {
this.mouseDownPage = this.survey.currentPage;
var el = document.activeElement;
if (!!el && !!el["blur"])
el["blur"]();
};
SurveyNavigation.prototype.handleCompleteClick = function (event) {
this.survey.completeLastPage();
};
SurveyNavigation.prototype.handleStartClick = function (event) {
this.survey.start();
};
SurveyNavigation.prototype.render = function () {
if (!this.survey || this.survey.isNavigationButtonsShowing === "none")
return null;
var isStartedPage = this.survey.state === "starting";
var prevButton = !isStartedPage && !this.survey.isFirstPage && this.survey.isShowPrevButton
? this.renderButton(this.handlePrevClick, null, this.survey.pagePrevText, this.css.navigation.prev)
: null;
var nextButton = !isStartedPage && !this.survey.isLastPage
? this.renderButton(this.handleNextClick, this.handleNextMouseDown, this.survey.pageNextText, this.css.navigation.next)
: null;
var completeButton = !isStartedPage && this.survey.isLastPage && this.survey.isEditMode
? this.renderButton(this.handleCompleteClick, null, this.survey.completeText, this.css.navigation.complete)
: null;
var startButton = isStartedPage
? this.renderButton(this.handleStartClick, null, this.survey.startSurveyText, this.css.navigation.start)
: null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.footer },
startButton,
prevButton,
nextButton,
completeButton));
};
SurveyNavigation.prototype.renderButton = function (click, mouseDown, text, btnClassName) {
var style = { marginRight: "5px" };
var className = this.css.navigationButton + (btnClassName ? " " + btnClassName : "");
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: className, style: style, type: "button", onMouseDown: mouseDown, onClick: click, value: text }));
};
return SurveyNavigation;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__["a" /* SurveyNavigationBase */]));
/***/ }),
/* 36 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__ = __webpack_require__(25);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyProgress; });
var SurveyProgress = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyProgress, _super);
function SurveyProgress(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyProgress.prototype, "isTop", {
get: function () {
return this.props.isTop;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyProgress.prototype, "progress", {
get: function () {
return this.survey.getProgress();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyProgress.prototype, "progressText", {
get: function () {
return this.survey.progressText;
},
enumerable: true,
configurable: true
});
SurveyProgress.prototype.render = function () {
var style = this.isTop ? {} : { marginTop: "1em" };
var progressStyle = {
width: this.progress + "%"
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.progress, style: style },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: progressStyle, className: this.css.progressBar, role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100 },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.progressText + " " + this.css.progressTextInBar }, this.progressText)),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.progressText + " " + this.css.progressTextUnderBar }, this.progressText)));
};
return SurveyProgress;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__["a" /* SurveyNavigationBase */]));
/***/ }),
/* 37 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimerPanel; });
var SurveyTimerPanel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTimerPanel, _super);
function SurveyTimerPanel(props) {
var _this = _super.call(this, props) || this;
_this.update = function () {
_this.setState({ timeSpent: _this.survey.timeSpent });
};
return _this;
}
Object.defineProperty(SurveyTimerPanel.prototype, "survey", {
get: function () {
return this.props.survey;
},
enumerable: true,
configurable: true
});
SurveyTimerPanel.prototype.componentDidMount = function () {
this.survey.onTimer.add(this.update);
};
SurveyTimerPanel.prototype.componentWillUnmount = function () {
this.survey.onTimer.remove(this.update);
};
SurveyTimerPanel.prototype.render = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, this.survey.timerInfoText);
};
return SurveyTimerPanel;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 38 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__element_factory__ = __webpack_require__(18);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyRow; });
var SurveyRow = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyRow, _super);
function SurveyRow(props) {
return _super.call(this, props) || this;
}
SurveyRow.prototype.getStateElement = function () {
return this.row;
};
Object.defineProperty(SurveyRow.prototype, "row", {
get: function () {
return this.props.row;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyRow.prototype, "survey", {
get: function () {
return this.props.survey;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyRow.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyRow.prototype, "css", {
get: function () {
return this.props.css;
},
enumerable: true,
configurable: true
});
SurveyRow.prototype.render = function () {
var _this = this;
if (this.row == null || this.survey == null || this.creator == null)
return null;
if (this.row.visible) {
var elements = this.row.elements.map(function (element) {
return _this.createElement(element);
});
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.row }, elements);
}
return null;
};
SurveyRow.prototype.createElement = function (element) {
var elementType = element.getType();
if (!__WEBPACK_IMPORTED_MODULE_3__element_factory__["a" /* ReactElementFactory */].Instance.isElementRegisgered(elementType)) {
elementType = "question";
}
return __WEBPACK_IMPORTED_MODULE_3__element_factory__["a" /* ReactElementFactory */].Instance.createElement(elementType, {
key: element.name,
element: element,
creator: this.creator,
survey: this.survey,
css: this.css
});
};
return SurveyRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */]));
/***/ }),
/* 39 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ChoicesRestfull; });
var XmlParser = /** @class */ (function () {
function XmlParser() {
this.parser = new DOMParser();
}
XmlParser.prototype.assignValue = function (target, name, value) {
if (Array.isArray(target[name])) {
target[name].push(value);
}
else if (target[name] !== undefined) {
target[name] = [target[name]].concat(value);
}
else if (typeof value === "object" &&
Object.keys(value).length === 1 &&
Object.keys(value)[0] === name) {
target[name] = value[name];
}
else {
target[name] = value;
}
};
XmlParser.prototype.xml2Json = function (xmlNode, result) {
if (xmlNode.children && xmlNode.children.length > 0) {
for (var i = 0; i < xmlNode.children.length; i++) {
var childNode = xmlNode.children[i];
var childObject = {};
this.xml2Json(childNode, childObject);
this.assignValue(result, childNode.nodeName, childObject);
}
}
else {
this.assignValue(result, xmlNode.nodeName, xmlNode.textContent);
}
};
XmlParser.prototype.parseXmlString = function (xmlString) {
var xmlRoot = this.parser.parseFromString(xmlString, "text/xml");
var json = {};
this.xml2Json(xmlRoot, json);
return json;
};
return XmlParser;
}());
/**
* A definition for filling choices for checkbox, dropdown and radiogroup questions from resfull services.
* The run method call a restfull service and results can be get on getResultCallback.
*/
var ChoicesRestfull = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ChoicesRestfull, _super);
function ChoicesRestfull() {
var _this = _super.call(this) || this;
_this.lastObjHash = "";
_this.isRunningValue = false;
_this.processedUrl = "";
_this.processedPath = "";
_this.error = null;
return _this;
}
Object.defineProperty(ChoicesRestfull, "EncodeParameters", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters = val;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.clearCache = function () {
ChoicesRestfull.itemsResult = {};
};
ChoicesRestfull.addSameRequest = function (obj) {
var hash = obj.objHash;
var res = ChoicesRestfull.sendingSameRequests[hash];
if (!res) {
ChoicesRestfull.sendingSameRequests[obj.objHash] = [];
return false;
}
res.push(obj);
return true;
};
ChoicesRestfull.unregisterSameRequests = function (obj, items) {
var res = ChoicesRestfull.sendingSameRequests[obj.objHash];
delete ChoicesRestfull.sendingSameRequests[obj.objHash];
for (var i = 0; i < res.length; i++) {
if (!!res[i].getResultCallback) {
res[i].getResultCallback(items);
}
}
};
ChoicesRestfull.getCachedItemsResult = function (obj) {
var hash = obj.objHash;
var res = ChoicesRestfull.itemsResult[hash];
if (!res)
return false;
if (obj.getResultCallback) {
obj.getResultCallback(res);
}
return true;
};
ChoicesRestfull.prototype.run = function (textProcessor) {
if (textProcessor === void 0) { textProcessor = null; }
if (!this.url || !this.getResultCallback)
return;
this.processedText(textProcessor);
if (!this.processedUrl) {
this.doEmptyResultCallback({});
this.lastObjHash = this.objHash;
return;
}
if (this.lastObjHash === this.objHash)
return;
this.lastObjHash = this.objHash;
this.error = null;
if (this.useChangedItemsResults())
return;
if (ChoicesRestfull.addSameRequest(this))
return;
this.sendRequest();
};
Object.defineProperty(ChoicesRestfull.prototype, "isRunning", {
get: function () {
return this.isRunningValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "isWaitingForParameters", {
get: function () {
return this.url && !this.processedUrl;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.useChangedItemsResults = function () {
return ChoicesRestfull.getCachedItemsResult(this);
};
ChoicesRestfull.prototype.doEmptyResultCallback = function (serverResult) {
var items = [];
if (this.updateResultCallback) {
items = this.updateResultCallback(items, serverResult);
}
this.getResultCallback(items);
};
ChoicesRestfull.prototype.processedText = function (textProcessor) {
if (textProcessor) {
var pUrl = textProcessor.processTextEx(this.url, false, __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters);
var pPath = textProcessor.processTextEx(this.path, false, __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters);
if (!pUrl.hasAllValuesOnLastRun || !pPath.hasAllValuesOnLastRun) {
this.processedUrl = "";
this.processedPath = "";
}
else {
this.processedUrl = pUrl.text;
this.processedPath = pPath.text;
}
}
else {
this.processedUrl = this.url;
this.processedPath = this.path;
}
};
ChoicesRestfull.prototype.parseResponse = function (response) {
var parsedResponse;
if (!!response &&
typeof response.indexOf === "function" &&
response.indexOf("<") === 0) {
var parser = new XmlParser();
parsedResponse = parser.parseXmlString(response);
}
else {
try {
parsedResponse = JSON.parse(response);
}
catch (_a) {
parsedResponse = (response || "")
.split("\n")
.map(function (s) { return s.trim(" "); })
.filter(function (s) { return !!s; });
}
}
return parsedResponse;
};
ChoicesRestfull.prototype.sendRequest = function () {
this.isRunningValue = true;
var xhr = new XMLHttpRequest();
xhr.open("GET", this.processedUrl);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var self = this;
xhr.onload = function () {
self.isRunningValue = false;
if (xhr.status === 200) {
self.onLoad(self.parseResponse(xhr.response));
}
else {
self.onError(xhr.statusText, xhr.responseText);
}
};
var options = { request: xhr };
if (!!ChoicesRestfull.onBeforeSendRequest) {
ChoicesRestfull.onBeforeSendRequest(this, options);
}
this.beforeSendRequest();
options.request.send();
};
ChoicesRestfull.prototype.getType = function () {
return "choicesByUrl";
};
Object.defineProperty(ChoicesRestfull.prototype, "isEmpty", {
get: function () {
return !this.url && !this.path && !this.valueName && !this.titleName;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.getCustomPropertiesNames = function () {
var properties = this.getCustomProperties();
var res = new Array();
for (var i = 0; i < properties.length; i++) {
res.push(this.getCustomPropertyName(properties[i].name));
}
return res;
};
ChoicesRestfull.prototype.getCustomPropertyName = function (propertyName) {
return propertyName + "Name";
};
ChoicesRestfull.prototype.getCustomProperties = function () {
var properties = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].getProperties(this.itemValueType);
var res = [];
for (var i = 0; i < properties.length; i++) {
if (properties[i].name === "value" ||
properties[i].name === "text" ||
properties[i].name === "visibleIf" ||
properties[i].name === "enableIf")
continue;
res.push(properties[i]);
}
return res;
};
ChoicesRestfull.prototype.setData = function (json) {
this.clear();
if (json.url)
this.url = json.url;
if (json.path)
this.path = json.path;
if (json.valueName)
this.valueName = json.valueName;
if (json.titleName)
this.titleName = json.titleName;
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (json[properties[i]])
this[properties[i]] = json[properties[i]];
}
};
ChoicesRestfull.prototype.getData = function () {
if (this.isEmpty)
return null;
var res = {};
if (this.url)
res["url"] = this.url;
if (this.path)
res["path"] = this.path;
if (this.valueName)
res["valueName"] = this.valueName;
if (this.titleName)
res["titleName"] = this.titleName;
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (this[properties[i]])
res[properties[i]] = this[properties[i]];
}
return res;
};
Object.defineProperty(ChoicesRestfull.prototype, "url", {
get: function () {
return this.getPropertyValue("url", "");
},
set: function (val) {
this.setPropertyValue("url", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "path", {
get: function () {
return this.getPropertyValue("path", "");
},
set: function (val) {
this.setPropertyValue("path", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "valueName", {
get: function () {
return this.getPropertyValue("valueName", "");
},
set: function (val) {
this.setPropertyValue("valueName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "titleName", {
get: function () {
return this.getPropertyValue("titleName", "");
},
set: function (val) {
this.setPropertyValue("titleName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "allowEmptyResponse", {
get: function () {
return this.getPropertyValue("allowEmptyResponse", false);
},
set: function (val) {
this.setPropertyValue("allowEmptyResponse", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "itemValueType", {
get: function () {
if (!this.owner)
return "itemvalue";
var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].findProperty(this.owner.getType(), "choices");
if (!prop)
return "itemvalue";
if (prop.type == "itemvalue[]")
return "itemvalue";
return prop.type;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.clear = function () {
this.url = "";
this.path = "";
this.valueName = "";
this.titleName = "";
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (this[properties[i]])
this[properties[i]] = "";
}
};
ChoicesRestfull.prototype.beforeSendRequest = function () {
if (!!this.beforeSendRequestCallback) {
this.beforeSendRequestCallback();
}
};
ChoicesRestfull.prototype.onLoad = function (result) {
var items = [];
var updatedResult = this.getResultAfterPath(result);
if (updatedResult && updatedResult["length"]) {
for (var i = 0; i < updatedResult.length; i++) {
var itemValue = updatedResult[i];
if (!itemValue)
continue;
var value = !!this.getItemValueCallback
? this.getItemValueCallback(itemValue)
: this.getValue(itemValue);
var title = this.getTitle(itemValue);
var item = new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](value, title);
this.setCustomProperties(item, itemValue);
items.push(item);
}
}
else {
if (!this.allowEmptyResponse) {
this.error = new __WEBPACK_IMPORTED_MODULE_4__error__["k" /* WebRequestEmptyError */](null, this.owner);
}
}
if (this.updateResultCallback) {
items = this.updateResultCallback(items, result);
}
ChoicesRestfull.itemsResult[this.objHash] = items;
this.getResultCallback(items);
ChoicesRestfull.unregisterSameRequests(this, items);
};
ChoicesRestfull.prototype.setCustomProperties = function (item, itemValue) {
var properties = this.getCustomProperties();
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
var val = this.getValueCore(itemValue, this.getPropertyBinding(prop.name));
if (!this.isValueEmpty(val)) {
item[prop.name] = val;
}
}
};
ChoicesRestfull.prototype.getPropertyBinding = function (propertyName) {
if (this[this.getCustomPropertyName(propertyName)])
return this[this.getCustomPropertyName(propertyName)];
if (this[propertyName])
return this[propertyName];
return propertyName;
};
ChoicesRestfull.prototype.onError = function (status, response) {
this.error = new __WEBPACK_IMPORTED_MODULE_4__error__["l" /* WebRequestError */](status, response, this.owner);
this.doEmptyResultCallback(response);
ChoicesRestfull.unregisterSameRequests(this, []);
};
ChoicesRestfull.prototype.getResultAfterPath = function (result) {
if (!result)
return result;
if (!this.processedPath)
return result;
var pathes = this.getPathes();
for (var i = 0; i < pathes.length; i++) {
result = result[pathes[i]];
if (!result)
return null;
}
return result;
};
ChoicesRestfull.prototype.getPathes = function () {
var pathes = [];
if (this.processedPath.indexOf(";") > -1) {
pathes = this.path.split(";");
}
else {
pathes = this.processedPath.split(",");
}
if (pathes.length == 0)
pathes.push(this.processedPath);
return pathes;
};
ChoicesRestfull.prototype.getValue = function (item) {
if (!item)
return null;
if (this.valueName)
return this.getValueCore(item, this.valueName);
if (!(item instanceof Object))
return item;
var len = Object.keys(item).length;
if (len < 1)
return null;
return item[Object.keys(item)[0]];
};
ChoicesRestfull.prototype.getTitle = function (item) {
var title = this.titleName ? this.titleName : "title";
return this.getValueCore(item, title);
};
ChoicesRestfull.prototype.getValueCore = function (item, property) {
if (!item)
return null;
if (property.indexOf(".") < 0)
return item[property];
var properties = property.split(".");
for (var i = 0; i < properties.length; i++) {
item = item[properties[i]];
if (!item)
return null;
}
return item;
};
Object.defineProperty(ChoicesRestfull.prototype, "objHash", {
get: function () {
return (this.processedUrl +
";" +
this.processedPath +
";" +
this.valueName +
";" +
this.titleName);
},
enumerable: true,
configurable: true
});
ChoicesRestfull.itemsResult = {};
ChoicesRestfull.sendingSameRequests = {};
return ChoicesRestfull;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("choicesByUrl", [
"url",
"path",
"valueName",
"titleName",
{ name: "allowEmptyResponse:boolean", default: false }
], function () {
return new ChoicesRestfull();
});
/***/ }),
/* 40 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__ = __webpack_require__(80);
/* unused harmony export ConditionsParserError */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConditionsParser; });
var ConditionsParserError = /** @class */ (function () {
function ConditionsParserError(at, code) {
this.at = at;
this.code = code;
}
return ConditionsParserError;
}());
var ConditionsParser = /** @class */ (function () {
function ConditionsParser() {
}
ConditionsParser.prototype.patchExpression = function (text) {
return text
.replace(/=>/g, ">=")
.replace(/=/g, "!=")
.replace(/==/g, "= ")
.replace(/equals/g, "equal ")
.replace(/notequals/g, "notequal ");
};
ConditionsParser.prototype.createCondition = function (text) {
return this.parseExpression(text);
};
ConditionsParser.prototype.parseExpression = function (text) {
try {
var result = ConditionsParser.parserCache[text];
if (result === undefined) {
result = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__["a" /* parse */])(this.patchExpression(text));
if (!result.hasAsyncFunction()) {
ConditionsParser.parserCache[text] = result;
}
}
return result;
}
catch (e) {
if (e instanceof __WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__["b" /* SyntaxError */]) {
this.conditionError = new ConditionsParserError(e.location.start.offset, e.message);
}
}
};
Object.defineProperty(ConditionsParser.prototype, "error", {
get: function () {
return this.conditionError;
},
enumerable: true,
configurable: true
});
ConditionsParser.parserCache = {};
return ConditionsParser;
}());
/***/ }),
/* 41 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return dxSurveyService; });
/**
* The class contains methods to work with www.dxsurvey.com service.
*/
var dxSurveyService = /** @class */ (function () {
function dxSurveyService() {
}
Object.defineProperty(dxSurveyService, "serviceUrl", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].surveyServiceUrl;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].surveyServiceUrl = val;
},
enumerable: true,
configurable: true
});
dxSurveyService.prototype.loadSurvey = function (surveyId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open("GET", dxSurveyService.serviceUrl + "/getSurvey?surveyId=" + surveyId);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = function () {
var result = JSON.parse(xhr.response);
onLoad(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.getSurveyJsonAndIsCompleted = function (surveyId, clientId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open("GET", dxSurveyService.serviceUrl +
"/getSurveyAndIsCompleted?surveyId=" +
surveyId +
"&clientId=" +
clientId);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = function () {
var result = JSON.parse(xhr.response);
var surveyJson = result ? result.survey : null;
var isCompleted = result ? result.isCompleted : null;
onLoad(xhr.status == 200, surveyJson, isCompleted, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.sendResult = function (postId, result, onSendResult, clientId, isPartialCompleted) {
if (clientId === void 0) { clientId = null; }
if (isPartialCompleted === void 0) { isPartialCompleted = false; }
var xhr = new XMLHttpRequest();
xhr.open("POST", dxSurveyService.serviceUrl + "/post/");
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
var data = { postId: postId, surveyResult: JSON.stringify(result) };
if (clientId)
data["clientId"] = clientId;
if (isPartialCompleted)
data["isPartialCompleted"] = true;
var dataStringify = JSON.stringify(data);
var self = this;
xhr.onload = xhr.onerror = function () {
if (!onSendResult)
return;
onSendResult(xhr.status === 200, xhr.response, xhr);
};
xhr.send(dataStringify);
};
dxSurveyService.prototype.sendFile = function (postId, file, onSendFile) {
var xhr = new XMLHttpRequest();
xhr.onload = xhr.onerror = function () {
if (!onSendFile)
return;
onSendFile(xhr.status == 200, JSON.parse(xhr.response));
};
xhr.open("POST", dxSurveyService.serviceUrl + "/upload/", true);
var formData = new FormData();
formData.append("file", file);
formData.append("postId", postId);
xhr.send(formData);
};
dxSurveyService.prototype.getResult = function (resultId, name, onGetResult) {
var xhr = new XMLHttpRequest();
var data = "resultId=" + resultId + "&name=" + name;
xhr.open("GET", dxSurveyService.serviceUrl + "/getResult?" + data);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var self = this;
xhr.onload = function () {
var result = null;
var list = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
list = [];
for (var key in result.QuestionResult) {
var el = { name: key, value: result.QuestionResult[key] };
list.push(el);
}
}
onGetResult(xhr.status == 200, result, list, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.isCompleted = function (resultId, clientId, onIsCompleted) {
var xhr = new XMLHttpRequest();
var data = "resultId=" + resultId + "&clientId=" + clientId;
xhr.open("GET", dxSurveyService.serviceUrl + "/isCompleted?" + data);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var self = this;
xhr.onload = function () {
var result = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
}
onIsCompleted(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
return dxSurveyService;
}());
/***/ }),
/* 42 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return englishStrings; });
//Uncomment this line on creating a translation file
//import { surveyLocalization } from "../surveyStrings";
var englishStrings = {
pagePrevText: "Previous",
pageNextText: "Next",
completeText: "Complete",
startSurveyText: "Start",
otherItemText: "Other (describe)",
noneItemText: "None",
selectAllItemText: "Select All",
progressText: "Page {0} of {1}",
panelDynamicProgressText: "Record {0} of {1}",
questionsProgressText: "Answered {0}/{1} questions",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Thank you for completing the survey!",
completingSurveyBefore: "Our records show that you have already completed this survey.",
loadingSurvey: "Loading Survey...",
optionsCaption: "Choose...",
value: "value",
requiredError: "Please answer the question.",
requiredErrorInPanel: "Please answer at least one question.",
requiredInAllRowsError: "Please answer questions in all rows.",
numericError: "The value should be numeric.",
textMinLength: "Please enter at least {0} characters.",
textMaxLength: "Please enter less than {0} characters.",
textMinMaxLength: "Please enter more than {0} and less than {1} characters.",
minRowCountError: "Please fill in at least {0} rows.",
minSelectError: "Please select at least {0} variants.",
maxSelectError: "Please select no more than {0} variants.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "The '{0}' should be equal or more than {1}",
numericMax: "The '{0}' should be equal or less than {1}",
invalidEmail: "Please enter a valid e-mail address.",
invalidExpression: "The expression: {0} should return 'true'.",
urlRequestError: "The request returned error '{0}'. {1}",
urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect",
exceedMaxSize: "The file size should not exceed {0}.",
otherRequiredError: "Please enter the other value.",
uploadingFile: "Your file is uploading. Please wait several seconds and try again.",
loadingFile: "Loading...",
chooseFile: "Choose file(s)...",
noFileChosen: "No file chosen",
confirmDelete: "Do you want to delete the record?",
keyDuplicationError: "This value should be unique.",
addColumn: "Add column",
addRow: "Add row",
removeRow: "Remove",
addPanel: "Add new",
removePanel: "Remove",
choices_Item: "item",
matrix_column: "Column",
matrix_row: "Row",
savingData: "The results are saving on the server...",
savingDataError: "An error occurred and we could not save the results.",
savingDataSuccess: "The results were saved successfully!",
saveAgainButton: "Try again",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "You have spent {0} on this page and {1} in total.",
timerSpentPage: "You have spent {0} on this page.",
timerSpentSurvey: "You have spent {0} in total.",
timerLimitAll: "You have spent {0} of {1} on this page and {2} of {3} in total.",
timerLimitPage: "You have spent {0} of {1} on this page.",
timerLimitSurvey: "You have spent {0} of {1} in total.",
cleanCaption: "Clean",
clearCaption: "Clear",
chooseFileCaption: "Choose file",
removeFileCaption: "Remove this file",
booleanCheckedLabel: "Yes",
booleanUncheckedLabel: "No",
confirmRemoveFile: "Are you sure that you want to remove this file: {0}?",
confirmRemoveAllFiles: "Are you sure that you want to remove all files?"
};
//Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable.
//surveyLocalization.locales["en"] = englishStrings;
//surveyLocalization.localeNames["en"] = "English";
/***/ }),
/* 43 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixBaseModel; });
/**
* A Model for a matrix base question.
*/
var QuestionMatrixBaseModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixBaseModel, _super);
function QuestionMatrixBaseModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.generatedVisibleRows = null;
_this.generatedTotalRow = null;
_this.filteredRows = null;
_this.filteredColumns = null;
_this.columns = _this.createColumnValues();
_this.rows = _this.createItemValues("rows");
return _this;
}
QuestionMatrixBaseModel.prototype.createColumnValues = function () {
return this.createItemValues("columns");
};
QuestionMatrixBaseModel.prototype.getType = function () {
return "matrixbase";
};
Object.defineProperty(QuestionMatrixBaseModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "showHeader", {
/**
* Set this property to false, to hide table header. The default value is true.
*/
get: function () {
return this.getPropertyValue("showHeader");
},
set: function (val) {
this.setPropertyValue("showHeader", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "columns", {
/**
* The list of columns. A column has a value and an optional text
*/
get: function () {
return this.getPropertyValue("columns");
},
set: function (newValue) {
this.setPropertyValue("columns", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleColumns", {
get: function () {
return !!this.filteredColumns ? this.filteredColumns : this.columns;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "rows", {
/**
* The list of rows. A row has a value and an optional text
*/
get: function () {
return this.getPropertyValue("rows");
},
set: function (newValue) {
var newRows = this.processRowsOnSet(newValue);
this.setPropertyValue("rows", newRows);
this.filterItems();
},
enumerable: true,
configurable: true
});
QuestionMatrixBaseModel.prototype.processRowsOnSet = function (newRows) {
return newRows;
};
QuestionMatrixBaseModel.prototype.getVisibleRows = function () {
return [];
};
Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleRows", {
/**
* Returns the list of visible rows as model objects.
* @see rowsVisibleIf
*/
get: function () {
return this.getVisibleRows();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "rowsVisibleIf", {
/**
* An expression that returns true or false. It runs against each row item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.
* @see visibleIf
*/
get: function () {
return this.getPropertyValue("rowsVisibleIf", "");
},
set: function (val) {
this.setPropertyValue("rowsVisibleIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "columnsVisibleIf", {
/**
* An expression that returns true or false. It runs against each column item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.
* @see rowsVisibleIf
*/
get: function () {
return this.getPropertyValue("columnsVisibleIf", "");
},
set: function (val) {
this.setPropertyValue("columnsVisibleIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
QuestionMatrixBaseModel.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runItemsCondition(values, properties);
};
QuestionMatrixBaseModel.prototype.filterItems = function () {
if (this.areInvisibleElementsShowing) {
this.onRowsChanged();
return false;
}
if (this.isLoadingFromJson || !this.data)
return false;
return this.runItemsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
};
QuestionMatrixBaseModel.prototype.onColumnsChanged = function () { };
QuestionMatrixBaseModel.prototype.onRowsChanged = function () {
this.fireCallback(this.visibleRowsChangedCallback);
};
QuestionMatrixBaseModel.prototype.shouldRunColumnExpression = function () {
return true;
};
QuestionMatrixBaseModel.prototype.hasRowsAsItems = function () {
return true;
};
QuestionMatrixBaseModel.prototype.runItemsCondition = function (values, properties) {
var oldVisibleRows = null;
if (!!this.filteredRows && !__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isValueEmpty(this.defaultValue)) {
oldVisibleRows = [];
for (var i = 0; i < this.filteredRows.length; i++) {
oldVisibleRows.push(this.filteredRows[i]);
}
}
var hasChanges = this.hasRowsAsItems() && this.runConditionsForRows(values, properties);
hasChanges = this.runConditionsForColumns(values, properties) || hasChanges;
if (hasChanges) {
if (!!this.filteredColumns || !!this.filteredRows) {
this.clearIncorrectValues();
}
if (!!oldVisibleRows) {
this.restoreNewVisibleRowsValues(oldVisibleRows);
}
this.generatedVisibleRows = null;
this.onRowsChanged();
}
return hasChanges;
};
QuestionMatrixBaseModel.prototype.runConditionsForRows = function (values, properties) {
var runner = !!this.rowsVisibleIf
? new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.rowsVisibleIf)
: null;
this.filteredRows = [];
var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.rows, this.filteredRows, runner, values, properties);
if (this.filteredRows.length === this.rows.length) {
this.filteredRows = null;
}
return hasChanged;
};
QuestionMatrixBaseModel.prototype.runConditionsForColumns = function (values, properties) {
var runner = !!this.columnsVisibleIf
? new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.columnsVisibleIf)
: null;
this.filteredColumns = [];
var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.columns, this.filteredColumns, runner, values, properties, this.shouldRunColumnExpression());
if (this.filteredColumns.length === this.columns.length) {
this.filteredColumns = null;
}
return hasChanged;
};
QuestionMatrixBaseModel.prototype.clearIncorrectValues = function () {
var val = this.value;
if (!val)
return;
var newVal = null;
var isChanged = false;
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
var columns = !!this.filteredColumns ? this.filteredColumns : this.columns;
for (var key in val) {
if (__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key) &&
__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(columns, val[key])) {
if (newVal == null)
newVal = {};
newVal[key] = val[key];
}
else {
isChanged = true;
}
}
if (isChanged) {
this.value = newVal;
}
_super.prototype.clearIncorrectValues.call(this);
};
QuestionMatrixBaseModel.prototype.clearInvisibleValuesInRows = function () {
if (this.isEmpty())
return;
var newData = __WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].getUnbindValue(this.value);
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
var key = rows[i].value;
if (!!newData[key] && !rows[i].isVisible) {
delete newData[key];
}
}
if (__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isTwoValueEquals(newData, this.value))
return;
this.value = newData;
};
QuestionMatrixBaseModel.prototype.restoreNewVisibleRowsValues = function (oldVisibleRows) {
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
var val = this.defaultValue;
var newValue = __WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].getUnbindValue(this.value);
var isChanged = false;
for (var key in val) {
if (__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key) &&
!__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(oldVisibleRows, key)) {
if (newValue == null)
newValue = {};
newValue[key] = val[key];
isChanged = true;
}
}
if (isChanged) {
this.value = newValue;
}
};
return QuestionMatrixBaseModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("matrixbase", [
"columnsVisibleIf:condition",
"rowsVisibleIf:condition",
{ name: "showHeader:boolean", default: true }
], undefined, "question");
/***/ }),
/* 44 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__panel__ = __webpack_require__(23);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PageModel; });
/**
* The page object. It has elements collection, that contains questions and panels.
*/
var PageModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(PageModel, _super);
function PageModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
_this.hasShownValue = false;
_this.isRandomizing = false;
/**
* Time in seconds end-user spent on this page
*/
_this.timeSpent = 0;
var self = _this;
_this.locTitle.onGetTextCallback = function (text) {
if (self.num > 0)
return self.num + ". " + text;
return text;
};
return _this;
}
PageModel.prototype.getType = function () {
return "page";
};
PageModel.prototype.toString = function () {
return this.name;
};
Object.defineProperty(PageModel.prototype, "isPage", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
PageModel.prototype.delete = function () {
if (!!this.survey) {
this.removeSelfFromList(this.survey.pages);
}
};
PageModel.prototype.onFirstRendering = function () {
if (this.wasShown)
return;
_super.prototype.onFirstRendering.call(this);
};
Object.defineProperty(PageModel.prototype, "visibleIndex", {
/**
* The visible index of the page. It has values from 0 to visible page count - 1.
* @see SurveyModel.visiblePages
* @see SurveyModel.pages
*/
get: function () {
return this.getPropertyValue("visibleIndex", -1);
},
set: function (val) {
this.setPropertyValue("visibleIndex", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "isStarted", {
/**
* Returns true, if the page is started page in the survey. It can be shown on the start only and the end-user could not comeback to it after it passed it.
*/
get: function () {
return this.survey && this.survey.isPageStarted(this);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "cssClasses", {
get: function () {
var css = this.css;
var classes = { page: {}, pageTitle: "", pageDescription: "", row: "" };
this.copyCssClasses(classes.page, css.page);
if (!!css.pageTitle) {
classes.pageTitle = css.pageTitle;
}
if (!!css.pageDescription) {
classes.pageDescription = css.pageDescription;
}
if (!!css.row) {
classes.row = css.row;
}
return classes;
},
enumerable: true,
configurable: true
});
PageModel.prototype.getIsPageVisible = function (exceptionQuestion) {
if (this.isStarted)
return false;
return _super.prototype.getIsPageVisible.call(this, exceptionQuestion);
};
Object.defineProperty(PageModel.prototype, "num", {
get: function () {
return this.getPropertyValue("num", -1);
},
set: function (val) {
if (this.num == val)
return;
this.setPropertyValue("num", val);
this.onNumChanged(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "navigationButtonsVisibility", {
/**
* Set this property to "hide" to make "Prev", "Next" and "Complete" buttons are invisible for this page. Set this property to "show" to make these buttons visible, even if survey showNavigationButtons property is false.
* @see SurveyMode.showNavigationButtons
*/
get: function () {
return this.getPropertyValue("navigationButtonsVisibility");
},
set: function (val) {
this.setPropertyValue("navigationButtonsVisibility", val.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "wasShown", {
/**
* The property returns true, if the page has been shown to the end-user.
*/
get: function () {
return this.hasShownValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "hasShown", {
get: function () {
return this.wasShown;
},
enumerable: true,
configurable: true
});
PageModel.prototype.setWasShown = function (val) {
if (val == this.hasShownValue)
return;
this.hasShownValue = val;
if (this.isDesignMode)
return;
if (val == true && this.areQuestionsRandomized) {
this.randomizeElements();
}
};
PageModel.prototype.randomizeElements = function () {
if (this.isRandomizing)
return;
this.isRandomizing = true;
var oldElements = [];
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
oldElements.push(elements[i]);
}
var newElements = __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].randomizeArray(oldElements);
this.elements.splice(0, this.elements.length);
for (var i = 0; i < newElements.length; i++) {
this.elements.push(newElements[i]);
}
this.isRandomizing = false;
};
Object.defineProperty(PageModel.prototype, "areQuestionsRandomized", {
/**
* The property returns true, if the elements are randomized on the page
* @see hasShown
* @see questionsOrder
* @see SurveyModel.questionsOrder
*/
get: function () {
var order = this.questionsOrder == "default" && this.survey
? this.survey.questionsOrder
: this.questionsOrder;
return order == "random";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "questionsOrder", {
/**
* Use this property to randomize questions. Set it to 'random' to randomize questions, 'initial' to keep them in the same order or 'default' to use the Survey questionsOrder property
* @see SurveyModel.questionsOrder
* @see areQuestionsRandomized
*/
get: function () {
return this.getPropertyValue("questionsOrder");
},
set: function (val) {
this.setPropertyValue("questionsOrder", val);
},
enumerable: true,
configurable: true
});
/**
* Call it to scroll to the page top.
*/
PageModel.prototype.scrollToTop = function () {
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].ScrollElementToTop(this.id);
};
// public get timeSpent(): number {
// return this.getPropertyValue("timeSpent", 0);
// }
// public set timeSpent(val: number) {
// this.setPropertyValue("timeSpent", val);
// }
/**
* Returns the list of all panels in the page
*/
PageModel.prototype.getPanels = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
this.addPanelsIntoList(result, visibleOnly, includingDesignTime);
return result;
};
Object.defineProperty(PageModel.prototype, "maxTimeToFinish", {
/**
* The maximum time in seconds that end-user has to complete the page. If the value is 0 or less, the end-user has unlimited number of time to finish the page.
* @see startTimer
* @see SurveyModel.maxTimeToFinishPage
*/
get: function () {
return this.getPropertyValue("maxTimeToFinish", 0);
},
set: function (val) {
this.setPropertyValue("maxTimeToFinish", val);
},
enumerable: true,
configurable: true
});
PageModel.prototype.onNumChanged = function (value) { };
PageModel.prototype.onVisibleChanged = function () {
if (this.isRandomizing)
return;
_super.prototype.onVisibleChanged.call(this);
if (this.survey != null) {
this.survey.pageVisibilityChanged(this, this.isVisible);
}
};
PageModel.prototype.dragDropStart = function (src, target, nestedPanelDepth) {
if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; }
this.dragDropInfo = new __WEBPACK_IMPORTED_MODULE_4__panel__["a" /* DragDropInfo */](src, target, nestedPanelDepth);
};
PageModel.prototype.dragDropMoveTo = function (destination, isBottom, isEdge) {
if (isBottom === void 0) { isBottom = false; }
if (isEdge === void 0) { isEdge = false; }
if (!this.dragDropInfo)
return false;
this.dragDropInfo.destination = destination;
this.dragDropInfo.isBottom = isBottom;
this.dragDropInfo.isEdge = isEdge;
this.correctDragDropInfo(this.dragDropInfo);
if (!this.dragDropCanDropTagert())
return false;
if (!this.dragDropCanDropSource() || !this.dragDropAllowFromSurvey()) {
if (!!this.dragDropInfo.source) {
var row = this.dragDropFindRow(this.dragDropInfo.target);
this.updateRowsRemoveElementFromRow(this.dragDropInfo.target, row);
}
return false;
}
this.dragDropAddTarget(this.dragDropInfo);
return true;
};
PageModel.prototype.correctDragDropInfo = function (dragDropInfo) {
if (!dragDropInfo.destination)
return;
var panel = dragDropInfo.destination.isPanel
? dragDropInfo.destination
: null;
if (!panel)
return;
if (!dragDropInfo.target.isLayoutTypeSupported(panel.getChildrenLayoutType())) {
dragDropInfo.isEdge = true;
}
};
PageModel.prototype.dragDropAllowFromSurvey = function () {
var dest = this.dragDropInfo.destination;
if (!dest || !this.survey)
return true;
var insertBefore = null;
var insertAfter = null;
var parent = dest.isPage || (!this.dragDropInfo.isEdge && dest.isPanel)
? dest
: dest.parent;
if (!dest.isPage) {
var container = dest.parent;
if (!!container) {
var elements = container.elements;
var index = elements.indexOf(dest);
if (index > -1) {
insertBefore = dest;
insertAfter = dest;
if (this.dragDropInfo.isBottom) {
insertBefore =
index < elements.length - 1 ? elements[index + 1] : null;
}
else {
insertAfter = index > 0 ? elements[index - 1] : null;
}
}
}
}
var options = {
target: this.dragDropInfo.target,
source: this.dragDropInfo.source,
parent: parent,
insertAfter: insertAfter,
insertBefore: insertBefore
};
return this.survey.dragAndDropAllow(options);
};
PageModel.prototype.dragDropFinish = function (isCancel) {
if (isCancel === void 0) { isCancel = false; }
if (!this.dragDropInfo)
return;
var target = this.dragDropInfo.target;
var row = this.dragDropFindRow(target);
var targetIndex = this.dragDropGetElementIndex(target, row);
this.updateRowsRemoveElementFromRow(target, row);
if (!isCancel && !!row) {
var src = this.dragDropInfo.source;
var isSamePanel = false;
if (!!src && !!src.parent) {
isSamePanel = row.panel == src.parent;
if (isSamePanel) {
row.panel.dragDropMoveElement(src, target, targetIndex);
targetIndex = -1;
}
else {
src.parent.removeElement(src);
}
}
if (targetIndex > -1) {
row.panel.addElement(target, targetIndex);
}
}
this.dragDropInfo = null;
return !isCancel ? target : null;
};
PageModel.prototype.dragDropGetElementIndex = function (target, row) {
if (!row)
return -1;
var index = row.elements.indexOf(target);
if (row.index == 0)
return index;
var prevRow = row.panel.rows[row.index - 1];
var prevElement = prevRow.elements[prevRow.elements.length - 1];
return index + row.panel.elements.indexOf(prevElement) + 1;
};
PageModel.prototype.dragDropCanDropTagert = function () {
var destination = this.dragDropInfo.destination;
if (!destination || destination.isPage)
return true;
return this.dragDropCanDropCore(this.dragDropInfo.target, destination);
};
PageModel.prototype.dragDropCanDropSource = function () {
var source = this.dragDropInfo.source;
if (!source)
return true;
var destination = this.dragDropInfo.destination;
if (!this.dragDropCanDropCore(source, destination))
return false;
return this.dragDropCanDropNotNext(source, destination, this.dragDropInfo.isEdge, this.dragDropInfo.isBottom);
};
PageModel.prototype.dragDropCanDropCore = function (target, destination) {
if (!destination)
return true;
if (this.dragDropIsSameElement(destination, target))
return false;
if (target.isPanel) {
var pnl = target;
if (pnl.containsElement(destination) ||
!!pnl.getElementByName(destination.name))
return false;
}
return true;
};
PageModel.prototype.dragDropCanDropNotNext = function (source, destination, isEdge, isBottom) {
if (!destination || (destination.isPanel && !isEdge))
return true;
if (source.parent !== destination.parent)
return true;
var pnl = source.parent;
var srcIndex = pnl.elements.indexOf(source);
var destIndex = pnl.elements.indexOf(destination);
if (destIndex < srcIndex && !isBottom)
destIndex--;
if (isBottom)
destIndex++;
return srcIndex < destIndex
? destIndex - srcIndex > 1
: srcIndex - destIndex > 0;
};
PageModel.prototype.dragDropIsSameElement = function (el1, el2) {
return el1 == el2 || el1.name == el2.name;
};
return PageModel;
}(__WEBPACK_IMPORTED_MODULE_4__panel__["b" /* PanelModelBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("page", [
{
name: "navigationButtonsVisibility",
default: "inherit",
choices: ["inherit", "show", "hide"]
},
{
name: "questionsOrder",
default: "default",
choices: ["default", "initial", "random"]
},
{ name: "maxTimeToFinish:number", default: 0, minValue: 0 }
], function () {
return new PageModel();
}, "panelbase");
/***/ }),
/* 45 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCustomWidget; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return CustomWidgetCollection; });
var QuestionCustomWidget = /** @class */ (function () {
function QuestionCustomWidget(name, widgetJson) {
this.name = name;
this.widgetJson = widgetJson;
this.htmlTemplate = widgetJson.htmlTemplate ? widgetJson.htmlTemplate : "";
}
QuestionCustomWidget.prototype.afterRender = function (question, el) {
if (this.widgetJson.afterRender)
this.widgetJson.afterRender(question, el);
};
QuestionCustomWidget.prototype.willUnmount = function (question, el) {
if (this.widgetJson.willUnmount)
this.widgetJson.willUnmount(question, el);
};
QuestionCustomWidget.prototype.getDisplayValue = function (question, value) {
if (value === void 0) { value = undefined; }
if (this.widgetJson.getDisplayValue)
return this.widgetJson.getDisplayValue(question, value);
return null;
};
QuestionCustomWidget.prototype.isFit = function (question) {
if (this.isLibraryLoaded() && this.widgetJson.isFit)
return this.widgetJson.isFit(question);
return false;
};
QuestionCustomWidget.prototype.activatedByChanged = function (activatedBy) {
if (this.isLibraryLoaded() && this.widgetJson.activatedByChanged) {
this.widgetJson.activatedByChanged(activatedBy);
}
};
QuestionCustomWidget.prototype.isLibraryLoaded = function () {
if (this.widgetJson.widgetIsLoaded)
return this.widgetJson.widgetIsLoaded() == true;
return true;
};
Object.defineProperty(QuestionCustomWidget.prototype, "isDefaultRender", {
get: function () {
return this.widgetJson.isDefaultRender;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCustomWidget.prototype, "pdfQuestionType", {
get: function () {
return this.widgetJson.pdfQuestionType;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCustomWidget.prototype, "pdfRender", {
get: function () {
return this.widgetJson.pdfRender;
},
enumerable: true,
configurable: true
});
return QuestionCustomWidget;
}());
var CustomWidgetCollection = /** @class */ (function () {
function CustomWidgetCollection() {
this.widgetsValues = [];
this.widgetsActivatedBy = {};
this.onCustomWidgetAdded = new __WEBPACK_IMPORTED_MODULE_0__base__["c" /* Event */]();
}
Object.defineProperty(CustomWidgetCollection.prototype, "widgets", {
get: function () {
return this.widgetsValues;
},
enumerable: true,
configurable: true
});
CustomWidgetCollection.prototype.addCustomWidget = function (widgetJson, activatedBy) {
if (activatedBy === void 0) { activatedBy = "property"; }
var name = widgetJson.name;
if (!name) {
name = "widget_" + this.widgets.length + 1;
}
var customWidget = new QuestionCustomWidget(name, widgetJson);
this.widgetsValues.push(customWidget);
this.widgetsActivatedBy[name] = activatedBy;
customWidget.activatedByChanged(activatedBy);
this.onCustomWidgetAdded.fire(customWidget, null);
};
/**
* Returns the way the custom wiget is activated. It can be activated by a property ("property"), question type ("type") or by new/custom question type ("customtype").
* @param widgetName the custom widget name
* @see setActivatedBy
*/
CustomWidgetCollection.prototype.getActivatedBy = function (widgetName) {
var res = this.widgetsActivatedBy[widgetName];
return res ? res : "property";
};
/**
* Sets the way the custom wiget is activated. The activation types are: property ("property"), question type ("type") or new/custom question type ("customtype"). A custom wiget may support all or only some of this activation types.
* @param widgetName
* @param activatedBy there are three possible variants: "property", "type" and "customtype"
*/
CustomWidgetCollection.prototype.setActivatedBy = function (widgetName, activatedBy) {
if (!widgetName || !activatedBy)
return;
var widget = this.getCustomWidgetByName(widgetName);
if (!widget)
return;
this.widgetsActivatedBy[widgetName] = activatedBy;
widget.activatedByChanged(activatedBy);
};
CustomWidgetCollection.prototype.clear = function () {
this.widgetsValues = [];
};
CustomWidgetCollection.prototype.getCustomWidgetByName = function (name) {
for (var i = 0; i < this.widgets.length; i++) {
if (this.widgets[i].name == name)
return this.widgets[i];
}
return null;
};
CustomWidgetCollection.prototype.getCustomWidget = function (question) {
for (var i = 0; i < this.widgetsValues.length; i++) {
if (this.widgetsValues[i].isFit(question))
return this.widgetsValues[i];
}
return null;
};
CustomWidgetCollection.Instance = new CustomWidgetCollection();
return CustomWidgetCollection;
}());
/***/ }),
/* 46 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdownModel; });
/**
* A Model for a dropdown question
*/
var QuestionDropdownModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionDropdownModel, _super);
function QuestionDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.minMaxChoices = [];
_this.createLocalizableString("optionsCaption", _this);
var self = _this;
_this.registerFunctionOnPropertiesValueChanged(["choicesMin", "choicesMax", "choicesStep"], function () {
self.onVisibleChoicesChanged();
});
return _this;
}
Object.defineProperty(QuestionDropdownModel.prototype, "showOptionsCaption", {
/**
* This flag controls whether to show options caption item ('Choose...').
*/
get: function () {
return this.getPropertyValue("showOptionsCaption");
},
set: function (val) {
this.setPropertyValue("showOptionsCaption", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "optionsCaption", {
/**
* Use this property to set the options caption different from the default value. The default value is taken from localization strings.
*/
get: function () {
return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption"));
},
set: function (val) {
this.setLocalizableStringText("optionsCaption", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "locOptionsCaption", {
get: function () {
return this.getLocalizableString("optionsCaption");
},
enumerable: true,
configurable: true
});
QuestionDropdownModel.prototype.getType = function () {
return "dropdown";
};
Object.defineProperty(QuestionDropdownModel.prototype, "selectedItem", {
get: function () {
if (this.isEmpty())
return null;
return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.visibleChoices, this.value);
},
enumerable: true,
configurable: true
});
QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionDropdownModel.prototype.getChoices = function () {
var items = _super.prototype.getChoices.call(this);
if (this.choicesMax <= this.choicesMin)
return items;
var res = [];
for (var i = 0; i < items.length; i++) {
res.push(items[i]);
}
if (this.minMaxChoices.length === 0 ||
this.minMaxChoices.length !==
(this.choicesMax - this.choicesMin) / this.choicesStep + 1) {
this.minMaxChoices = [];
for (var i = this.choicesMin; i <= this.choicesMax; i += this.choicesStep) {
this.minMaxChoices.push(new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */](i));
}
}
res = res.concat(this.minMaxChoices);
return res;
};
Object.defineProperty(QuestionDropdownModel.prototype, "choicesMin", {
/**
* Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10.
* @see choicesMax
* @see choicesStep
*/
get: function () {
return this.getPropertyValue("choicesMin", 0);
},
set: function (val) {
this.setPropertyValue("choicesMin", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "choicesMax", {
/**
* Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10.
* @see choicesMin
* @see choicesStep
*/
get: function () {
return this.getPropertyValue("choicesMax", 0);
},
set: function (val) {
this.setPropertyValue("choicesMax", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "choicesStep", {
/**
* The default value is 1. It tells the value of the iterator between choicesMin and choicesMax properties.
* If choicesMin = 10, choicesMax = 30 and choicesStep = 10 then you will have only three additional choices: [10, 20, 30].
* @see choicesMin
* @see choicesMax
*/
get: function () {
return this.getPropertyValue("choicesStep", 1);
},
set: function (val) {
if (val < 1)
val = 1;
this.setPropertyValue("choicesStep", val);
},
enumerable: true,
configurable: true
});
return QuestionDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["b" /* QuestionSelectBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("dropdown", [
{ name: "optionsCaption", serializationProperty: "locOptionsCaption" },
{ name: "showOptionsCaption:boolean", default: true },
{ name: "choicesMin:number", default: 0 },
{ name: "choicesMax:number", default: 0 },
{ name: "choicesStep:number", default: 1, minValue: 1 }
], function () {
return new QuestionDropdownModel("");
}, "selectbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("dropdown", function (name) {
var q = new QuestionDropdownModel(name);
q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 47 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpressionModel; });
/* harmony export (immutable) */ __webpack_exports__["b"] = getCurrecyCodes;
/**
* A Model for expression question. It is a read-only question. It calculates value based on epxression property.
*/
var QuestionExpressionModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionExpressionModel, _super);
function QuestionExpressionModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("format", _this);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("expression", function () {
if (self.expressionRunner) {
self.expressionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ExpressionRunner */](self.expression);
}
});
return _this;
}
QuestionExpressionModel.prototype.getType = function () {
return "expression";
};
Object.defineProperty(QuestionExpressionModel.prototype, "format", {
/**
* Use this property to display the value in your own format. Make sure you have "{0}" substring in your string, to display the actual value.
*/
get: function () {
return this.getLocalizableStringText("format", "");
},
set: function (val) {
this.setLocalizableStringText("format", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "locFormat", {
get: function () {
return this.getLocalizableString("format");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "expression", {
/**
* The Expression that used to calculate the question value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.
*
Example: "({quantity} * {price}) * (100 - {discount}) / 100"
*/
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.locCalculation = function () {
this.expressionIsRunning = true;
};
QuestionExpressionModel.prototype.unlocCalculation = function () {
this.expressionIsRunning = false;
};
QuestionExpressionModel.prototype.runCondition = function (values, properties) {
var _this = this;
_super.prototype.runCondition.call(this, values, properties);
if (!this.expression || this.expressionIsRunning)
return;
this.locCalculation();
if (!this.expressionRunner) {
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ExpressionRunner */](this.expression);
}
this.expressionRunner.onRunComplete = function (newValue) {
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, _this.value)) {
_this.value = newValue;
}
_this.unlocCalculation();
};
this.expressionRunner.run(values, properties);
};
Object.defineProperty(QuestionExpressionModel.prototype, "maximumFractionDigits", {
/**
* The maximum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used.
*/
get: function () {
return this.getPropertyValue("maximumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("maximumFractionDigits", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "minimumFractionDigits", {
/**
* The minimum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used.
*/
get: function () {
return this.getPropertyValue("minimumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("minimumFractionDigits", val);
},
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var val = this.isValueEmpty(value) ? this.defaultValue : value;
if (this.isValueEmpty(val))
return "";
var str = this.getValueAsStr(val);
if (!this.format)
return str;
return this.format["format"](str);
};
Object.defineProperty(QuestionExpressionModel.prototype, "displayStyle", {
/**
* You may set this property to "decimal", "currency", "percent" or "date". If you set it to "currency", you may use the currency property to display the value in currency different from USD.
* @see currency
*/
get: function () {
return this.getPropertyValue("displayStyle");
},
set: function (val) {
this.setPropertyValue("displayStyle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "currency", {
/**
* Use it to display the value in the currency differen from USD. The displayStype should be set to "currency".
* @see displayStyle
*/
get: function () {
return this.getPropertyValue("currency");
},
set: function (val) {
if (getCurrecyCodes().indexOf(val) < 0)
return;
this.setPropertyValue("currency", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "useGrouping", {
get: function () {
return this.getPropertyValue("useGrouping", true);
},
set: function (val) {
this.setPropertyValue("useGrouping", val);
},
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.getValueAsStr = function (val) {
if (this.displayStyle == "date") {
var d = new Date(val);
if (!!d && !!d.toLocaleDateString)
return d.toLocaleDateString();
}
if (this.displayStyle != "none" && __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isNumber(val)) {
var locale = this.getLocale();
if (!locale)
locale = "en";
var options = {
style: this.displayStyle,
currency: this.currency,
useGrouping: this.useGrouping
};
if (this.maximumFractionDigits > -1) {
options["maximumFractionDigits"] = this.maximumFractionDigits;
}
if (this.minimumFractionDigits > -1) {
options["minimumFractionDigits"] = this.minimumFractionDigits;
}
return val.toLocaleString(locale, options);
}
return val.toString();
};
return QuestionExpressionModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
function getCurrecyCodes() {
return [
"AED",
"AFN",
"ALL",
"AMD",
"ANG",
"AOA",
"ARS",
"AUD",
"AWG",
"AZN",
"BAM",
"BBD",
"BDT",
"BGN",
"BHD",
"BIF",
"BMD",
"BND",
"BOB",
"BOV",
"BRL",
"BSD",
"BTN",
"BWP",
"BYN",
"BZD",
"CAD",
"CDF",
"CHE",
"CHF",
"CHW",
"CLF",
"CLP",
"CNY",
"COP",
"COU",
"CRC",
"CUC",
"CUP",
"CVE",
"CZK",
"DJF",
"DKK",
"DOP",
"DZD",
"EGP",
"ERN",
"ETB",
"EUR",
"FJD",
"FKP",
"GBP",
"GEL",
"GHS",
"GIP",
"GMD",
"GNF",
"GTQ",
"GYD",
"HKD",
"HNL",
"HRK",
"HTG",
"HUF",
"IDR",
"ILS",
"INR",
"IQD",
"IRR",
"ISK",
"JMD",
"JOD",
"JPY",
"KES",
"KGS",
"KHR",
"KMF",
"KPW",
"KRW",
"KWD",
"KYD",
"KZT",
"LAK",
"LBP",
"LKR",
"LRD",
"LSL",
"LYD",
"MAD",
"MDL",
"MGA",
"MKD",
"MMK",
"MNT",
"MOP",
"MRO",
"MUR",
"MVR",
"MWK",
"MXN",
"MXV",
"MYR",
"MZN",
"NAD",
"NGN",
"NIO",
"NOK",
"NPR",
"NZD",
"OMR",
"PAB",
"PEN",
"PGK",
"PHP",
"PKR",
"PLN",
"PYG",
"QAR",
"RON",
"RSD",
"RUB",
"RWF",
"SAR",
"SBD",
"SCR",
"SDG",
"SEK",
"SGD",
"SHP",
"SLL",
"SOS",
"SRD",
"SSP",
"STD",
"SVC",
"SYP",
"SZL",
"THB",
"TJS",
"TMT",
"TND",
"TOP",
"TRY",
"TTD",
"TWD",
"TZS",
"UAH",
"UGX",
"USD",
"USN",
"UYI",
"UYU",
"UZS",
"VEF",
"VND",
"VUV",
"WST",
"XAF",
"XAG",
"XAU",
"XBA",
"XBB",
"XBC",
"XBD",
"XCD",
"XDR",
"XOF",
"XPD",
"XPF",
"XPT",
"XSU",
"XTS",
"XUA",
"XXX",
"YER",
"ZAR",
"ZMW",
"ZWL"
];
}
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("expression", [
"expression:expression",
{ name: "format", serializationProperty: "locFormat" },
{
name: "displayStyle",
default: "none",
choices: ["none", "decimal", "currency", "percent", "date"]
},
{
name: "currency",
choices: function () {
return getCurrecyCodes();
},
default: "USD"
},
{ name: "maximumFractionDigits:number", default: -1 },
{ name: "minimumFractionDigits:number", default: -1 },
{ name: "useGrouping:boolean", default: true },
{ name: "commentText", visible: false },
{ name: "enableIf", visible: false },
{ name: "isRequired", visible: false },
{ name: "readOnly", visible: false },
{ name: "requiredErrorText", visible: false },
{ name: "validators", visible: false },
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
{ name: "requiredIf", visible: false }
], function () {
return new QuestionExpressionModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) {
return new QuestionExpressionModel(name);
});
/***/ }),
/* 48 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__validator__ = __webpack_require__(32);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionTextModel; });
/**
* A Model for an input text question.
*/
var QuestionTextModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionTextModel, _super);
function QuestionTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("placeHolder", _this);
return _this;
}
QuestionTextModel.prototype.isTextValue = function () {
return this.inputType == "text";
};
QuestionTextModel.prototype.getType = function () {
return "text";
};
Object.defineProperty(QuestionTextModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () {
return this.getPropertyValue("inputType");
},
set: function (val) {
val = val.toLowerCase();
if (val == "datetime_local")
val = "datetime-local";
this.setPropertyValue("inputType", val.toLowerCase());
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.getValidators = function () {
var validators = _super.prototype.getValidators.call(this);
if (this.inputType === "email" &&
!this.validators.some(function (v) { return v.getType() === "emailvalidator"; })) {
validators.push(new __WEBPACK_IMPORTED_MODULE_5__validator__["b" /* EmailValidator */]());
}
return validators;
};
QuestionTextModel.prototype.isLayoutTypeSupported = function (layoutType) {
return true;
};
Object.defineProperty(QuestionTextModel.prototype, "maxLength", {
/**
* The maximim text length. If it is -1, defaul value, then the survey maxTextLength property will be used.
* If it is 0, then the value is unlimited
* @see SurveyModel.maxTextLength
*/
get: function () {
return this.getPropertyValue("maxLength");
},
set: function (val) {
this.setPropertyValue("maxLength", val);
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.getMaxLength = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, this.survey ? this.survey.maxTextLength : -1);
};
Object.defineProperty(QuestionTextModel.prototype, "size", {
/**
* The text input size
*/
get: function () {
return this.getPropertyValue("size");
},
set: function (val) {
this.setPropertyValue("size", val);
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value === "";
};
QuestionTextModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
Object.defineProperty(QuestionTextModel.prototype, "placeHolder", {
/**
* The input place holder.
*/
get: function () {
return this.getLocalizableStringText("placeHolder");
},
set: function (val) {
this.setLocalizableStringText("placeHolder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "locPlaceHolder", {
get: function () {
return this.getLocalizableString("placeHolder");
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.setNewValue = function (newValue) {
newValue = this.correctValueType(newValue);
_super.prototype.setNewValue.call(this, newValue);
};
QuestionTextModel.prototype.correctValueType = function (newValue) {
if (!newValue)
return newValue;
if (this.inputType == "number" || this.inputType == "range") {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isNumber(newValue) ? parseFloat(newValue) : "";
}
return newValue;
};
QuestionTextModel.prototype.addSupportedValidators = function (supportedValidators) {
_super.prototype.addSupportedValidators.call(this, supportedValidators);
supportedValidators.push("numeric", "text", "regex", "email");
};
return QuestionTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("text", [
{
name: "inputType",
default: "text",
choices: [
"color",
"date",
"datetime",
"datetime-local",
"email",
"month",
"number",
"password",
"range",
"tel",
"text",
"time",
"url",
"week"
]
},
{ name: "size:number", default: 25 },
{ name: "maxLength:number", default: -1 },
{ name: "placeHolder", serializationProperty: "locPlaceHolder" }
], function () {
return new QuestionTextModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("text", function (name) {
return new QuestionTextModel(name);
});
/***/ }),
/* 49 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionNonValue; });
/**
* A Model for non value question. This question doesn't add any new functionality. It hides some properties, including the value.
*/
var QuestionNonValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionNonValue, _super);
function QuestionNonValue(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionNonValue.prototype.getType = function () {
return "nonvalue";
};
Object.defineProperty(QuestionNonValue.prototype, "hasInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionNonValue.prototype, "hasTitle", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionNonValue.prototype.getTitleLocation = function () {
return "";
};
Object.defineProperty(QuestionNonValue.prototype, "hasComment", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionNonValue.prototype.getAllErrors = function () {
return [];
};
QuestionNonValue.prototype.supportGoNextPageAutomatic = function () {
return false;
};
QuestionNonValue.prototype.addConditionNames = function (names) { };
QuestionNonValue.prototype.addConditionObjectsByContext = function (objects, context) { };
QuestionNonValue.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
return null;
};
return QuestionNonValue;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("nonvalue", [
{ name: "title", visible: false },
{ name: "description", visible: false },
{ name: "valueName", visible: false },
{ name: "enableIf", visible: false },
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
{ name: "isRequired", visible: false },
{ name: "requiredErrorText", visible: false },
{ name: "readOnly", visible: false },
{ name: "requiredIf", visible: false },
{ name: "validators", visible: false },
{ name: "titleLocation", visible: false },
{ name: "useDisplayValuesInTitle", visible: false }
], function () {
return new QuestionNonValue("");
}, "question");
/***/ }),
/* 50 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__row__ = __webpack_require__(38);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPanelBase; });
var SurveyPanelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyPanelBase, _super);
function SurveyPanelBase(props) {
return _super.call(this, props) || this;
}
SurveyPanelBase.prototype.getStateElement = function () {
return this.panelBase;
};
Object.defineProperty(SurveyPanelBase.prototype, "survey", {
get: function () {
return this.getSurvey();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyPanelBase.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyPanelBase.prototype, "css", {
get: function () {
return this.getCss();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyPanelBase.prototype, "panelBase", {
get: function () {
return this.getPanelBase();
},
enumerable: true,
configurable: true
});
SurveyPanelBase.prototype.getPanelBase = function () {
return this.props.element;
};
SurveyPanelBase.prototype.getSurvey = function () {
return this.props.survey;
};
SurveyPanelBase.prototype.getCss = function () {
return this.props.css;
};
SurveyPanelBase.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.doAfterRender();
};
SurveyPanelBase.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
var el = this.refs["root"];
if (!!el) {
el.removeAttribute("data-rendered");
}
};
SurveyPanelBase.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
if (!!prevProps.page &&
!!this.survey &&
!!this.survey.currentPage &&
prevProps.page.name === this.survey.currentPage.name)
return;
this.doAfterRender();
};
SurveyPanelBase.prototype.doAfterRender = function () {
var el = this.refs["root"];
if (el && this.survey) {
if (this.panelBase.isPanel) {
this.survey.afterRenderPanel(this.panelBase, el);
}
else {
this.survey.afterRenderPage(el);
}
}
};
SurveyPanelBase.prototype.renderRows = function (css) {
var rows = [];
var questionRows = this.panelBase.rows;
for (var i = 0; i < questionRows.length; i++) {
rows.push(this.createRow(questionRows[i], i, css));
}
return rows;
};
SurveyPanelBase.prototype.createRow = function (row, index, css) {
var rowName = "row" + (index + 1);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__row__["a" /* SurveyRow */], { key: rowName, row: row, survey: this.survey, creator: this.creator, css: css }));
};
return SurveyPanelBase;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */]));
/***/ }),
/* 51 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(31);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindowModel; });
/**
* A Model for a survey running in the Window.
*/
var SurveyWindowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyWindowModel, _super);
function SurveyWindowModel(jsonObj, initialModel) {
if (initialModel === void 0) { initialModel = null; }
var _this = _super.call(this) || this;
/**
* Set this value to negative value, for example -1, to avoid closing the window on completing the survey. Leave it equals to 0 (default value) to close the window immediately, or set it to 3, 5, 10, ... to close the window in 3, 5, 10 seconds.
*/
_this.closeOnCompleteTimeout = 0;
if (initialModel) {
_this.surveyValue = initialModel;
}
else {
_this.surveyValue = _this.createSurvey(jsonObj);
}
_this.surveyValue.showTitle = false;
if ("undefined" !== typeof document) {
_this.windowElement = document.createElement("div");
}
var self = _this;
_this.survey.onComplete.add(function (survey, options) {
self.onSurveyComplete();
});
return _this;
}
SurveyWindowModel.prototype.getType = function () {
return "window";
};
Object.defineProperty(SurveyWindowModel.prototype, "survey", {
/**
* A survey object.
* @see SurveyModel
*/
get: function () {
return this.surveyValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "isShowing", {
/**
* Returns true if the window is currently showing. Set it to true to show the window and false to hide it.
* @see show
* @see hide
*/
get: function () {
return this.getPropertyValue("isShowing", false);
},
set: function (val) {
if (this.isShowing == val)
return;
this.setPropertyValue("isShowing", val);
if (this.showingChangedCallback)
this.showingChangedCallback();
},
enumerable: true,
configurable: true
});
/**
* Show the window
* @see hide
* @see isShowing
*/
SurveyWindowModel.prototype.show = function () {
this.isShowing = true;
};
/**
* Hide the window
* @see show
* @see isShowing
*/
SurveyWindowModel.prototype.hide = function () {
this.isShowing = false;
};
Object.defineProperty(SurveyWindowModel.prototype, "isExpanded", {
/**
* Returns true if the window is expanded. Set it to true to expand the window or false to collapse it.
* @see expand
* @see collapse
*/
get: function () {
return this.getPropertyValue("isExpanded", false);
},
set: function (val) {
this.setPropertyValue("isExpanded", val);
if (!this.isLoadingFromJson && this.expandedChangedCallback)
this.expandedChangedCallback();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "title", {
/**
* The window and survey title.
*/
get: function () {
return this.survey.title;
},
set: function (value) {
this.survey.title = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "locTitle", {
get: function () {
return this.survey.locTitle;
},
enumerable: true,
configurable: true
});
/**
* Expand the window to show the survey.
*/
SurveyWindowModel.prototype.expand = function () {
this.expandcollapse(true);
};
/**
* Collapse the window and show survey title only.
*/
SurveyWindowModel.prototype.collapse = function () {
this.expandcollapse(false);
};
SurveyWindowModel.prototype.createSurvey = function (jsonObj) {
return new __WEBPACK_IMPORTED_MODULE_2__survey__["a" /* SurveyModel */](jsonObj);
};
SurveyWindowModel.prototype.expandcollapse = function (value) {
this.isExpanded = value;
};
SurveyWindowModel.prototype.onSurveyComplete = function () {
if (this.closeOnCompleteTimeout < 0)
return;
if (this.closeOnCompleteTimeout == 0) {
this.closeWindowOnComplete();
}
else {
var self = this;
var timerId = null;
var func = function () {
self.closeWindowOnComplete();
window.clearInterval(timerId);
};
timerId = window.setInterval(func, this.closeOnCompleteTimeout * 1000);
}
};
SurveyWindowModel.prototype.closeWindowOnComplete = function () {
if (!!this.closeWindowOnCompleteCallback) {
this.closeWindowOnCompleteCallback();
}
};
SurveyWindowModel.surveyElementName = "windowSurveyJS";
return SurveyWindowModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
/***/ }),
/* 52 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(7);
/* unused harmony export surveyTimerFunctions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimer; });
var surveyTimerFunctions = {
setTimeout: function (func) {
return window.setTimeout(func, 1000);
},
clearTimeout: function (timerId) {
window.clearTimeout(timerId);
}
};
var SurveyTimer = /** @class */ (function () {
function SurveyTimer() {
this.listenerCounter = 0;
this.timerId = -1;
this.onTimer = new __WEBPACK_IMPORTED_MODULE_0__base__["c" /* Event */]();
}
Object.defineProperty(SurveyTimer, "instance", {
get: function () {
if (!SurveyTimer.instanceValue) {
SurveyTimer.instanceValue = new SurveyTimer();
}
return SurveyTimer.instanceValue;
},
enumerable: true,
configurable: true
});
SurveyTimer.prototype.start = function (func) {
var _this = this;
if (func === void 0) { func = null; }
if (func) {
this.onTimer.add(func);
}
if (this.timerId < 0) {
this.timerId = surveyTimerFunctions.setTimeout(function () {
_this.doTimer();
});
}
this.listenerCounter++;
};
SurveyTimer.prototype.stop = function (func) {
if (func === void 0) { func = null; }
if (func) {
this.onTimer.remove(func);
}
this.listenerCounter--;
if (this.listenerCounter == 0 && this.timerId > -1) {
surveyTimerFunctions.clearTimeout(this.timerId);
this.timerId = -1;
}
};
SurveyTimer.prototype.doTimer = function () {
var _this = this;
if (this.timerId < 0)
return;
this.onTimer.fire(this, {});
this.timerId = surveyTimerFunctions.setTimeout(function () {
_this.doTimer();
});
};
SurveyTimer.instanceValue = null;
return SurveyTimer;
}());
/***/ }),
/* 53 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapCss; });
var defaultBootstrapCss = {
root: "sv_main sv_bootstrap_css",
container: "sv_container",
header: "panel-heading card-header",
body: "panel-body card-block mt-4",
bodyEmpty: "panel-body card-block mt-4 sv_body_empty",
footer: "panel-footer card-footer",
title: "",
description: "",
navigationButton: "",
completedPage: "",
navigation: {
complete: "btn sv_complete_btn",
prev: "btn sv_prev_btn",
next: "btn sv_next_btn",
start: "btn sv_start_btn"
},
progress: "progress center-block mx-auto mb-4",
progressBar: "progress-bar",
progressTextUnderBar: "sv-hidden",
page: {
root: "",
title: "",
description: ""
},
pageTitle: "",
pageDescription: "small",
row: "sv_row",
question: {
mainRoot: "sv_qstn",
flowRoot: "sv_q_flow sv_qstn",
header: "",
headerLeft: "title-left",
content: "",
contentLeft: "content-left",
titleLeftRoot: "sv_qstn_left",
title: "",
number: "sv_q_num",
description: "small",
descriptionUnderInput: "small",
requiredText: "sv_q_required_text",
comment: "form-control",
required: "",
titleRequired: "",
hasError: "has-error",
indent: 20,
formGroup: "form-group"
},
panel: {
title: "sv_p_title",
titleExpandable: "sv_p_title_expandable",
icon: "sv_panel_icon",
iconExpanded: "sv_expanded",
description: "small sv_p_description",
container: "sv_p_container"
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: "",
locationTop: "sv_qstn_error_top",
locationBottom: "sv_qstn_error_bottom"
},
boolean: {
root: "sv_qbln form-inline checkbox",
item: "sv-boolean",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled"
},
checkbox: {
root: "sv_qcbc sv_qcbx form-inline",
item: "checkbox",
itemChecked: "checked",
itemInline: "sv_q_checkbox_inline",
itemControl: "",
itemDecorator: "sv-hidden",
label: "",
labelChecked: "",
controlLabel: "",
materialDecorator: "checkbox-material",
other: "sv_q_checkbox_other form-control",
column: "sv_q_select_column"
},
comment: "form-control",
dropdown: {
root: "",
control: "form-control",
other: "sv_q_dd_other form-control"
},
html: { root: "" },
matrix: {
root: "table sv_q_matrix",
label: "sv_q_m_label",
itemChecked: "checked",
itemDecorator: "sv-hidden",
cellText: "sv_q_m_cell_text",
cellTextSelected: "sv_q_m_cell_selected bg-primary",
cellLabel: "sv_q_m_cell_label"
},
matrixdropdown: { root: "table" },
matrixdynamic: {
root: "table",
button: "button",
buttonAdd: "",
buttonRemove: "",
iconAdd: "",
iconRemove: ""
},
paneldynamic: {
root: "",
navigation: "sv-paneldynamic__navigation",
progressTop: "sv-paneldynamic__progress sv-paneldynamic__progress--top",
progressBottom: "sv-paneldynamic__progress sv-paneldynamic__progress--bottom",
title: "sv-title sv-question__title",
button: "button",
buttonAdd: "button sv-paneldynamic__add-btn",
buttonRemove: "button sv-paneldynamic__remove-btn",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text"
},
multipletext: {
root: "table",
itemTitle: "",
itemValue: "sv_q_mt_item_value form-control"
},
radiogroup: {
root: "sv_qcbc form-inline",
item: "radio",
itemChecked: "checked",
itemInline: "sv_q_radiogroup_inline",
label: "",
labelChecked: "",
itemControl: "",
itemDecorator: "sv-hidden",
controlLabel: "",
materialDecorator: "circle",
other: "sv_q_radiogroup_other form-control",
clearButton: "sv_q_radiogroup_clear button",
column: "sv_q_select_column"
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
itemChecked: "checked",
itemInline: "sv_q_imagepicker_inline",
label: "sv_q_imgsel_label",
itemControl: "sv_q_imgsel_control_item",
image: "sv_q_imgsel_image",
itemText: "sv_q_imgsel_text",
clearButton: "sv_q_radiogroup_clear"
},
rating: {
root: "btn-group",
item: "btn btn-default btn-secondary",
selected: "active",
minText: "sv_q_rating_min_text",
itemText: "sv_q_rating_item_text",
maxText: "sv_q_rating_max_text",
disabled: ""
},
text: "form-control",
expression: "form-control",
file: {
root: "sv_q_file",
placeholderInput: "sv_q_file_placeholder",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button",
fileInput: "sv_q_file_input",
removeFile: "sv_q_file_remove",
removeFileSvg: "sv-hidden",
fileDecorator: "sv-hidden",
fileSignBottom: "sv-hidden",
removeButtonBottom: "sv-hidden"
},
saveData: {
root: "",
saving: "alert alert-info",
error: "alert alert-danger",
success: "alert alert-success",
saveAgainButton: ""
},
window: {
root: "modal-content",
body: "modal-body",
header: {
root: "modal-header panel-title",
title: "pull-left",
button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up",
buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down"
}
}
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["bootstrap"] = defaultBootstrapCss;
/***/ }),
/* 54 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapMaterialCss; });
var defaultBootstrapMaterialCss = {
root: "sv_main sv_bootstrapmaterial_css",
container: "sv_container",
header: "panel-heading",
body: "panel-body",
bodyEmpty: "panel-body sv_body_empty",
footer: "panel-footer",
title: "",
description: "",
navigationButton: "",
completedPage: "",
navigation: {
complete: "btn sv_complete_btn btn-primary",
prev: "btn sv_prev_btn btn-primary",
next: "btn sv_next_btn btn-primary",
start: "btn sv_start_btn btn-primary"
},
progress: "progress center-block mx-auto mb-4",
progressBar: "progress-bar",
progressTextUnderBar: "sv-hidden",
page: {
root: "",
title: "",
description: ""
},
pageTitle: "",
pageDescription: "small",
row: "sv_row",
question: {
mainRoot: "sv_qstn form-group",
flowRoot: "sv_q_flow form-group",
header: "",
headerLeft: "title-left",
content: "",
contentLeft: "content-left",
titleLeftRoot: "sv_qstn_left",
requiredText: "sv_q_required_text",
title: "",
number: "sv_q_num",
description: "small",
descriptionUnderInput: "small",
comment: "form-control",
required: "",
titleRequired: "",
hasError: "has-error",
indent: 20,
formGroup: "form-group"
},
panel: {
title: "sv_p_title",
titleExpandable: "sv_p_title_expandable",
icon: "sv_panel_icon",
iconExpanded: "sv_expanded",
description: "small sv_p_description",
container: "sv_p_container"
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: "",
locationTop: "sv_qstn_error_top",
locationBottom: "sv_qstn_error_bottom"
},
boolean: {
root: "sv_qbln form-inline checkbox",
item: "sv-boolean",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled"
},
checkbox: {
root: "sv_qcbx form-inline",
item: "checkbox",
itemChecked: "checked",
itemInline: "sv_q_checkbox_inline",
itemDecorator: "sv-hidden",
itemControl: "",
label: "",
labelChecked: "",
controlLabel: "",
materialDecorator: "checkbox-material",
other: "sv_q_checkbox_other form-control",
column: "sv_q_select_column"
},
comment: "form-control",
dropdown: {
root: "",
control: "form-control",
other: "sv_q_dd_other form-control"
},
html: { root: "" },
matrix: {
root: "table sv_q_matrix",
row: "form-group",
label: "sv_q_m_label radio-inline",
cellText: "sv_q_m_cell_text",
cellTextSelected: "sv_q_m_cell_selected bg-primary",
cellLabel: "sv_q_m_cell_label",
itemValue: "form-control",
itemChecked: "checked",
itemDecorator: "sv-hidden"
},
matrixdropdown: { root: "table", itemValue: "form-group" },
matrixdynamic: {
root: "table",
button: "btn btn-primary",
itemValue: "form-group",
buttonAdd: "",
buttonRemove: "",
iconAdd: "",
iconRemove: ""
},
paneldynamic: {
root: "",
navigation: "sv-paneldynamic__navigation",
progressTop: "sv-paneldynamic__progress sv-paneldynamic__progress--top",
progressBottom: "sv-paneldynamic__progress sv-paneldynamic__progress--bottom",
title: "sv-title sv-question__title",
button: "button",
buttonAdd: "button sv-paneldynamic__add-btn",
buttonRemove: "button sv-paneldynamic__remove-btn",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text"
},
multipletext: {
root: "table",
itemTitle: "",
row: "form-group",
itemValue: "sv_q_mt_item_value form-control"
},
radiogroup: {
root: "",
item: "radio",
itemChecked: "checked",
itemInline: "sv_q_radiogroup_inline",
itemDecorator: "sv-hidden",
label: "",
labelChecked: "",
itemControl: "",
controlLabel: "sv_q_radiogroup_control_label",
materialDecorator: "circle",
other: "sv_q_radiogroup_other form-control",
clearButton: "sv_q_radiogroup_clear button btn btn-primary",
column: "sv_q_select_column"
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
itemChecked: "checked",
itemInline: "sv_q_imagepicker_inline",
label: "sv_q_imgsel_label",
itemControl: "sv_q_imgsel_control_item",
image: "sv_q_imgsel_image",
itemText: "sv_q_imgsel_text",
clearButton: "sv_q_radiogroup_clear"
},
rating: {
root: "btn-group",
item: "btn btn-default btn-secondary",
selected: "active",
minText: "sv_q_rating_min_text",
itemText: "sv_q_rating_item_text",
maxText: "sv_q_rating_max_text",
disabled: ""
},
text: "form-control",
expression: "form-control",
file: {
root: "form-group is-fileinput sv_q_file",
placeholderInput: "",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button",
fileInput: "sv_q_file_input",
removeFile: "sv_q_file_remove",
removeFileSvg: "sv-hidden",
fileDecorator: "sv-hidden",
fileSignBottom: "sv-hidden",
removeButtonBottom: "sv-hidden"
},
saveData: {
root: "",
saving: "alert alert-info",
error: "alert alert-danger",
success: "alert alert-success",
saveAgainButton: ""
},
window: {
root: "modal-content",
body: "modal-body",
header: {
root: "modal-header panel-title",
title: "pull-left",
button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up",
buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down"
}
}
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["bootstrapmaterial"] = defaultBootstrapMaterialCss;
/***/ }),
/* 55 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return modernCss; });
var modernCss = {
root: "sv-root-modern",
container: "sv-container-modern",
header: "sv-title sv-container-modern__title",
body: "sv-body",
bodyEmpty: "sv-body sv-body--empty",
footer: "sv-footer sv-body__footer sv-clearfix",
title: "",
description: "",
navigationButton: "",
completedPage: "sv-completedpage",
navigation: {
complete: "sv-btn sv-footer__complete-btn",
prev: "sv-btn sv-footer__prev-btn",
next: "sv-btn sv-footer__next-btn",
start: "sv-btn sv-footer__start-btn"
},
panel: {
title: "sv-title sv-panel__title",
titleExpandable: "sv-panel__title--expandable",
description: "sv-description sv-panel__description",
container: "sv-panel sv-row__panel",
content: "sv-panel__content",
icon: "sv-panel__icon",
iconExpanded: "sv-panel__icon--expanded"
},
paneldynamic: {
root: "sv-paneldynamic",
navigation: "sv-paneldynamic__navigation",
title: "sv-title sv-question__title",
button: "sv-btn",
buttonRemove: "sv-paneldynamic__remove-btn",
buttonAdd: "sv-paneldynamic__add-btn",
progressTop: "sv-paneldynamic__progress sv-paneldynamic__progress--top",
progressBottom: "sv-paneldynamic__progress sv-paneldynamic__progress--bottom",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text",
separator: "sv-paneldynamic__separator"
},
progress: "sv-progress sv-body__progress",
progressBar: "sv-progress__bar",
progressText: "sv-progress__text",
progressTextInBar: "sv-hidden",
page: {
root: "sv-page sv-body__page",
title: "sv-page__title",
description: "sv-description sv-page__description"
},
pageTitle: "sv-title sv-page__title",
pageDescription: "sv-description sv-page__description",
row: "sv-row sv-clearfix",
question: {
mainRoot: "sv-question sv-row__question",
flowRoot: "sv-question sv-row__question sv-row__question--flow",
asCell: "sv-table__cell",
header: "sv-question__header",
headerLeft: "sv-question__header--location--left",
headerTop: "sv-question__header--location--top",
headerBottom: "sv-question__header--location--bottom",
content: "sv-question__content",
contentLeft: "sv-question__content--left",
titleLeftRoot: "",
titleOnAnswer: "sv-question__title--answer",
titleOnError: "sv-question__title--error",
title: "sv-title sv-question__title",
requiredText: "sv-question__required-text",
number: "sv-question__num",
description: "sv-description sv-question__description",
descriptionUnderInput: "sv-description sv-question__description",
comment: "sv-comment",
required: "sv-question--required",
titleRequired: "sv-question__title--required",
indent: 20,
footer: "sv-question__footer",
formGroup: "sv-question__form-group",
hasError: ""
},
error: {
root: "sv-question__erbox",
icon: "",
item: "",
locationTop: "sv-question__erbox--location--top",
locationBottom: "sv-question__erbox--location--bottom"
},
checkbox: {
root: "sv-selectbase",
item: "sv-item sv-checkbox sv-selectbase__item",
itemDisabled: "sv-item--disabled sv-checkbox--disabled",
itemChecked: "sv-checkbox--checked",
itemHover: "sv-checkbox--allowhover",
itemInline: "sv-selectbase__item--inline",
label: "sv-selectbase__label",
labelChecked: "",
itemControl: "sv-visuallyhidden sv-item__control",
itemDecorator: "sv-item__svg sv-checkbox__svg",
controlLabel: "sv-item__control-label",
materialDecorator: "sv-item__decorator sv-checkbox__decorator",
other: "sv-comment sv-question__other",
column: "sv-selectbase__column"
},
radiogroup: {
root: "sv-selectbase",
item: "sv-item sv-radio sv-selectbase__item",
itemInline: "sv-selectbase__item--inline",
label: "sv-selectbase__label",
labelChecked: "",
itemDisabled: "sv-item--disabled sv-radio--disabled",
itemChecked: "sv-radio--checked",
itemHover: "sv-radio--allowhover",
itemControl: "sv-visuallyhidden sv-item__control",
itemDecorator: "sv-item__svg sv-radio__svg",
controlLabel: "sv-item__control-label",
materialDecorator: "sv-item__decorator sv-radio__decorator",
other: "sv-comment sv-question__other",
clearButton: "sv-btn sv-selectbase__clear-btn",
column: "sv-selectbase__column"
},
boolean: {
root: "",
item: "sv-boolean sv-item",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-item--disabled sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled"
},
text: {
root: "sv-text",
small: "sv-row__question--small",
onError: "sv-text--error"
},
multipletext: {
root: "sv-multipletext",
item: "sv-multipletext__item",
itemTitle: "sv-multipletext__item-title",
row: "sv-multipletext__row",
cell: "sv-multipletext__cell"
},
dropdown: {
root: "",
small: "sv-row__question--small",
control: "sv-dropdown",
selectWrapper: "",
other: "sv-comment sv-question__other",
onError: "sv-dropdown--error"
},
imagepicker: {
root: "sv-imagepicker",
item: "sv-imagepicker__item",
itemInline: "sv-imagepicker__item--inline",
itemChecked: "sv-imagepicker__item--checked",
itemDisabled: "sv-imagepicker__item--disabled",
itemHover: "sv-imagepicker__item--allowhover",
label: "sv-imagepicker__label",
itemControl: "sv-imagepicker__control",
image: "sv-imagepicker__image",
itemText: "sv-imagepicker__text",
clearButton: "sv-btn",
other: "sv-comment sv-question__other"
},
matrix: {
tableWrapper: "sv-matrix",
root: "sv-table",
cell: "sv-table__cell sv-matrix__cell",
headerCell: "sv-table__cell sv-table__cell--header",
label: "sv-item sv-radio sv-matrix__label",
itemValue: "sv-visuallyhidden sv-item__control sv-radio__control",
itemChecked: "sv-radio--checked",
itemDisabled: "sv-item--disabled sv-radio--disabled",
itemHover: "sv-radio--allowhover",
materialDecorator: "sv-item__decorator sv-radio__decorator",
itemDecorator: "sv-item__svg sv-radio__svg",
cellText: "sv-matrix__text",
cellTextSelected: "sv-matrix__text--сhecked",
cellTextDisabled: "sv-matrix__text--disabled"
},
matrixdropdown: {
root: "sv-table",
cell: "sv-table__cell",
headerCell: "sv-table__cell sv-table__cell--header"
},
matrixdynamic: {
root: "sv-table sv-matrixdynamic",
cell: "sv-table__cell",
headerCell: "sv-table__cell sv-table__cell--header",
button: "sv-btn",
buttonAdd: "sv-matrixdynamic__add-btn",
buttonRemove: "sv-matrixdynamic__remove-btn",
iconAdd: "",
iconRemove: ""
},
rating: {
root: "sv-rating",
item: "sv-rating__item",
selected: "sv-rating__item--selected",
minText: "sv-rating__min-text",
itemText: "sv-rating__item-text",
maxText: "sv-rating__max-text",
disabled: "sv-rating--disabled"
},
comment: {
root: "sv-comment",
small: "sv-row__question--small"
},
expression: "",
file: {
root: "sv-file",
placeholderInput: "sv-visuallyhidden",
preview: "sv-file__preview",
fileSign: "sv-hidden",
fileSignBottom: "sv-file__sign",
fileDecorator: "sv-file__decorator",
fileInput: "sv-visuallyhidden",
noFileChosen: "sv-description sv-file__no-file-chosen",
chooseFile: "sv-btn sv-file__choose-btn",
disabled: "sv-file__choose-btn--disabled",
removeButton: "sv-hidden",
removeButtonBottom: "sv-btn sv-file__clean-btn",
removeFile: "sv-hidden",
removeFileSvg: "sv-file__remove-svg",
wrapper: "sv-file__wrapper"
},
saveData: {
root: "",
saving: "",
error: "",
success: "",
saveAgainButton: ""
},
window: {
root: "",
body: "",
header: {
root: "",
title: "",
button: "",
buttonExpanded: "",
buttonCollapsed: ""
}
}
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["modern"] = modernCss;
/***/ }),
/* 56 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_arabic__ = __webpack_require__(82);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localization_bulgarian__ = __webpack_require__(83);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__localization_catalan__ = __webpack_require__(84);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__localization_czech__ = __webpack_require__(85);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__localization_danish__ = __webpack_require__(86);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localization_dutch__ = __webpack_require__(87);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localization_finnish__ = __webpack_require__(88);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localization_french__ = __webpack_require__(89);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localization_georgian__ = __webpack_require__(90);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localization_german__ = __webpack_require__(91);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localization_greek__ = __webpack_require__(92);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localization_hebrew__ = __webpack_require__(93);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__localization_hungarian__ = __webpack_require__(94);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__localization_icelandic__ = __webpack_require__(95);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__localization_indonesian__ = __webpack_require__(96);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__localization_italian__ = __webpack_require__(97);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__localization_japanese__ = __webpack_require__(98);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__localization_korean__ = __webpack_require__(99);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__localization_latvian__ = __webpack_require__(100);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__localization_lithuanian__ = __webpack_require__(101);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__localization_norwegian__ = __webpack_require__(102);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__localization_persian__ = __webpack_require__(103);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__localization_polish__ = __webpack_require__(104);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__localization_portuguese__ = __webpack_require__(105);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__localization_romanian__ = __webpack_require__(106);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__localization_russian__ = __webpack_require__(107);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__localization_simplified_chinese__ = __webpack_require__(108);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__localization_spanish__ = __webpack_require__(109);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__localization_swedish__ = __webpack_require__(110);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__localization_turkish__ = __webpack_require__(112);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__localization_traditional_chinese__ = __webpack_require__(111);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__localization_ukrainian__ = __webpack_require__(113);
/***/ }),
/* 57 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss__ = __webpack_require__(76);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__main_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__modern_scss__ = __webpack_require__(77);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__modern_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__modern_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__settings__ = __webpack_require__(9);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_2__settings__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_3__helpers__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__validator__ = __webpack_require__(32);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["i"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__base__ = __webpack_require__(7);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__calculatedValue__ = __webpack_require__(78);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_7__calculatedValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__error__ = __webpack_require__(12);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localizablestring__ = __webpack_require__(16);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_9__localizablestring__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__expressionItems__ = __webpack_require__(79);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_10__expressionItems__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_10__expressionItems__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__choicesRestfull__ = __webpack_require__(39);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_11__choicesRestfull__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__functionsfactory__ = __webpack_require__(28);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_12__functionsfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_12__functionsfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__conditions__ = __webpack_require__(11);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_13__conditions__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_13__conditions__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__ = __webpack_require__(27);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__conditionsParser__ = __webpack_require__(40);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_15__conditionsParser__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__conditionProcessValue__ = __webpack_require__(15);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_16__conditionProcessValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__jsonobject__ = __webpack_require__(2);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["i"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["j"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["k"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["l"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__ = __webpack_require__(29);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__question_matrixdropdown__ = __webpack_require__(122);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrixdropdown__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrixdropdown__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__question_matrixdynamic__ = __webpack_require__(123);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_20__question_matrixdynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_20__question_matrixdynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__question_matrix__ = __webpack_require__(121);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_21__question_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_21__question_matrix__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_21__question_matrix__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__question_multipletext__ = __webpack_require__(124);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_22__question_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_22__question_multipletext__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__panel__ = __webpack_require__(23);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_23__panel__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_23__panel__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_23__panel__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__flowpanel__ = __webpack_require__(81);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_24__flowpanel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__page__ = __webpack_require__(44);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_25__page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__question__ = __webpack_require__(10);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_26__question__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__questionnonvalue__ = __webpack_require__(49);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_27__questionnonvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__question_empty__ = __webpack_require__(117);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_28__question_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__question_baseselect__ = __webpack_require__(21);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_29__question_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_29__question_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__question_checkbox__ = __webpack_require__(115);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_30__question_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__question_comment__ = __webpack_require__(116);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_31__question_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__question_dropdown__ = __webpack_require__(46);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_32__question_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__questionfactory__ = __webpack_require__(8);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_33__questionfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_33__questionfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__question_file__ = __webpack_require__(118);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_34__question_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__question_html__ = __webpack_require__(119);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_35__question_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__question_radiogroup__ = __webpack_require__(126);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_36__question_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__question_rating__ = __webpack_require__(127);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_37__question_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__question_expression__ = __webpack_require__(47);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_38__question_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__question_text__ = __webpack_require__(48);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_39__question_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__question_boolean__ = __webpack_require__(114);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_40__question_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__question_imagepicker__ = __webpack_require__(120);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_41__question_imagepicker__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__question_paneldynamic__ = __webpack_require__(125);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_35", function() { return __WEBPACK_IMPORTED_MODULE_42__question_paneldynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_36", function() { return __WEBPACK_IMPORTED_MODULE_42__question_paneldynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__surveytimer__ = __webpack_require__(52);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_37", function() { return __WEBPACK_IMPORTED_MODULE_43__surveytimer__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__survey__ = __webpack_require__(31);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_38", function() { return __WEBPACK_IMPORTED_MODULE_44__survey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__trigger__ = __webpack_require__(129);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_39", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_40", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_41", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_42", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_43", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_44", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_45", function() { return __WEBPACK_IMPORTED_MODULE_45__trigger__["g"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__surveyWindow__ = __webpack_require__(51);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_46", function() { return __WEBPACK_IMPORTED_MODULE_46__surveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__textPreProcessor__ = __webpack_require__(22);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_47", function() { return __WEBPACK_IMPORTED_MODULE_47__textPreProcessor__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__dxSurveyService__ = __webpack_require__(41);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_48", function() { return __WEBPACK_IMPORTED_MODULE_48__dxSurveyService__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__localization_english__ = __webpack_require__(42);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_49", function() { return __WEBPACK_IMPORTED_MODULE_49__localization_english__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__surveyStrings__ = __webpack_require__(1);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_50", function() { return __WEBPACK_IMPORTED_MODULE_50__surveyStrings__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_51", function() { return __WEBPACK_IMPORTED_MODULE_50__surveyStrings__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_51__questionCustomWidgets__ = __webpack_require__(45);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_52", function() { return __WEBPACK_IMPORTED_MODULE_51__questionCustomWidgets__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_53", function() { return __WEBPACK_IMPORTED_MODULE_51__questionCustomWidgets__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_52__stylesmanager__ = __webpack_require__(30);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_54", function() { return __WEBPACK_IMPORTED_MODULE_52__stylesmanager__["a"]; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Version; });
// styles
var Version;
Version = "" + "1.1.32";
// export { cultureInfo } from "../../cultureInfo";
//Uncomment to include the "date" question type.
//export {default as QuestionDateModel} from "../../plugins/question_date";
/***/ }),
/* 58 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestion__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__element_factory__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__panel__ = __webpack_require__(24);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyFlowPanel; });
var SurveyFlowPanel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyFlowPanel, _super);
function SurveyFlowPanel(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyFlowPanel.prototype, "flowPanel", {
get: function () {
return this.panel;
},
enumerable: true,
configurable: true
});
SurveyFlowPanel.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (!!this.flowPanel) {
var self = this;
this.flowPanel.onCustomHtmlProducing = function () {
return "";
};
this.flowPanel.onGetHtmlForQuestion = self.renderQuestion;
}
};
SurveyFlowPanel.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (!!this.flowPanel) {
this.flowPanel.onCustomHtmlProducing = null;
this.flowPanel.onGetHtmlForQuestion = null;
}
};
SurveyFlowPanel.prototype.getQuestion = function (name) {
return this.flowPanel.getQuestionByName(name);
};
SurveyFlowPanel.prototype.renderQuestion = function (question) {
return "" + question.name + "";
};
SurveyFlowPanel.prototype.renderRows = function () {
return [this.renderHtml()];
};
SurveyFlowPanel.prototype.getNodeIndex = function () {
return this.renderedIndex++;
};
SurveyFlowPanel.prototype.renderHtml = function () {
if (!this.flowPanel)
return null;
var html = "" + this.flowPanel.produceHtml() + "";
if (!DOMParser) {
var htmlValue = { __html: html };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue });
}
var doc = new DOMParser().parseFromString(html, "text/xml");
this.renderedIndex = 0;
return this.renderParentNode(doc);
};
SurveyFlowPanel.prototype.renderNodes = function (domNodes) {
var nodes = [];
for (var i = 0; i < domNodes.length; i++) {
nodes.push(this.renderNode(domNodes[i]));
}
return nodes;
};
SurveyFlowPanel.prototype.getStyle = function (nodeType) {
var style = {};
if (nodeType.toLowerCase() === "b") {
style.fontWeight = "bold";
}
if (nodeType.toLowerCase() === "i") {
style.fontStyle = "italic";
}
if (nodeType.toLowerCase() === "u") {
style.textDecoration = "underline";
}
return style;
};
SurveyFlowPanel.prototype.renderParentNode = function (node) {
var nodeType = node.nodeName.toLowerCase();
var children = this.renderNodes(this.getChildDomNodes(node));
if (nodeType == "div")
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: this.getNodeIndex() }, children);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: this.getNodeIndex(), style: this.getStyle(nodeType) }, children));
};
SurveyFlowPanel.prototype.renderNode = function (node) {
if (!this.hasTextChildNodesOnly(node)) {
return this.renderParentNode(node);
}
var nodeType = node.nodeName.toLowerCase();
if (nodeType === "question") {
var question = this.flowPanel.getQuestionByName(node.textContent);
if (!question)
return null;
var questionBody = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_2__reactquestion__["a" /* SurveyQuestion */], { key: question.name, element: question, creator: this.creator, css: this.css }));
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: this.getNodeIndex() }, questionBody);
}
if (nodeType === "div") {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: this.getNodeIndex() }, node.textContent);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: this.getNodeIndex(), style: this.getStyle(nodeType) }, node.textContent));
};
SurveyFlowPanel.prototype.getChildDomNodes = function (node) {
var domNodes = [];
for (var i = 0; i < node.childNodes.length; i++) {
domNodes.push(node.childNodes[i]);
}
return domNodes;
};
SurveyFlowPanel.prototype.hasTextChildNodesOnly = function (node) {
var nodes = node.childNodes;
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].nodeName.toLowerCase() !== "#text")
return false;
}
return true;
};
SurveyFlowPanel.prototype.renderContent = function (style, rows) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("f-panel", { style: style }, rows);
};
return SurveyFlowPanel;
}(__WEBPACK_IMPORTED_MODULE_4__panel__["a" /* SurveyPanel */]));
__WEBPACK_IMPORTED_MODULE_3__element_factory__["a" /* ReactElementFactory */].Instance.registerElement("flowpanel", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyFlowPanel, props);
});
/***/ }),
/* 59 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionImagePicker; });
var SurveyQuestionImagePicker = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionImagePicker, _super);
function SurveyQuestionImagePicker(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionImagePicker.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionImagePicker.prototype.handleOnChange = function (event) {
if (this.question.multiSelect) {
if (event.target.checked) {
this.question.value = this.question.value.concat(event.target.value);
}
else {
var currValue = this.question.value;
currValue.splice(this.question.value.indexOf(event.target.value), 1);
this.question.value = currValue;
}
}
else {
this.question.value = event.target.value;
}
this.setState({ value: this.question.value });
};
SurveyQuestionImagePicker.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
this.getItems(cssClasses)));
};
SurveyQuestionImagePicker.prototype.getItems = function (cssClasses) {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i === 0, cssClasses));
}
return items;
};
Object.defineProperty(SurveyQuestionImagePicker.prototype, "textStyle", {
get: function () {
return { marginLeft: "3px", display: "inline", position: "static" };
},
enumerable: true,
configurable: true
});
SurveyQuestionImagePicker.prototype.renderItem = function (key, item, isFirst, cssClasses) {
var isChecked = this.question.isItemSelected(item);
var isDisabled = this.question.isReadOnly || !item.isEnabled;
return this.renderElement(key, item, isChecked, isDisabled, isFirst, cssClasses);
};
SurveyQuestionImagePicker.prototype.getItemClass = function (isChecked, isDisabled) {
var cssClasses = this.question.cssClasses;
var colCount = this.question.colCount;
var itemClass = cssClasses.item +
(colCount === 0 ? " " + cssClasses.itemInline : " sv-q-col-" + colCount);
var allowHover = !isChecked && !isDisabled;
if (isChecked) {
itemClass += " " + cssClasses.itemChecked;
}
if (isDisabled) {
itemClass += " " + cssClasses.itemDisabled;
}
if (allowHover) {
itemClass += " " + cssClasses.itemHover;
}
return itemClass;
};
SurveyQuestionImagePicker.prototype.renderElement = function (key, item, isChecked, isDisabled, isFirst, cssClasses) {
var id = isFirst ? this.question.inputId : null;
var itemClass = this.getItemClass(isChecked, isDisabled);
var text = null;
if (this.question.showLabel) {
text = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { title: item.text || item.value, className: this.question.cssClasses.itemText }, item.text || item.value));
}
var style = { objectFit: this.question.imageFit };
var control = null;
if (this.question.contentMode === "image") {
control = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { className: cssClasses.image, src: item["imageLink"], width: this.question.imageWidth
? this.question.imageWidth + "px"
: undefined, height: this.question.imageHeight
? this.question.imageHeight + "px"
: undefined, alt: item.text || item.value, style: style }));
}
if (this.question.contentMode === "video") {
control = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("embed", { className: cssClasses.image, src: item["imageLink"], width: this.question.imageWidth
? this.question.imageWidth + "px"
: undefined, height: this.question.imageHeight
? this.question.imageHeight + "px"
: undefined, style: style }));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: key, className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: cssClasses.label },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { style: { display: "none" }, className: cssClasses.itemControl, id: id, type: this.question.multiSelect ? "checkbox" : "radio", name: this.question.name + "_" + this.questionBase.id, checked: isChecked, value: item.value, disabled: this.isDisplayMode || !item.isEnabled, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
control,
text))));
};
return SurveyQuestionImagePicker;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("imagepicker", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionImagePicker, props);
});
/***/ }),
/* 60 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurvey__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindow; });
var SurveyWindow = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyWindow, _super);
function SurveyWindow(props) {
var _this = _super.call(this, props) || this;
_this.handleOnExpanded = _this.handleOnExpanded.bind(_this);
return _this;
}
SurveyWindow.prototype.getStateElement = function () {
return this.window;
};
SurveyWindow.prototype.handleOnExpanded = function (event) {
this.window.isExpanded = !this.window.isExpanded;
};
SurveyWindow.prototype.render = function () {
if (!this.window.isShowing)
return null;
var header = this.renderHeader();
var body = this.window.isExpanded ? this.renderBody() : null;
var style = {
position: "fixed",
bottom: 3,
right: 10,
maxWidth: "60%"
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.root, style: style },
header,
body));
};
SurveyWindow.prototype.renderHeader = function () {
var styleA = { width: "100%", cursor: "pointer" };
var styleTitle = { paddingRight: "10px" };
var glyphClassName = this.window.isExpanded
? this.css.window.header.buttonCollapsed
: this.css.window.header.buttonExpanded;
glyphClassName = "glyphicon pull-right " + glyphClassName;
var title = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locTitle);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.header.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { onClick: this.handleOnExpanded, style: styleA },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.window.header.title, style: styleTitle }, title),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: glyphClassName, "aria-hidden": "true" })),
this.window.isExpanded ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { onClick: this.handleOnExpanded, style: { float: "right", cursor: "pointer" } },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.window.header.title, style: styleTitle }, "X"))) : null));
};
SurveyWindow.prototype.renderBody = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.body }, this.doRender());
};
SurveyWindow.prototype.createSurvey = function (newProps) {
if (!newProps)
newProps = {};
_super.prototype.createSurvey.call(this, newProps);
this.window = new __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__["b" /* ReactWindowModel */](null, this.survey);
if (newProps.closeOnCompleteTimeout) {
this.window.closeOnCompleteTimeout = newProps.closeOnCompleteTimeout;
}
this.window.isShowing = true;
if (!this.window.isExpanded && (newProps.expanded || newProps.isExpanded))
this.window.expand();
var self = this;
this.window.closeWindowOnCompleteCallback = function () {
self.window.hide();
};
};
return SurveyWindow;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurvey__["a" /* Survey */]));
/***/ }),
/* 61 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionBoolean; });
var SurveyQuestionBoolean = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionBoolean, _super);
function SurveyQuestionBoolean(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionBoolean.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionBoolean.prototype.handleOnChange = function (event) {
this.question.checkedValue = event.target.checked;
this.setState({ value: this.question.checkedValue });
};
SurveyQuestionBoolean.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.updateIndeterminate();
};
SurveyQuestionBoolean.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
this.updateIndeterminate();
};
SurveyQuestionBoolean.prototype.updateIndeterminate = function () {
if (!this.question)
return;
var el = this.refs["check"];
if (el) {
el["indeterminate"] = this.question.isIndeterminate;
}
};
SurveyQuestionBoolean.prototype.getItemClass = function () {
var cssClasses = this.question.cssClasses;
var isChecked = this.question.checkedValue;
var isDisabled = this.question.isReadOnly;
var itemClass = cssClasses.item;
if (isDisabled)
itemClass += " " + cssClasses.itemDisabled;
if (isChecked)
itemClass += " " + cssClasses.itemChecked;
else if (isChecked === null)
itemClass += " " + cssClasses.itemIndeterminate;
return itemClass;
};
SurveyQuestionBoolean.prototype.getLabelClass = function (checked) {
var question = this.question;
var cssClasses = this.question.cssClasses;
return (cssClasses.label +
" " +
(question.checkedValue === !checked || question.isReadOnly
? question.cssClasses.disabledLabel
: ""));
};
SurveyQuestionBoolean.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var itemClass = this.getItemClass();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { ref: "check", type: "checkbox", value: this.question.checkedValue === null
? ""
: this.question.checkedValue, id: this.question.inputId, className: cssClasses.control, disabled: this.isDisplayMode, checked: this.question.checkedValue || false, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.getLabelClass(false) }, this.question.locLabelFalse.renderedHtml),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.switch },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.slider })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.getLabelClass(true) }, this.question.locLabelTrue.renderedHtml))));
};
return SurveyQuestionBoolean;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("boolean", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionBoolean, props);
});
/***/ }),
/* 62 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCheckbox; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionCheckboxItem; });
var SurveyQuestionCheckbox = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCheckbox, _super);
function SurveyQuestionCheckbox(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionCheckbox.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
this.question.hasColumns
? this.getColumns(cssClasses)
: this.getItems(cssClasses)));
};
SurveyQuestionCheckbox.prototype.getColumns = function (cssClasses) {
var _this = this;
return this.question.columns.map(function (column, ci) {
var items = column.map(function (item, ii) {
return _this.renderItem("item" + ii, item, ci === 0 && ii === 0, cssClasses, "" + ci + ii);
});
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: "column" + ci, className: _this.question.getColumnClass() }, items));
});
};
SurveyQuestionCheckbox.prototype.getItems = function (cssClasses) {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i == 0, cssClasses, "" + i));
}
return items;
};
Object.defineProperty(SurveyQuestionCheckbox.prototype, "textStyle", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.renderItem = function (key, item, isFirst, cssClasses, index) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCheckboxItem, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, item: item, textStyle: this.textStyle, isFirst: isFirst, index: index }));
};
return SurveyQuestionCheckbox;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionCheckboxItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCheckboxItem, _super);
function SurveyQuestionCheckboxItem(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.selectAllChanged = _this.selectAllChanged.bind(_this);
return _this;
}
SurveyQuestionCheckboxItem.prototype.getStateElement = function () {
return this.item;
};
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "item", {
get: function () {
return this.props.item;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "textStyle", {
get: function () {
return this.props.textStyle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "isFirst", {
get: function () {
return this.props.isFirst;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "index", {
get: function () {
return this.props.index;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckboxItem.prototype.shouldComponentUpdate = function () {
return (!this.question.customWidget ||
!!this.question.customWidgetData.isNeedRender ||
!!this.question.customWidget.widgetJson.isDefaultRender ||
!!this.question.customWidget.widgetJson.render);
};
SurveyQuestionCheckboxItem.prototype.handleOnChange = function (event) {
var newValue = [].concat(this.question.renderedValue || []);
var index = newValue.indexOf(this.item.value);
if (event.target.checked) {
if (index < 0) {
newValue.push(this.item.value);
}
}
else {
if (index > -1) {
newValue.splice(index, 1);
}
}
this.question.renderedValue = newValue;
};
SurveyQuestionCheckboxItem.prototype.selectAllChanged = function (event) {
this.question.toggleSelectAll();
};
SurveyQuestionCheckboxItem.prototype.render = function () {
if (!this.item || !this.question)
return null;
var isChecked = this.question.isItemSelected(this.item);
var isDisabled = this.question.isReadOnly || !this.item.isEnabled;
var otherItem = this.item.value === this.question.otherItem.value && isChecked
? this.renderOther()
: null;
return this.renderCheckbox(isChecked, isDisabled, otherItem);
};
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "inputStyle", {
get: function () {
return { marginRight: "3px" };
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckboxItem.prototype.getItemClass = function (isChecked, isDisabled) {
var cssClasses = this.question.cssClasses;
var allowHover = !isChecked && !isDisabled;
var itemClass = cssClasses.item;
if (isDisabled)
itemClass += " " + cssClasses.itemDisabled;
if (isChecked)
itemClass += " " + cssClasses.itemChecked;
if (allowHover)
itemClass += " " + cssClasses.itemHover;
if (!this.question.hasColumns) {
itemClass +=
this.question.colCount === 0
? " " + this.cssClasses.itemInline
: " sv-q-col-" + this.question.colCount;
}
return itemClass;
};
SurveyQuestionCheckboxItem.prototype.renderCheckbox = function (isChecked, isDisabled, otherItem) {
var id = this.question.inputId + "_" + this.index;
var text = this.renderLocString(this.item.locText);
var itemClass = this.getItemClass(isChecked, isDisabled);
var labelClass = this.question.getLabelClass(isChecked);
var onItemChanged = this.item == this.question.selectAllItem
? this.selectAllChanged
: this.handleOnChange;
var locText = this.item.locText;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: labelClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.cssClasses.itemControl, type: "checkbox", value: this.item.value, id: id, style: this.inputStyle, disabled: this.isDisplayMode || !this.item.isEnabled, checked: isChecked, onChange: onItemChanged, "aria-required": this.question.isRequired, "aria-label": locText.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.materialDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { viewBox: "0 0 24 24", className: this.cssClasses.itemDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("path", { d: "M5,13l2-2l3,3l7-7l2,2l-9,9L5,13z" })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.controlLabel, title: locText["koRenderedHtml"] }, text)),
otherItem));
};
SurveyQuestionCheckboxItem.prototype.renderOther = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "form-group" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: this.cssClasses.other, cssClasses: this.cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionCheckboxItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("checkbox", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCheckbox, props);
});
/***/ }),
/* 63 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionDropdown; });
/* unused harmony export SurveyQuestionOptionItem */
var SurveyQuestionDropdown = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionDropdown, _super);
function SurveyQuestionDropdown(props) {
return _super.call(this, props) || this;
}
SurveyQuestionDropdown.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var comment = this.question.isOtherSelected
? this.renderOther(cssClasses)
: null;
var select = this.renderSelect(cssClasses);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
select,
comment));
};
SurveyQuestionDropdown.prototype.renderSelect = function (cssClasses) {
var _this = this;
if (this.isDisplayMode) {
var isOtherSelected = this.question.isOtherSelected;
return (
// @ts-ignore
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.control, disabled: true }, isOtherSelected
? this.question.otherText
: this.question.displayValue));
}
var options = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
var option = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionOptionItem, { key: key, item: item });
options.push(option);
}
var captionOption = this.question.showOptionsCaption ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("option", { value: "" }, this.question.optionsCaption)) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.selectWrapper },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("select", { id: this.question.inputId, className: cssClasses.control, ref: function (select) { return (_this.control = select); }, onChange: this.updateValueOnEvent, onInput: this.updateValueOnEvent, "aria-label": this.question.locTitle.renderedHtml },
captionOption,
options)));
};
SurveyQuestionDropdown.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "form-group" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: cssClasses.other, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionDropdown;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* SurveyQuestionUncontrolledElement */]));
var SurveyQuestionOptionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionOptionItem, _super);
function SurveyQuestionOptionItem(props) {
return _super.call(this, props) || this;
}
SurveyQuestionOptionItem.prototype.getStateElement = function () {
return this.item;
};
Object.defineProperty(SurveyQuestionOptionItem.prototype, "item", {
get: function () {
return this.props.item;
},
enumerable: true,
configurable: true
});
SurveyQuestionOptionItem.prototype.render = function () {
if (!this.item)
return;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("option", { value: this.item.value, disabled: !this.item.isEnabled }, this.item.text));
};
return SurveyQuestionOptionItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("dropdown", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionDropdown, props);
});
/***/ }),
/* 64 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionEmpty; });
var SurveyQuestionEmpty = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionEmpty, _super);
function SurveyQuestionEmpty(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.question.value };
return _this;
}
Object.defineProperty(SurveyQuestionEmpty.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionEmpty.prototype.render = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null);
};
return SurveyQuestionEmpty;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("empty", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionEmpty, props);
});
/***/ }),
/* 65 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionExpression; });
var SurveyQuestionExpression = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionExpression, _super);
function SurveyQuestionExpression(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionExpression.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionExpression.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.root }, this.question.displayValue));
};
return SurveyQuestionExpression;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("expression", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionExpression, props);
});
/***/ }),
/* 66 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils_utils__ = __webpack_require__(130);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionFile; });
var SurveyQuestionFile = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionFile, _super);
function SurveyQuestionFile(props) {
var _this = _super.call(this, props) || this;
_this.handleOnDragOver = function (event) {
event.preventDefault();
};
_this.handleOnDrop = function (event) {
event.preventDefault();
var src = event.dataTransfer;
_this.onChange(src);
};
_this.handleOnChange = function (event) {
var src = event.target || event.srcElement;
_this.onChange(src);
};
_this.handleOnClean = function (event) {
var question = _this.question;
var src = event.target || event.srcElement;
if (question.needConfirmRemoveFile) {
var isConfirmed = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__utils_utils__["a" /* confirmAction */])(question.confirmRemoveAllMessage);
if (!isConfirmed)
return;
}
question.clear();
src.parentElement.querySelectorAll("input")[0].value = "";
_this.setState({ fileLoaded: _this.state.fileLoaded + 1 });
};
_this.handleOnRemoveFile = function (event) {
var question = _this.question;
if (question.needConfirmRemoveFile) {
var isConfirmed = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__utils_utils__["a" /* confirmAction */])(question.getConfirmRemoveMessage(event.name));
if (!isConfirmed)
return;
}
question.removeFile(event);
_this.setState({ fileLoaded: _this.state.fileLoaded + 1 });
};
_this.onChange = function (src) {
if (!window["FileReader"])
return;
if (!src || !src.files || src.files.length < 1)
return;
var files = [];
var allowCount = _this.question.allowMultiple ? src.files.length : 1;
for (var i = 0; i < allowCount; i++) {
files.push(src.files[i]);
}
src.value = "";
_this.question.loadFiles(files);
_this.setState({ fileLoaded: _this.state.fileLoaded + 1 });
};
_this.state = {
fileLoaded: 0,
state: "empty",
rootClass: _this.question.cssClasses.root
};
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.question.onStateChanged.add(function (state) {
return _this.setState({ fileLoaded: _this.state.fileLoaded + 1, state: state });
});
return _this;
}
Object.defineProperty(SurveyQuestionFile.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionFile.prototype.render = function () {
if (!this.question)
return null;
var preview = this.renderPreview();
var fileInput = null;
var fileDecorator = this.renderFileDecorator();
var clearButton = this.renderClearButton(this.question.cssClasses.removeButton);
var clearButtonBottom = this.renderClearButton(this.question.cssClasses.removeButtonBottom);
fileInput = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { disabled: this.isDisplayMode, className: this.question.cssClasses.fileInput, id: this.question.inputId, type: "file", onChange: !this.isDisplayMode ? this.handleOnChange : null, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml, multiple: this.question.allowMultiple, title: this.question.inputTitle, accept: this.question.acceptedTypes }));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.state.rootClass },
fileInput,
fileDecorator,
clearButton,
preview,
clearButtonBottom));
};
SurveyQuestionFile.prototype.renderFileDecorator = function () {
var noFileChosen = null;
var chooseFile = null;
var chooseFileCss = this.question.cssClasses.chooseFile +
(this.isDisplayMode ? " " + this.question.cssClasses.disabled : "");
chooseFile = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: chooseFileCss, htmlFor: this.question.inputId }, this.question.chooseButtonCaption));
if (this.question.isEmpty()) {
noFileChosen = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.question.cssClasses.noFileChosen }, this.question.noFileChosenCaption));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.fileDecorator, onDrop: this.handleOnDrop, onDragOver: this.handleOnDragOver },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.wrapper },
chooseFile,
noFileChosen)));
};
SurveyQuestionFile.prototype.renderClearButton = function (className) {
return !this.question.isEmpty() && !this.isDisplayMode ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { type: "button", onClick: this.handleOnClean, className: className }, this.question.cleanButtonCaption)) : null;
};
SurveyQuestionFile.prototype.renderPreview = function () {
var _this = this;
if (!this.question.previewValue)
return null;
var previews = this.question.previewValue.map(function (val, index) {
if (!val)
return null;
var fileSign = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("a", { href: val.content, title: val.name, download: val.name, style: { width: _this.question.imageWidth + "px" } }, val.name));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: _this.question.inputId + "_" + index, className: _this.question.cssClasses.preview },
val.name ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: _this.question.cssClasses.fileSign }, fileSign)) : null,
_this.question.canPreviewImage(val) ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { src: val.content, height: _this.question.imageHeight, width: _this.question.imageWidth, alt: "File preview" })) : null,
val.name && !_this.question.isReadOnly ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: _this.question.cssClasses.removeFile, onClick: function (event) { return _this.handleOnRemoveFile(val); } }, _this.question.removeFileCaption),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { className: _this.question.cssClasses.removeFileSvg, onClick: function (event) { return _this.handleOnRemoveFile(val); }, viewBox: "0 0 16 16" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("path", { d: "M8,2C4.7,2,2,4.7,2,8s2.7,6,6,6s6-2.7,6-6S11.3,2,8,2z M11,10l-1,1L8,9l-2,2l-1-1l2-2L5,6l1-1l2,2l2-2l1,1L9,8 L11,10z" })))) : null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: _this.question.cssClasses.fileSignBottom }, fileSign)));
});
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, previews);
};
return SurveyQuestionFile;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("file", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionFile, props);
});
/***/ }),
/* 67 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionHtml; });
var SurveyQuestionHtml = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionHtml, _super);
function SurveyQuestionHtml(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionHtml.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionHtml.prototype.render = function () {
if (!this.question || !this.question.html)
return null;
var htmlValue = { __html: this.question.locHtml.renderedHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.root, dangerouslySetInnerHTML: htmlValue }));
};
return SurveyQuestionHtml;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("html", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionHtml, props);
});
/***/ }),
/* 68 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrix; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixRow; });
var SurveyQuestionMatrix = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrix, _super);
function SurveyQuestionMatrix(props) {
var _this = _super.call(this, props) || this;
_this.state = { rowsChanged: 0 };
return _this;
}
Object.defineProperty(SurveyQuestionMatrix.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrix.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (this.question) {
var self = this;
this.question.visibleRowsChangedCallback = function () {
self.setState({ rowsChanged: self.state.rowsChanged + 1 });
};
}
};
SurveyQuestionMatrix.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.question) {
this.question.visibleRowsChangedCallback = null;
}
};
SurveyQuestionMatrix.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var firstTH = this.question.hasRows ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
var headers = [];
for (var i = 0; i < this.question.visibleColumns.length; i++) {
var column = this.question.visibleColumns[i];
var key = "column" + i;
var columText = this.renderLocString(column.locText);
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { className: this.question.cssClasses.headerCell, key: key }, columText));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
var key = "row" + i;
rows.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixRow, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, row: row, isFirst: i == 0 }));
}
var header = !this.question.showHeader ? null : (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
firstTH,
headers)));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.tableWrapper },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
header,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows)))));
};
return SurveyQuestionMatrix;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixRow = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixRow, _super);
function SurveyQuestionMatrixRow(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionMatrixRow.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionMatrixRow.prototype, "row", {
get: function () {
return this.props.row;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixRow.prototype.handleOnChange = function (event) {
this.row.value = event.target.value;
this.setState({ value: this.row.value });
};
SurveyQuestionMatrixRow.prototype.render = function () {
if (!this.row)
return null;
var firstTD = null;
if (this.question.hasRows) {
var rowText = this.renderLocString(this.row.locText);
firstTD = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { className: this.question.cssClasses.cell }, rowText);
}
var tds = this.generateTds();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
firstTD,
tds));
};
SurveyQuestionMatrixRow.prototype.generateTds = function () {
var _this = this;
var tds = [];
var row = this.row;
for (var i = 0; i < this.question.visibleColumns.length; i++) {
var td = null;
var column = this.question.visibleColumns[i];
var key = "value" + i;
var isChecked = row.value == column.value;
var itemClass = this.getItemClass(row, column);
var inputId = this.question.inputId + "_" + row.name + "_" + i;
if (this.question.hasCellText) {
var getHandler = !this.question.isReadOnly
? function (column) { return function () { return _this.cellClick(row, column); }; }
: null;
td = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: key, className: itemClass + " " + this.question.cssClasses.cell, onClick: getHandler ? getHandler(column) : null }, this.renderLocString(this.question.getCellDisplayLocText(row.name, column))));
}
else {
td = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: key, headers: column.locText.renderedHtml, className: this.question.cssClasses.cell },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: inputId, type: "radio", className: this.cssClasses.itemValue, name: row.fullName, value: column.value, disabled: this.isDisplayMode, checked: isChecked, onChange: this.handleOnChange, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.question.cssClasses.materialDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { className: this.question.cssClasses.itemDecorator, viewBox: "-12 -12 24 24" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("circle", { r: "6", cx: "0", cy: "0" }),
"s")),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "circle" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: { display: "none" } }, this.question.locTitle.renderedHtml))));
}
tds.push(td);
}
return tds;
};
SurveyQuestionMatrixRow.prototype.getItemClass = function (row, column) {
var question = this.question;
var cssClasses = this.question.cssClasses;
var isChecked = row.value == column.value;
var isDisabled = question.isReadOnly;
var allowHover = !isChecked && !isDisabled;
var cellDisabledClass = question.hasCellText
? cssClasses.cellTextDisabled
: cssClasses.itemDisabled;
var cellSelectedClass = question.hasCellText
? cssClasses.cellTextSelected
: cssClasses.itemChecked;
var itemHoverClass = !question.hasCellText ? cssClasses.itemHover : "";
var cellClass = question.hasCellText
? cssClasses.cellText
: cssClasses.label;
var itemClass = cellClass +
(isChecked ? " " + cellSelectedClass : "") +
(isDisabled ? " " + cellDisabledClass : "") +
(allowHover ? " " + itemHoverClass : "");
return itemClass;
};
SurveyQuestionMatrixRow.prototype.cellClick = function (row, column) {
row.value = column.value;
};
return SurveyQuestionMatrixRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrix", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrix, props);
});
/***/ }),
/* 69 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionmatrixdropdownbase__ = __webpack_require__(26);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDropdown; });
var SurveyQuestionMatrixDropdown = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDropdown, _super);
function SurveyQuestionMatrixDropdown(props) {
return _super.call(this, props) || this;
}
return SurveyQuestionMatrixDropdown;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionmatrixdropdownbase__["b" /* SurveyQuestionMatrixDropdownBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrixdropdown", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdown, props);
});
/***/ }),
/* 70 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionmatrixdropdownbase__ = __webpack_require__(26);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDynamic; });
/* unused harmony export SurveyQuestionMatrixDynamicRemoveButton */
var SurveyQuestionMatrixDynamic = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDynamic, _super);
function SurveyQuestionMatrixDynamic(props) {
var _this = _super.call(this, props) || this;
_this.handleOnRowAddClick = _this.handleOnRowAddClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDynamic.prototype, "matrix", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDynamic.prototype.handleOnRowAddClick = function (event) {
this.matrix.addRow();
};
SurveyQuestionMatrixDynamic.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var mainDiv = this.renderTableDiv();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "matrixDynamicRef" },
this.renderAddRowButtonOnTop(cssClasses),
mainDiv,
this.renderAddRowButtonOnBottom(cssClasses)));
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButtonOnTop = function (cssClasses) {
if (!this.matrix.isAddRowOnTop)
return null;
return this.renderAddRowButton(cssClasses);
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButtonOnBottom = function (cssClasses) {
if (!this.matrix.isAddRowOnBottom)
return null;
return this.renderAddRowButton(cssClasses);
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButton = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.footer },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { className: cssClasses.button + " " + cssClasses.buttonAdd, type: "button", onClick: this.handleOnRowAddClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.matrix.addRowText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.iconAdd }))));
};
SurveyQuestionMatrixDynamic.prototype.renderRemoveButton = function (row) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDynamicRemoveButton, { question: this.question, row: row, cssClasses: this.question.cssClasses }));
};
return SurveyQuestionMatrixDynamic;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionmatrixdropdownbase__["b" /* SurveyQuestionMatrixDropdownBase */]));
var SurveyQuestionMatrixDynamicRemoveButton = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDynamicRemoveButton, _super);
function SurveyQuestionMatrixDynamicRemoveButton(props) {
var _this = _super.call(this, props) || this;
_this.handleOnRowRemoveClick = _this.handleOnRowRemoveClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDynamicRemoveButton.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionMatrixDynamicRemoveButton.prototype, "row", {
get: function () {
return this.props.row;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDynamicRemoveButton.prototype.handleOnRowRemoveClick = function (event) {
this.question.removeRowUI(this.row);
};
SurveyQuestionMatrixDynamicRemoveButton.prototype.render = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { className: this.cssClasses.button + " " + this.cssClasses.buttonRemove, type: "button", onClick: this.handleOnRowRemoveClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.question.removeRowText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.iconRemove })));
};
return SurveyQuestionMatrixDynamicRemoveButton;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrixdynamic", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDynamic, props);
});
/***/ }),
/* 71 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestion__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMultipleText; });
var SurveyQuestionMultipleText = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMultipleText, _super);
function SurveyQuestionMultipleText(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionMultipleText.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMultipleText.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var tableRows = this.question.getRows();
var rows = [];
for (var i = 0; i < tableRows.length; i++) {
rows.push(this.renderRow(i, tableRows[i], cssClasses));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows)));
};
SurveyQuestionMultipleText.prototype.renderRow = function (rowIndex, items, cssClasses) {
var key = "item" + rowIndex;
var tds = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
var itemTitle = this.renderLocString(item.locTitle);
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: "label" + i, className: cssClasses.cell },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.itemTitle }, itemTitle)));
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestion__["c" /* SurveyQuestionAndErrorsCell */], { key: "value" + i, cssClasses: cssClasses, question: item.editor, creator: this.creator }));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", { key: key, className: cssClasses.row }, tds));
};
return SurveyQuestionMultipleText;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("multipletext", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMultipleText, props);
});
/***/ }),
/* 72 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionPanelDynamic; });
/* unused harmony export SurveyQuestionPanelDynamicItem */
var SurveyQuestionPanelDynamic = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionPanelDynamic, _super);
function SurveyQuestionPanelDynamic(props) {
var _this = _super.call(this, props) || this;
_this.handleOnPanelAddClick = _this.handleOnPanelAddClick.bind(_this);
_this.handleOnPanelPrevClick = _this.handleOnPanelPrevClick.bind(_this);
_this.handleOnPanelNextClick = _this.handleOnPanelNextClick.bind(_this);
_this.handleOnRangeChange = _this.handleOnRangeChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionPanelDynamic.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionPanelDynamic.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.setState({ panelCounter: 0 });
var self = this;
this.question.panelCountChangedCallback = function () {
self.updateQuestionRendering();
};
this.question.currentIndexChangedCallback = function () {
self.updateQuestionRendering();
};
this.question.renderModeChangedCallback = function () {
self.updateQuestionRendering();
};
};
SurveyQuestionPanelDynamic.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
this.question.panelCountChangedCallback = null;
this.question.currentIndexChangedCallback = null;
this.question.renderModeChangedCallback = null;
};
SurveyQuestionPanelDynamic.prototype.updateQuestionRendering = function () {
this.setState({
panelCounter: this.state ? this.state.panelCounter + 1 : 1
});
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelAddClick = function (event) {
this.question.addPanelUI();
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelPrevClick = function (event) {
this.question.goToPrevPanel();
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelNextClick = function (event) {
this.question.goToNextPanel();
};
SurveyQuestionPanelDynamic.prototype.handleOnRangeChange = function (event) {
this.question.currentIndex = event.target.value;
};
SurveyQuestionPanelDynamic.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var panels = [];
if (this.question.isRenderModeList) {
for (var i = 0; i < this.question.panels.length; i++) {
var panel = this.question.panels[i];
panels.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamicItem, { key: panel.id, element: panel, question: this.question, index: i, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
}
else {
if (this.question.currentPanel != null) {
var panel = this.question.currentPanel;
panels.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamicItem, { key: this.question.currentIndex, element: panel, question: this.question, index: this.question.currentIndex, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
}
var btnDeleteTD = !this.isDisplayMode ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
var btnAdd = this.question.isRenderModeList
? this.renderAddRowButton()
: null;
var navTop = this.question.isProgressTopShowing
? this.renderNavigator(cssClasses)
: null;
var navBottom = this.question.isProgressBottomShowing
? this.renderNavigator(cssClasses)
: null;
var style = {};
if (this.question.horizontalScroll) {
style["overflowX"] = "scroll";
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
navTop,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: style }, panels),
navBottom,
btnAdd));
};
SurveyQuestionPanelDynamic.prototype.renderNavigator = function (cssClasses) {
var range = this.question.isRangeShowing ? this.renderRange() : null;
var btnPrev = this.rendrerPrevButton();
var btnNext = this.rendrerNextButton();
var btnAdd = this.renderAddRowButton();
var progressClass = this.question.isProgressTopShowing
? this.question.cssClasses.progressTop
: this.question.cssClasses.progressBottom;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: { clear: "both" }, className: progressClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progressContainer },
btnPrev,
range,
btnNext),
btnAdd,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progressText }, this.question.progressText)));
};
SurveyQuestionPanelDynamic.prototype.rendrerPrevButton = function () {
var getButtonPrevCss = function (question) {
var btnClasses = question.cssClasses.buttonPrev;
if (!question.isPrevButtonShowing) {
btnClasses += " " + question.cssClasses.buttonPrev + "--disabled";
}
return btnClasses;
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { title: this.question.panelPrevText },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { viewBox: "0 0 10 10", className: getButtonPrevCss(this.question), onClick: this.handleOnPanelPrevClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("polygon", { points: "2,2 0,4 5,9 10,4 8,2 5,5 " }))));
};
SurveyQuestionPanelDynamic.prototype.rendrerNextButton = function () {
var getButtonNextCss = function (question) {
var btnClasses = question.cssClasses.buttonNext;
if (!question.isNextButtonShowing) {
btnClasses += " " + question.cssClasses.buttonNext + "--disabled";
}
return btnClasses;
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { title: this.question.panelNextText },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { viewBox: "0 0 10 10", className: getButtonNextCss(this.question), onClick: this.handleOnPanelNextClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("polygon", { points: "2,2 0,4 5,9 10,4 8,2 5,5 " }))));
};
SurveyQuestionPanelDynamic.prototype.renderRange = function () {
var _this = this;
var getProgress = function () {
var rangeMax = _this.question.panelCount - 1;
return (_this.question.currentIndex / rangeMax) * 100 + "%";
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progress },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progressBar, style: { width: getProgress() }, role: "progressbar" })));
};
SurveyQuestionPanelDynamic.prototype.renderAddRowButton = function () {
if (!this.question.canAddPanel)
return null;
var classes = this.question.cssClasses.button +
" " +
this.question.cssClasses.buttonAdd;
if (this.question.renderMode === "list") {
classes += " " + this.question.cssClasses.buttonAdd + "--list-mode";
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: classes, type: "button", onClick: this.handleOnPanelAddClick, value: this.question.panelAddText }));
};
return SurveyQuestionPanelDynamic;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionPanelDynamicItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionPanelDynamicItem, _super);
function SurveyQuestionPanelDynamicItem(props) {
var _this = _super.call(this, props) || this;
_this.handleOnPanelRemoveClick = _this.handleOnPanelRemoveClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionPanelDynamicItem.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionPanelDynamicItem.prototype, "index", {
get: function () {
return this.props.index;
},
enumerable: true,
configurable: true
});
SurveyQuestionPanelDynamicItem.prototype.getSurvey = function () {
return !!this.question ? this.question.survey : null;
};
SurveyQuestionPanelDynamicItem.prototype.getCss = function () {
var survey = this.getSurvey();
return !!survey ? survey.getCss() : {};
};
SurveyQuestionPanelDynamicItem.prototype.handleOnPanelRemoveClick = function (event) {
this.question.removePanelUI(this.index);
};
SurveyQuestionPanelDynamicItem.prototype.renderBottom = function () {
if (!this.question)
return null;
var hr = this.question.isRenderModeList &&
this.index < this.question.panelCount - 1 ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("hr", { className: this.question.cssClasses.separator })) : null;
var removeButton = this.renderButton();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
removeButton,
hr));
};
SurveyQuestionPanelDynamicItem.prototype.renderButton = function () {
if (!this.question.canRemovePanel ||
(this.question.isRenderModeList && this.panel.isCollapsed))
return null;
var style = { marginTop: "5px" };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.question.cssClasses.button +
" " +
this.question.cssClasses.buttonRemove, style: style, type: "button", onClick: this.handleOnPanelRemoveClick, value: this.question.panelRemoveText }));
};
return SurveyQuestionPanelDynamicItem;
}(__WEBPACK_IMPORTED_MODULE_3__panel__["a" /* SurveyPanel */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("paneldynamic", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamic, props);
});
/***/ }),
/* 73 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionRadiogroup; });
/* unused harmony export SurveyQuestionRadioItem */
var SurveyQuestionRadiogroup = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionRadiogroup, _super);
function SurveyQuestionRadiogroup(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.render = function () {
var _this = this;
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var clearButton = null;
if (this.question.canShowClearButton) {
clearButton = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "button", className: this.question.cssClasses.clearButton, onClick: function () { return _this.question.clearValue(); }, value: this.question.clearButtonCaption })));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
this.question.hasColumns
? this.getColumns(cssClasses)
: this.getItems(cssClasses),
clearButton));
};
SurveyQuestionRadiogroup.prototype.getColumns = function (cssClasses) {
var _this = this;
var value = this.getStateValue();
return this.question.columns.map(function (column, ci) {
var items = column.map(function (item, ii) {
return _this.renderItem(item, value, cssClasses, '' + ci + ii);
});
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: "column" + ci, className: _this.question.getColumnClass() }, items));
});
};
SurveyQuestionRadiogroup.prototype.getItems = function (cssClasses) {
var items = [];
var value = this.getStateValue();
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
items.push(this.renderItem(item, value, cssClasses, '' + i));
}
return items;
};
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "textStyle", {
get: function () {
return { marginLeft: "3px", display: "inline", position: "static" };
},
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.renderItem = function (item, value, cssClasses, index) {
var key = "item" + index;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRadioItem, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, item: item, textStyle: this.textStyle, index: index, isChecked: value === item.value, isDisabled: this.question.isReadOnly || !item.isEnabled }));
};
SurveyQuestionRadiogroup.prototype.getStateValue = function () {
return !this.question.isEmpty() ? this.question.renderedValue : "";
};
return SurveyQuestionRadiogroup;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionRadioItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionRadioItem, _super);
function SurveyQuestionRadioItem(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
SurveyQuestionRadioItem.prototype.getStateElement = function () {
return this.item;
};
Object.defineProperty(SurveyQuestionRadioItem.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "item", {
get: function () {
return this.props.item;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "textStyle", {
get: function () {
return this.props.textStyle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "index", {
get: function () {
return this.props.index;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "isChecked", {
get: function () {
return this.props.isChecked;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "isDisabled", {
get: function () {
return this.props.isDisabled;
},
enumerable: true,
configurable: true
});
SurveyQuestionRadioItem.prototype.shouldComponentUpdate = function () {
return (!this.question.customWidget ||
!!this.question.customWidgetData.isNeedRender ||
!!this.question.customWidget.widgetJson.isDefaultRender ||
!!this.question.customWidget.widgetJson.render);
};
SurveyQuestionRadioItem.prototype.handleOnChange = function (event) {
this.question.renderedValue = this.item.value;
};
SurveyQuestionRadioItem.prototype.getItemClass = function (isChecked, isDisabled) {
var itemClass = this.cssClasses.item;
var allowHover = !isDisabled && !isChecked;
if (isDisabled)
itemClass += " " + this.cssClasses.itemDisabled;
if (isChecked)
itemClass += " " + this.cssClasses.itemChecked;
if (allowHover)
itemClass += " " + this.cssClasses.itemHover;
if (!this.question.hasColumns) {
itemClass +=
this.question.colCount === 0
? " " + this.cssClasses.itemInline
: " sv-q-col-" + this.question.colCount;
}
return itemClass;
};
SurveyQuestionRadioItem.prototype.render = function () {
if (!this.item || !this.question)
return null;
var otherItem = this.isChecked && this.item.value === this.question.otherItem.value
? this.renderOther(this.cssClasses)
: null;
var id = this.question.inputId + "_" + this.index;
var itemText = this.renderLocString(this.item.locText, this.textStyle);
var itemClass = this.getItemClass(this.isChecked, this.isDisabled);
var labelClass = this.question.getLabelClass(this.isChecked);
var locText = this.item.locText;
var controlLabelClass = this.question.getControlLabelClass(this.isChecked);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: labelClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.cssClasses.itemControl, id: id, type: "radio", name: this.question.name + "_" + this.question.id, checked: this.isChecked, value: this.item.value, disabled: this.isDisplayMode || !this.item.isEnabled, onChange: this.handleOnChange, "aria-required": this.question.isRequired, "aria-label": locText.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.materialDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { className: this.cssClasses.itemDecorator, viewBox: "-12 -12 24 24" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("circle", { r: "6", cx: "0", cy: "0" }))),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: controlLabelClass, title: locText["koRenderedHtml"] }, itemText)),
otherItem));
};
SurveyQuestionRadioItem.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "form-group" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: cssClasses.other, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionRadioItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("radiogroup", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRadiogroup, props);
});
/***/ }),
/* 74 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionRating; });
var SurveyQuestionRating = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionRating, _super);
function SurveyQuestionRating(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionRating.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionRating.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionRating.prototype.render = function () {
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var values = [];
var minText = this.question.minRateDescription
? this.renderLocString(this.question.locMinRateDescription)
: null;
var maxText = this.question.maxRateDescription
? this.renderLocString(this.question.locMaxRateDescription)
: null;
for (var i = 0; i < this.question.visibleRateValues.length; i++) {
var minTextValue = i == 0 ? minText : null;
var maxTextValue = i == this.question.visibleRateValues.length - 1 ? maxText : null;
values.push(this.renderItem("value" + i, this.question.visibleRateValues[i], minTextValue, maxTextValue, cssClasses));
}
var comment = this.question.hasOther ? this.renderOther(cssClasses) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
values,
comment));
};
SurveyQuestionRating.prototype.renderItem = function (key, item, minText, maxText, cssClasses) {
var isChecked = this.question.value == item.value;
var className = cssClasses.item;
if (isChecked)
className += " " + cssClasses.selected;
if (this.isDisplayMode)
className += " " + cssClasses.disabled;
var itemText = this.renderLocString(item.locText);
var minTextBlock = !!minText ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.minText }, minText)) : null;
var maxTextBlock = !!maxText ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.maxText }, maxText)) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { key: key, className: className },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "radio", className: "sv-visuallyhidden", name: this.question.name, value: item.value, disabled: this.isDisplayMode, checked: this.question.value == item.value, onChange: this.handleOnChange, "aria-required": this.question.isRequired, "aria-label": item.locText.text }),
minTextBlock,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.itemText }, itemText),
maxTextBlock));
};
SurveyQuestionRating.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.other },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionRating;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("rating", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRating, props);
});
/***/ }),
/* 75 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionText; });
var SurveyQuestionText = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionText, _super);
function SurveyQuestionText(props) {
return _super.call(this, props) || this;
}
SurveyQuestionText.prototype.render = function () {
var _this = this;
if (!this.question)
return null;
var cssClasses = this.question.cssClasses;
var onBlur = !this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
var onInput = this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: this.question.inputId, disabled: this.isDisplayMode, className: cssClasses.root, type: this.question.inputType, ref: function (input) { return (_this.control = input); }, maxLength: this.question.getMaxLength(), size: this.question.size, placeholder: this.question.placeHolder, onBlur: onBlur, onInput: onInput, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml }));
};
return SurveyQuestionText;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* SurveyQuestionUncontrolledElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("text", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionText, props);
});
/***/ }),
/* 76 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 77 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 78 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CalculatedValue; });
/**
* The calculated value is a way to define the variable in Survey Creator.
* It has two main properties: name and expression. Based on expression the value read-only property is automatically calculated.
* The name property should be unique though all calcualted values.
* It uses survey.getVariable/seruvey.setVariable functions to get/set its value. The class do not store its value internally.
* You may set includeIntoResult property to true to store this calculated value into survey result.
*/
var CalculatedValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(CalculatedValue, _super);
function CalculatedValue(name, expression) {
if (name === void 0) { name = null; }
if (expression === void 0) { expression = null; }
var _this = _super.call(this) || this;
_this.expressionIsRunning = false;
if (!!name) {
_this.name = name;
}
if (!!expression) {
_this.expression = expression;
}
return _this;
}
CalculatedValue.prototype.setOwner = function (data) {
this.data = data;
this.rerunExpression();
};
CalculatedValue.prototype.getType = function () {
return "calculatedvalue";
};
Object.defineProperty(CalculatedValue.prototype, "name", {
/**
* The calculated value name. It should be non empty and unique.
*/
get: function () {
return this.getPropertyValue("name", "");
},
set: function (val) {
this.setPropertyValue("name", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CalculatedValue.prototype, "includeIntoResult", {
/**
* Set this property to true to include the non-empty calculated value into survey result, survey.data property.
*/
get: function () {
return this.getPropertyValue("includeIntoResult", false);
},
set: function (val) {
this.setPropertyValue("includeIntoResult", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CalculatedValue.prototype, "expression", {
/**
* The Expression that used to calculate the value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.
*
Example: "({quantity} * {price}) * (100 - {discount}) / 100"
*/
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
this.rerunExpression();
},
enumerable: true,
configurable: true
});
CalculatedValue.prototype.locCalculation = function () {
this.expressionIsRunning = true;
};
CalculatedValue.prototype.unlocCalculation = function () {
this.expressionIsRunning = false;
};
CalculatedValue.prototype.runExpression = function (values, properties) {
var _this = this;
if (!this.canRunExpression)
return;
this.locCalculation();
if (!this.expressionRunner) {
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["a" /* ExpressionRunner */](this.expression);
}
this.expressionRunner.onRunComplete = function (newValue) {
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, _this.value)) {
_this.setValue(newValue);
}
_this.unlocCalculation();
};
this.expressionRunner.run(values, properties);
};
Object.defineProperty(CalculatedValue.prototype, "value", {
get: function () {
if (!this.data)
return undefined;
return this.data.getVariable(this.name);
},
enumerable: true,
configurable: true
});
CalculatedValue.prototype.setValue = function (val) {
if (!this.data)
return;
this.data.setVariable(this.name, val);
};
Object.defineProperty(CalculatedValue.prototype, "canRunExpression", {
get: function () {
return (!!this.data &&
!this.isLoadingFromJson &&
!!this.expression &&
!this.expressionIsRunning &&
!!this.name);
},
enumerable: true,
configurable: true
});
CalculatedValue.prototype.rerunExpression = function () {
if (!this.canRunExpression)
return;
this.runExpression(this.data.getFilteredValues(), this.data.getFilteredProperties());
};
return CalculatedValue;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("calculatedvalue", ["!name", "expression:expression", "includeIntoResult:boolean"], function () {
return new CalculatedValue();
}, "base");
/***/ }),
/* 79 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(11);
/* unused harmony export ExpressionItem */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return HtmlConditionItem; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return UrlConditionItem; });
var ExpressionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExpressionItem, _super);
function ExpressionItem(expression) {
if (expression === void 0) { expression = null; }
var _this = _super.call(this) || this;
_this.createLocalizableString("html", _this);
_this.expression = expression;
return _this;
}
ExpressionItem.prototype.getType = function () {
return "expressionitem";
};
ExpressionItem.prototype.runCondition = function (values, properties) {
if (!this.expression)
return false;
return new __WEBPACK_IMPORTED_MODULE_3__conditions__["b" /* ConditionRunner */](this.expression).run(values, properties);
};
Object.defineProperty(ExpressionItem.prototype, "expression", {
/**
* The expression property. If this expression returns true, then survey will use html property to show on complete page.
*/
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ExpressionItem.prototype, "locHtml", {
get: function () {
return this.getLocalizableString("html");
},
enumerable: true,
configurable: true
});
ExpressionItem.prototype.getLocale = function () {
return !!this.locOwner ? this.locOwner.getLocale() : "";
};
ExpressionItem.prototype.getMarkdownHtml = function (text) {
return !!this.locOwner ? this.locOwner.getMarkdownHtml(text) : null;
};
ExpressionItem.prototype.getProcessedText = function (text) {
return this.locOwner ? this.locOwner.getProcessedText(text) : text;
};
return ExpressionItem;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
/**
* A class that contains expression and html propeties. It uses in survey.completedHtmlOnCondition array.
* If the expression returns true then html of this item uses instead of survey.completedHtml property
* @see SurveyModel.completedHtmlOnCondition
* @see SurveyModel.completedHtml
*/
var HtmlConditionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(HtmlConditionItem, _super);
function HtmlConditionItem(expression, html) {
if (expression === void 0) { expression = null; }
if (html === void 0) { html = null; }
var _this = _super.call(this, expression) || this;
_this.createLocalizableString("html", _this);
_this.html = html;
return _this;
}
HtmlConditionItem.prototype.getType = function () {
return "htmlconditionitem";
};
Object.defineProperty(HtmlConditionItem.prototype, "html", {
/**
* The html that shows on completed ('Thank you') page. The expression should return true
* @see expression
*/
get: function () {
return this.getLocalizableStringText("html");
},
set: function (value) {
this.setLocalizableStringText("html", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(HtmlConditionItem.prototype, "locHtml", {
get: function () {
return this.getLocalizableString("html");
},
enumerable: true,
configurable: true
});
return HtmlConditionItem;
}(ExpressionItem));
/**
* A class that contains expression and url propeties. It uses in survey.navigateToUrlOnCondition array.
* If the expression returns true then url of this item uses instead of survey.navigateToUrl property
* @see SurveyModel.navigateToUrl
*/
var UrlConditionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(UrlConditionItem, _super);
function UrlConditionItem(expression, url) {
if (expression === void 0) { expression = null; }
if (url === void 0) { url = null; }
var _this = _super.call(this, expression) || this;
_this.createLocalizableString("url", _this);
_this.url = url;
return _this;
}
UrlConditionItem.prototype.getType = function () {
return "urlconditionitem";
};
Object.defineProperty(UrlConditionItem.prototype, "url", {
/**
* The url that survey navigates to on completing the survey. The expression should return true
* @see expression
*/
get: function () {
return this.getLocalizableStringText("url");
},
set: function (value) {
this.setLocalizableStringText("url", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(UrlConditionItem.prototype, "locUrl", {
get: function () {
return this.getLocalizableString("url");
},
enumerable: true,
configurable: true
});
return UrlConditionItem;
}(ExpressionItem));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("expressionitem", ["expression:condition"], function () {
return new ExpressionItem();
}, "base");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("htmlconditionitem", [{ name: "html:html", serializationProperty: "locHtml" }], function () {
return new HtmlConditionItem();
}, "expressionitem");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("urlconditionitem", [{ name: "url:string", serializationProperty: "locUrl" }], function () {
return new UrlConditionItem();
}, "expressionitem");
/***/ }),
/* 80 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__expressions__ = __webpack_require__(27);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SyntaxError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return parse; });
// tslint:disable:only-arrow-functions
// tslint:disable:object-literal-shorthand
// tslint:disable:trailing-comma
// tslint:disable:object-literal-sort-keys
// tslint:disable:one-variable-per-declaration
// tslint:disable:max-line-length
// tslint:disable:no-consecutive-blank-lines
// tslint:disable:align
// Generated by PEG.js v. 0.10.0 (ts-pegjs plugin v. 0.2.5 )
//
// https://pegjs.org/ https://github.com/metadevpro/ts-pegjs
var SyntaxError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SyntaxError, _super);
function SyntaxError(message, expected, found, location) {
var _this = _super.call(this) || this;
_this.message = message;
_this.expected = expected;
_this.found = found;
_this.location = location;
_this.name = "SyntaxError";
if (typeof Error.captureStackTrace === "function") {
Error.captureStackTrace(_this, SyntaxError);
}
return _this;
}
SyntaxError.buildMessage = function (expected, found) {
function hex(ch) {
return ch.charCodeAt(0).toString(16).toUpperCase();
}
function literalEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/"/g, "\\\"")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
.replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
}
function classEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/\]/g, "\\]")
.replace(/\^/g, "\\^")
.replace(/-/g, "\\-")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
.replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
}
function describeExpectation(expectation) {
switch (expectation.type) {
case "literal":
return "\"" + literalEscape(expectation.text) + "\"";
case "class":
var escapedParts = expectation.parts.map(function (part) {
return Array.isArray(part)
? classEscape(part[0]) + "-" + classEscape(part[1])
: classEscape(part);
});
return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
case "any":
return "any character";
case "end":
return "end of input";
case "other":
return expectation.description;
}
}
function describeExpected(expected1) {
var descriptions = expected1.map(describeExpectation);
var i;
var j;
descriptions.sort();
if (descriptions.length > 0) {
for (i = 1, j = 1; i < descriptions.length; i++) {
if (descriptions[i - 1] !== descriptions[i]) {
descriptions[j] = descriptions[i];
j++;
}
}
descriptions.length = j;
}
switch (descriptions.length) {
case 1:
return descriptions[0];
case 2:
return descriptions[0] + " or " + descriptions[1];
default:
return descriptions.slice(0, -1).join(", ")
+ ", or "
+ descriptions[descriptions.length - 1];
}
}
function describeFound(found1) {
return found1 ? "\"" + literalEscape(found1) + "\"" : "end of input";
}
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
};
return SyntaxError;
}(Error));
function peg$parse(input, options) {
options = options !== undefined ? options : {};
var peg$FAILED = {};
var peg$startRuleFunctions = { Expression: peg$parseExpression };
var peg$startRuleFunction = peg$parseExpression;
var peg$c0 = function (head, tail) {
return buildBinaryOperand(head, tail, true);
};
var peg$c1 = "||";
var peg$c2 = peg$literalExpectation("||", false);
var peg$c3 = "or";
var peg$c4 = peg$literalExpectation("or", true);
var peg$c5 = function () { return "or"; };
var peg$c6 = "&&";
var peg$c7 = peg$literalExpectation("&&", false);
var peg$c8 = "and";
var peg$c9 = peg$literalExpectation("and", true);
var peg$c10 = function () { return "and"; };
var peg$c11 = function (head, tail) {
return buildBinaryOperand(head, tail);
};
var peg$c12 = "<=";
var peg$c13 = peg$literalExpectation("<=", false);
var peg$c14 = "lessorequal";
var peg$c15 = peg$literalExpectation("lessorequal", true);
var peg$c16 = function () { return "lessorequal"; };
var peg$c17 = ">=";
var peg$c18 = peg$literalExpectation(">=", false);
var peg$c19 = "greaterorequal";
var peg$c20 = peg$literalExpectation("greaterorequal", true);
var peg$c21 = function () { return "greaterorequal"; };
var peg$c22 = "=";
var peg$c23 = peg$literalExpectation("=", false);
var peg$c24 = "equal";
var peg$c25 = peg$literalExpectation("equal", true);
var peg$c26 = function () { return "equal"; };
var peg$c27 = "!=";
var peg$c28 = peg$literalExpectation("!=", false);
var peg$c29 = "notequal";
var peg$c30 = peg$literalExpectation("notequal", true);
var peg$c31 = function () { return "notequal"; };
var peg$c32 = "<";
var peg$c33 = peg$literalExpectation("<", false);
var peg$c34 = "less";
var peg$c35 = peg$literalExpectation("less", true);
var peg$c36 = function () { return "less"; };
var peg$c37 = ">";
var peg$c38 = peg$literalExpectation(">", false);
var peg$c39 = "greater";
var peg$c40 = peg$literalExpectation("greater", true);
var peg$c41 = function () { return "greater"; };
var peg$c42 = "+";
var peg$c43 = peg$literalExpectation("+", false);
var peg$c44 = function () { return "plus"; };
var peg$c45 = "-";
var peg$c46 = peg$literalExpectation("-", false);
var peg$c47 = function () { return "minus"; };
var peg$c48 = "*";
var peg$c49 = peg$literalExpectation("*", false);
var peg$c50 = function () { return "mul"; };
var peg$c51 = "/";
var peg$c52 = peg$literalExpectation("/", false);
var peg$c53 = function () { return "div"; };
var peg$c54 = "%";
var peg$c55 = peg$literalExpectation("%", false);
var peg$c56 = function () { return "mod"; };
var peg$c57 = "^";
var peg$c58 = peg$literalExpectation("^", false);
var peg$c59 = "power";
var peg$c60 = peg$literalExpectation("power", true);
var peg$c61 = function () { return "power"; };
var peg$c62 = "*=";
var peg$c63 = peg$literalExpectation("*=", false);
var peg$c64 = "contains";
var peg$c65 = peg$literalExpectation("contains", true);
var peg$c66 = "contain";
var peg$c67 = peg$literalExpectation("contain", true);
var peg$c68 = function () { return "contains"; };
var peg$c69 = "notcontains";
var peg$c70 = peg$literalExpectation("notcontains", true);
var peg$c71 = "notcontain";
var peg$c72 = peg$literalExpectation("notcontain", true);
var peg$c73 = function () { return "notcontains"; };
var peg$c74 = "anyof";
var peg$c75 = peg$literalExpectation("anyof", true);
var peg$c76 = function () { return "anyof"; };
var peg$c77 = "allof";
var peg$c78 = peg$literalExpectation("allof", true);
var peg$c79 = function () { return "allof"; };
var peg$c80 = "(";
var peg$c81 = peg$literalExpectation("(", false);
var peg$c82 = ")";
var peg$c83 = peg$literalExpectation(")", false);
var peg$c84 = function (expr) { return expr; };
var peg$c85 = function (name, params) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["a" /* FunctionOperand */](name, params); };
var peg$c86 = "!";
var peg$c87 = peg$literalExpectation("!", false);
var peg$c88 = "negate";
var peg$c89 = peg$literalExpectation("negate", true);
var peg$c90 = function (expr) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["b" /* UnaryOperand */](expr, "negate"); };
var peg$c91 = function (expr, op) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["b" /* UnaryOperand */](expr, op); };
var peg$c92 = "empty";
var peg$c93 = peg$literalExpectation("empty", true);
var peg$c94 = function () { return "empty"; };
var peg$c95 = "notempty";
var peg$c96 = peg$literalExpectation("notempty", true);
var peg$c97 = function () { return "notempty"; };
var peg$c98 = "undefined";
var peg$c99 = peg$literalExpectation("undefined", false);
var peg$c100 = "null";
var peg$c101 = peg$literalExpectation("null", false);
var peg$c102 = function () { return null; };
var peg$c103 = function (value) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["c" /* Const */](value); };
var peg$c104 = "{";
var peg$c105 = peg$literalExpectation("{", false);
var peg$c106 = "}";
var peg$c107 = peg$literalExpectation("}", false);
var peg$c108 = function (value) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["d" /* Variable */](value); };
var peg$c109 = "'";
var peg$c110 = peg$literalExpectation("'", false);
var peg$c111 = function (value) { return value; };
var peg$c112 = "\"";
var peg$c113 = peg$literalExpectation("\"", false);
var peg$c114 = "[";
var peg$c115 = peg$literalExpectation("[", false);
var peg$c116 = "]";
var peg$c117 = peg$literalExpectation("]", false);
var peg$c118 = function (sequence) { return sequence; };
var peg$c119 = ",";
var peg$c120 = peg$literalExpectation(",", false);
var peg$c121 = function (expr, tail) {
if (expr == null)
return [];
var array = [expr];
if (Array.isArray(tail)) {
var flatten = flattenArray(tail);
for (var i = 3; i < flatten.length; i += 4) {
array.push(flatten[i]);
}
}
return new __WEBPACK_IMPORTED_MODULE_1__expressions__["e" /* ArrayOperand */](array);
};
var peg$c122 = "true";
var peg$c123 = peg$literalExpectation("true", true);
var peg$c124 = function () { return true; };
var peg$c125 = "false";
var peg$c126 = peg$literalExpectation("false", true);
var peg$c127 = function () { return false; };
var peg$c128 = "0x";
var peg$c129 = peg$literalExpectation("0x", false);
var peg$c130 = function () { return parseInt(text(), 16); };
var peg$c131 = /^[\-]/;
var peg$c132 = peg$classExpectation(["-"], false, false);
var peg$c133 = function (sign, num) { return sign == null ? num : -num; };
var peg$c134 = ".";
var peg$c135 = peg$literalExpectation(".", false);
var peg$c136 = function () { return parseFloat(text()); };
var peg$c137 = function () { return parseInt(text(), 10); };
var peg$c138 = "0";
var peg$c139 = peg$literalExpectation("0", false);
var peg$c140 = function () { return 0; };
var peg$c141 = function (chars) { return chars.join(""); };
var peg$c142 = "\\'";
var peg$c143 = peg$literalExpectation("\\'", false);
var peg$c144 = function () { return "'"; };
var peg$c145 = "\\\"";
var peg$c146 = peg$literalExpectation("\\\"", false);
var peg$c147 = function () { return "\""; };
var peg$c148 = /^[^"'{}]/;
var peg$c149 = peg$classExpectation(["\"", "'", "{", "}"], true, false);
var peg$c150 = function () { return text(); };
var peg$c151 = /^[^{}]/;
var peg$c152 = peg$classExpectation(["{", "}"], true, false);
var peg$c153 = /^[0-9]/;
var peg$c154 = peg$classExpectation([["0", "9"]], false, false);
var peg$c155 = /^[1-9]/;
var peg$c156 = peg$classExpectation([["1", "9"]], false, false);
var peg$c157 = /^[a-zA-Z]/;
var peg$c158 = peg$classExpectation([["a", "z"], ["A", "Z"]], false, false);
var peg$c159 = peg$otherExpectation("whitespace");
var peg$c160 = /^[ \t\n\r]/;
var peg$c161 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false);
var peg$currPos = 0;
var peg$savedPos = 0;
var peg$posDetailsCache = [{ line: 1, column: 1 }];
var peg$maxFailPos = 0;
var peg$maxFailExpected = [];
var peg$silentFails = 0;
var peg$resultsCache = {};
var peg$result;
if (options.startRule !== undefined) {
if (!(options.startRule in peg$startRuleFunctions)) {
throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
}
peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
}
function text() {
return input.substring(peg$savedPos, peg$currPos);
}
function location() {
return peg$computeLocation(peg$savedPos, peg$currPos);
}
function expected(description, location1) {
location1 = location1 !== undefined
? location1
: peg$computeLocation(peg$savedPos, peg$currPos);
throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1);
}
function error(message, location1) {
location1 = location1 !== undefined
? location1
: peg$computeLocation(peg$savedPos, peg$currPos);
throw peg$buildSimpleError(message, location1);
}
function peg$literalExpectation(text1, ignoreCase) {
return { type: "literal", text: text1, ignoreCase: ignoreCase };
}
function peg$classExpectation(parts, inverted, ignoreCase) {
return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
}
function peg$anyExpectation() {
return { type: "any" };
}
function peg$endExpectation() {
return { type: "end" };
}
function peg$otherExpectation(description) {
return { type: "other", description: description };
}
function peg$computePosDetails(pos) {
var details = peg$posDetailsCache[pos];
var p;
if (details) {
return details;
}
else {
p = pos - 1;
while (!peg$posDetailsCache[p]) {
p--;
}
details = peg$posDetailsCache[p];
details = {
line: details.line,
column: details.column
};
while (p < pos) {
if (input.charCodeAt(p) === 10) {
details.line++;
details.column = 1;
}
else {
details.column++;
}
p++;
}
peg$posDetailsCache[pos] = details;
return details;
}
}
function peg$computeLocation(startPos, endPos) {
var startPosDetails = peg$computePosDetails(startPos);
var endPosDetails = peg$computePosDetails(endPos);
return {
start: {
offset: startPos,
line: startPosDetails.line,
column: startPosDetails.column
},
end: {
offset: endPos,
line: endPosDetails.line,
column: endPosDetails.column
}
};
}
function peg$fail(expected1) {
if (peg$currPos < peg$maxFailPos) {
return;
}
if (peg$currPos > peg$maxFailPos) {
peg$maxFailPos = peg$currPos;
peg$maxFailExpected = [];
}
peg$maxFailExpected.push(expected1);
}
function peg$buildSimpleError(message, location1) {
return new SyntaxError(message, [], "", location1);
}
function peg$buildStructuredError(expected1, found, location1) {
return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1);
}
function peg$parseExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7, s8;
var key = peg$currPos * 34 + 0;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
s2 = peg$parseLogicOr();
if (s2 !== peg$FAILED) {
s3 = [];
s4 = peg$currPos;
s5 = peg$parse_();
if (s5 !== peg$FAILED) {
s6 = peg$parseOrSign();
if (s6 !== peg$FAILED) {
s7 = peg$parse_();
if (s7 !== peg$FAILED) {
s8 = peg$parseLogicOr();
if (s8 !== peg$FAILED) {
s5 = [s5, s6, s7, s8];
s4 = s5;
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
while (s4 !== peg$FAILED) {
s3.push(s4);
s4 = peg$currPos;
s5 = peg$parse_();
if (s5 !== peg$FAILED) {
s6 = peg$parseOrSign();
if (s6 !== peg$FAILED) {
s7 = peg$parse_();
if (s7 !== peg$FAILED) {
s8 = peg$parseLogicOr();
if (s8 !== peg$FAILED) {
s5 = [s5, s6, s7, s8];
s4 = s5;
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
if (s3 !== peg$FAILED) {
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s2, s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseOrSign() {
var s0, s1;
var key = peg$currPos * 34 + 1;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c1) {
s1 = peg$c1;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c2);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 2).toLowerCase() === peg$c3) {
s1 = input.substr(peg$currPos, 2);
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c4);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c5();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLogicOr() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 2;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLogicAnd();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseAndSign();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseLogicAnd();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseAndSign();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseLogicAnd();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAndSign() {
var s0, s1;
var key = peg$currPos * 34 + 3;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c6) {
s1 = peg$c6;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c7);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 3).toLowerCase() === peg$c8) {
s1 = input.substr(peg$currPos, 3);
peg$currPos += 3;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c9);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c10();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLogicAnd() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 4;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseCompOps();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseComparableOperators();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseCompOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseComparableOperators();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseCompOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c11(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseComparableOperators() {
var s0, s1;
var key = peg$currPos * 34 + 5;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c12) {
s1 = peg$c12;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c13);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 11).toLowerCase() === peg$c14) {
s1 = input.substr(peg$currPos, 11);
peg$currPos += 11;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c15);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c16();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c17) {
s1 = peg$c17;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c18);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 14).toLowerCase() === peg$c19) {
s1 = input.substr(peg$currPos, 14);
peg$currPos += 14;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c20);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c21();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 61) {
s1 = peg$c22;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c23);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c24) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c25);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c26();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c27) {
s1 = peg$c27;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c28);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 8).toLowerCase() === peg$c29) {
s1 = input.substr(peg$currPos, 8);
peg$currPos += 8;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c30);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c31();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 60) {
s1 = peg$c32;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c33);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 4).toLowerCase() === peg$c34) {
s1 = input.substr(peg$currPos, 4);
peg$currPos += 4;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c35);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c36();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 62) {
s1 = peg$c37;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c38);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 7).toLowerCase() === peg$c39) {
s1 = input.substr(peg$currPos, 7);
peg$currPos += 7;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c40);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c41();
}
s0 = s1;
}
}
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseCompOps() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 6;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parsePlusMinusOps();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePlusMinusSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parsePlusMinusOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePlusMinusSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parsePlusMinusOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parsePlusMinusSigns() {
var s0, s1;
var key = peg$currPos * 34 + 7;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 43) {
s1 = peg$c42;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c43);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c44();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 45) {
s1 = peg$c45;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c46);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c47();
}
s0 = s1;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parsePlusMinusOps() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 8;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseMulDivOps();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseMulDivSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseMulDivOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseMulDivSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseMulDivOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseMulDivSigns() {
var s0, s1;
var key = peg$currPos * 34 + 9;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 42) {
s1 = peg$c48;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c49);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c50();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 47) {
s1 = peg$c51;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c52);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c53();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 37) {
s1 = peg$c54;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c55);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c56();
}
s0 = s1;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseMulDivOps() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 10;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseBinaryFuncOp();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePowerSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseBinaryFuncOp();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePowerSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseBinaryFuncOp();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parsePowerSigns() {
var s0, s1;
var key = peg$currPos * 34 + 11;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 94) {
s1 = peg$c57;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c58);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c59) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c60);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c61();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseBinaryFuncOp() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 12;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseFactor();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseBinFunctions();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseFactor();
if (s7 === peg$FAILED) {
s7 = null;
}
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseBinFunctions();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseFactor();
if (s7 === peg$FAILED) {
s7 = null;
}
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c11(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseBinFunctions() {
var s0, s1;
var key = peg$currPos * 34 + 13;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c62) {
s1 = peg$c62;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c63);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 8).toLowerCase() === peg$c64) {
s1 = input.substr(peg$currPos, 8);
peg$currPos += 8;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c65);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 7).toLowerCase() === peg$c66) {
s1 = input.substr(peg$currPos, 7);
peg$currPos += 7;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c67);
}
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c68();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 11).toLowerCase() === peg$c69) {
s1 = input.substr(peg$currPos, 11);
peg$currPos += 11;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c70);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 10).toLowerCase() === peg$c71) {
s1 = input.substr(peg$currPos, 10);
peg$currPos += 10;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c72);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c73();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c74) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c75);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c76();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c77) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c78);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c79();
}
s0 = s1;
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseFactor() {
var s0, s1, s2, s3, s4, s5;
var key = peg$currPos * 34 + 14;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 40) {
s1 = peg$c80;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c81);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parse_();
if (s2 !== peg$FAILED) {
s3 = peg$parseExpression();
if (s3 !== peg$FAILED) {
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 41) {
s5 = peg$c82;
peg$currPos++;
}
else {
s5 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c83);
}
}
if (s5 === peg$FAILED) {
s5 = null;
}
if (s5 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c84(s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$parseFunctionOp();
if (s0 === peg$FAILED) {
s0 = peg$parseUnaryFunctionOp();
if (s0 === peg$FAILED) {
s0 = peg$parseAtom();
if (s0 === peg$FAILED) {
s0 = peg$parseArrayOp();
}
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseFunctionOp() {
var s0, s1, s2, s3, s4;
var key = peg$currPos * 34 + 15;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLettersAndDigits();
if (s1 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 40) {
s2 = peg$c80;
peg$currPos++;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c81);
}
}
if (s2 !== peg$FAILED) {
s3 = peg$parseSequence();
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 41) {
s4 = peg$c82;
peg$currPos++;
}
else {
s4 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c83);
}
}
if (s4 === peg$FAILED) {
s4 = null;
}
if (s4 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c85(s1, s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseUnaryFunctionOp() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 16;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 33) {
s1 = peg$c86;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c87);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 6).toLowerCase() === peg$c88) {
s1 = input.substr(peg$currPos, 6);
peg$currPos += 6;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c89);
}
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parse_();
if (s2 !== peg$FAILED) {
s3 = peg$parseExpression();
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c90(s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseAtom();
if (s1 !== peg$FAILED) {
s2 = peg$parse_();
if (s2 !== peg$FAILED) {
s3 = peg$parseUnFunctions();
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c91(s1, s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseUnFunctions() {
var s0, s1;
var key = peg$currPos * 34 + 17;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c92) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c93);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c94();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 8).toLowerCase() === peg$c95) {
s1 = input.substr(peg$currPos, 8);
peg$currPos += 8;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c96);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c97();
}
s0 = s1;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAtom() {
var s0, s1, s2, s3, s4;
var key = peg$currPos * 34 + 18;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
if (input.substr(peg$currPos, 9) === peg$c98) {
s2 = peg$c98;
peg$currPos += 9;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c99);
}
}
if (s2 === peg$FAILED) {
if (input.substr(peg$currPos, 4) === peg$c100) {
s2 = peg$c100;
peg$currPos += 4;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c101);
}
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c102();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
s2 = peg$parseConstValue();
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c103(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 123) {
s2 = peg$c104;
peg$currPos++;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c105);
}
}
if (s2 !== peg$FAILED) {
s3 = peg$parseValueInput();
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 125) {
s4 = peg$c106;
peg$currPos++;
}
else {
s4 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c107);
}
}
if (s4 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c108(s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseConstValue() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 19;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$parseLogicValue();
if (s0 === peg$FAILED) {
s0 = peg$parseArithmeticValue();
if (s0 === peg$FAILED) {
s0 = peg$parseLettersAndDigits();
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 39) {
s1 = peg$c109;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c110);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseAnyInput();
if (s2 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 39) {
s3 = peg$c109;
peg$currPos++;
}
else {
s3 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c110);
}
}
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c111(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 34) {
s1 = peg$c112;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c113);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseAnyInput();
if (s2 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 34) {
s3 = peg$c112;
peg$currPos++;
}
else {
s3 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c113);
}
}
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c111(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseArrayOp() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 20;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 91) {
s1 = peg$c114;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c115);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseSequence();
if (s2 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 93) {
s3 = peg$c116;
peg$currPos++;
}
else {
s3 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c117);
}
}
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c118(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseSequence() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 21;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseExpression();
if (s1 === peg$FAILED) {
s1 = null;
}
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 44) {
s5 = peg$c119;
peg$currPos++;
}
else {
s5 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c120);
}
}
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 44) {
s5 = peg$c119;
peg$currPos++;
}
else {
s5 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c120);
}
}
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c121(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLogicValue() {
var s0, s1;
var key = peg$currPos * 34 + 22;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 4).toLowerCase() === peg$c122) {
s1 = input.substr(peg$currPos, 4);
peg$currPos += 4;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c123);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c124();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c125) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c126);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c127();
}
s0 = s1;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseArithmeticValue() {
var s0, s1, s2;
var key = peg$currPos * 34 + 23;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c128) {
s1 = peg$c128;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c129);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseDigits();
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c130();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (peg$c131.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c132);
}
}
if (s1 === peg$FAILED) {
s1 = null;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseNumber();
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c133(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseNumber() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 24;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseDigits();
if (s1 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 46) {
s2 = peg$c134;
peg$currPos++;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c135);
}
}
if (s2 !== peg$FAILED) {
s3 = peg$parseDigits();
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c136();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseNonZeroDigits();
if (s1 !== peg$FAILED) {
s2 = peg$parseDigits();
if (s2 === peg$FAILED) {
s2 = null;
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c137();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 48) {
s1 = peg$c138;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c139);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c140();
}
s0 = s1;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseValueInput() {
var s0, s1, s2;
var key = peg$currPos * 34 + 25;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = [];
s2 = peg$parseValueCharacters();
if (s2 !== peg$FAILED) {
while (s2 !== peg$FAILED) {
s1.push(s2);
s2 = peg$parseValueCharacters();
}
}
else {
s1 = peg$FAILED;
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c141(s1);
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAnyInput() {
var s0, s1, s2;
var key = peg$currPos * 34 + 26;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = [];
s2 = peg$parseAnyCharacters();
if (s2 !== peg$FAILED) {
while (s2 !== peg$FAILED) {
s1.push(s2);
s2 = peg$parseAnyCharacters();
}
}
else {
s1 = peg$FAILED;
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c141(s1);
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAnyCharacters() {
var s0, s1;
var key = peg$currPos * 34 + 27;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c142) {
s1 = peg$c142;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c143);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c144();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c145) {
s1 = peg$c145;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c146);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c147();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (peg$c148.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c149);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c150();
}
s0 = s1;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseValueCharacters() {
var s0, s1;
var key = peg$currPos * 34 + 28;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (peg$c151.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c152);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c150();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLettersAndDigits() {
var s0, s1, s2, s3, s4, s5, s6;
var key = peg$currPos * 34 + 29;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLetters();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parseDigits();
if (s4 !== peg$FAILED) {
s5 = [];
s6 = peg$parseLetters();
while (s6 !== peg$FAILED) {
s5.push(s6);
s6 = peg$parseLetters();
}
if (s5 !== peg$FAILED) {
s4 = [s4, s5];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parseDigits();
if (s4 !== peg$FAILED) {
s5 = [];
s6 = peg$parseLetters();
while (s6 !== peg$FAILED) {
s5.push(s6);
s6 = peg$parseLetters();
}
if (s5 !== peg$FAILED) {
s4 = [s4, s5];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c150();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseDigits() {
var s0, s1;
var key = peg$currPos * 34 + 30;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = [];
if (peg$c153.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c154);
}
}
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c153.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c154);
}
}
}
}
else {
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseNonZeroDigits() {
var s0, s1;
var key = peg$currPos * 34 + 31;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = [];
if (peg$c155.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c156);
}
}
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c155.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c156);
}
}
}
}
else {
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLetters() {
var s0, s1;
var key = peg$currPos * 34 + 32;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = [];
if (peg$c157.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c158);
}
}
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c157.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c158);
}
}
}
}
else {
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parse_() {
var s0, s1;
var key = peg$currPos * 34 + 33;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
peg$silentFails++;
s0 = [];
if (peg$c160.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c161);
}
}
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c160.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c161);
}
}
}
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c159);
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function buildBinaryOperand(head, tail, isArithmeticOp) {
if (isArithmeticOp === void 0) { isArithmeticOp = false; }
return tail.reduce(function (result, elements) {
return new __WEBPACK_IMPORTED_MODULE_1__expressions__["f" /* BinaryOperand */](elements[1], result, elements[3], isArithmeticOp);
}, head);
}
function flattenArray(array) {
return [].concat.apply([], array);
}
peg$result = peg$startRuleFunction();
if (peg$result !== peg$FAILED && peg$currPos === input.length) {
return peg$result;
}
else {
if (peg$result !== peg$FAILED && peg$currPos < input.length) {
peg$fail(peg$endExpectation());
}
throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length
? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
: peg$computeLocation(peg$maxFailPos, peg$maxFailPos));
}
}
var parse = peg$parse;
/***/ }),
/* 81 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__panel__ = __webpack_require__(23);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FlowPanelModel; });
/**
* The flow panel object. It is a container with flow layout where you can mix questions with mardown text.
*
*/
var FlowPanelModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(FlowPanelModel, _super);
function FlowPanelModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.createLocalizableString("content", _this, true);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("content", function () {
self.onContentChanged();
});
return _this;
}
FlowPanelModel.prototype.getType = function () {
return "flowpanel";
};
FlowPanelModel.prototype.getChildrenLayoutType = function () {
return "flow";
};
FlowPanelModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.onContentChanged();
};
Object.defineProperty(FlowPanelModel.prototype, "content", {
get: function () {
return this.getLocalizableStringText("content");
},
set: function (val) {
this.setLocalizableStringText("content", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlowPanelModel.prototype, "locContent", {
get: function () {
return this.getLocalizableString("content");
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlowPanelModel.prototype, "html", {
get: function () {
return this.getPropertyValue("html", "");
},
set: function (val) {
this.setPropertyValue("html", val);
},
enumerable: true,
configurable: true
});
FlowPanelModel.prototype.onContentChanged = function () {
var html = "";
if (!!this.onCustomHtmlProducing) {
html = this.onCustomHtmlProducing();
}
else {
html = this.produceHtml();
}
this.html = html;
if (!!this.contentChangedCallback)
this.contentChangedCallback();
};
FlowPanelModel.prototype.produceHtml = function () {
var html = [];
//contentElementNamePrefix
var regEx = /{(.*?(element:)[^$].*?)}/g;
var str = this.content;
var startIndex = 0;
var res = null;
while ((res = regEx.exec(str)) !== null) {
if (res.index > startIndex) {
html.push(str.substr(startIndex, res.index - startIndex));
startIndex = res.index;
}
var question = this.getQuestionFromText(res[0]);
if (!!question) {
html.push(this.getHtmlForQuestion(question));
}
else {
html.push(str.substr(startIndex, res.index + res[0].length - startIndex));
}
startIndex = res.index + res[0].length;
}
if (startIndex < str.length) {
html.push(str.substr(startIndex, str.length - startIndex));
}
return html.join("").replace(new RegExp("
", "g"), "
");
};
FlowPanelModel.prototype.getQuestionFromText = function (str) {
str = str.substr(1, str.length - 2);
str = str.replace(FlowPanelModel.contentElementNamePrefix, "").trim();
return this.getQuestionByName(str);
};
FlowPanelModel.prototype.getHtmlForQuestion = function (question) {
if (!!this.onGetHtmlForQuestion)
return this.onGetHtmlForQuestion(question);
return "";
};
FlowPanelModel.prototype.getQuestionHtmlId = function (question) {
return this.name + "_" + question.id;
};
FlowPanelModel.prototype.onAddElement = function (element, index) {
_super.prototype.onAddElement.call(this, element, index);
this.addElementToContent(element);
element.renderWidth = "";
};
FlowPanelModel.prototype.onRemoveElement = function (element) {
var searchStr = this.getElementContentText(element);
this.content = this.content.replace(searchStr, "");
_super.prototype.onRemoveElement.call(this, element);
};
FlowPanelModel.prototype.dragDropMoveElement = function (src, target, targetIndex) { };
FlowPanelModel.prototype.addElementToContent = function (element) {
if (this.isLoadingFromJson)
return;
var text = this.getElementContentText(element);
if (!this.insertTextAtCursor(text)) {
this.content = this.content + text;
}
};
FlowPanelModel.prototype.insertTextAtCursor = function (text, prevName) {
if (prevName === void 0) { prevName = null; }
if (!this.isDesignMode || (!window && !window.getSelection))
return false;
var sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
var range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(document.createTextNode(text));
var self = this;
if (self.getContent) {
var str = self.getContent(prevName);
this.content = str;
}
return true;
}
return false;
};
FlowPanelModel.prototype.getElementContentText = function (element) {
return "{" + FlowPanelModel.contentElementNamePrefix + element.name + "}";
};
FlowPanelModel.contentElementNamePrefix = "element:";
return FlowPanelModel;
}(__WEBPACK_IMPORTED_MODULE_2__panel__["c" /* PanelModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("flowpanel", [{ name: "content:html", serializationProperty: "locContent" }], function () {
return new FlowPanelModel();
}, "panel");
/***/ }),
/* 82 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export arabicSurveyStrings */
var arabicSurveyStrings = {
pagePrevText: "السابق",
pageNextText: "التالي",
completeText: "انهاء- تم",
progressText: "{1} صفحة {0} من",
otherItemText: "نص آخر",
emptySurvey: "لا توجد صفحة مرئية أو سؤال في المسح",
completingSurvey: "شكرا لك لاستكمال الاستبيان!",
loadingSurvey: "...يتم تحميل الاستبيان",
optionsCaption: "...اختر",
requiredError: ".يرجى الإجابة على السؤال",
requiredInAllRowsError: "يرجى الإجابة على الأسئلة في جميع الصفوف",
numericError: "يجب أن تكون القيمة الرقمية.",
textMinLength: "الرجاء إدخال ما لا يقل عن {0} حرف",
textMaxLength: "الرجاء إدخال أقل من {0} حرف",
textMinMaxLength: "يرجى إدخال أكثر من {0} وأقل من {1} حرف",
minRowCountError: "يرجى ملء ما لا يقل عن {0} الصفوف",
minSelectError: "يرجى تحديد ما لا يقل عن {0} المتغيرات",
maxSelectError: "يرجى تحديد ما لا يزيد عن {0} المتغيرات",
numericMinMax: "و'{0}' يجب أن تكون مساوية أو أكثر من {1} ويساوي أو أقل من {2}ا",
numericMin: "و'{0}' يجب أن تكون مساوية أو أكثر من {1}ا",
numericMax: "و'{0}' يجب أن تكون مساوية أو أقل من {1}ا",
invalidEmail: "رجاء قم بإدخال بريد الكتروني صحيح",
urlRequestError: "طلب إرجاع خطأ '{0}'. {1}ا",
urlGetChoicesError: "عاد طلب بيانات فارغة أو 'المسار' ممتلكات غير صحيحة ",
exceedMaxSize: "وينبغي ألا يتجاوز حجم الملف {0}ا",
otherRequiredError: "الرجاء إدخال قيمة أخرى",
uploadingFile: "الملف الخاص بك تحميل. يرجى الانتظار عدة ثوان وحاول مرة أخرى",
addRow: "اضافة صف",
removeRow: "إزالة صف"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ar"] = arabicSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ar"] = "العربية";
/***/ }),
/* 83 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export bulgarianStrings */
//Uncomment this line on creating a translation file
var bulgarianStrings = {
pagePrevText: "Назад",
pageNextText: "Напред",
completeText: "Край",
startSurveyText: "Начало",
otherItemText: "Друго (опишете)",
noneItemText: "Нито един",
selectAllItemText: "Всички",
progressText: "стр. {0}, общо стр. {1}",
emptySurvey: "Анкетата не съдържа видими страници или въпроси.",
completingSurvey: "Благодарим ви за участието в анкетата!",
completingSurveyBefore: "Изглежда, че вие вече сте попълнили анкетата.",
loadingSurvey: "Зареждане на анкетата...",
optionsCaption: "Изберете...",
value: "value",
requiredError: "Моля, отговорете на следния въпрос.",
requiredErrorInPanel: "Моля, отговорете поне на един от въпросите.",
requiredInAllRowsError: "Моля, отговорете на въпросите на всички редове.",
numericError: "Стойността следва да бъде число.",
textMinLength: "Моля, използвайте поне {0} символа.",
textMaxLength: "Моля, използвайте не повече от {0} символа.",
textMinMaxLength: "Моля, използвайте повече от {0} и по-малко от {1} символа.",
minRowCountError: "Моля, попълнете поне {0} реда.",
minSelectError: "Моля, изберете поне {0} варианта.",
maxSelectError: "Моля, изберете не повече от {0} варианта.",
numericMinMax: "Стойността '{0}' следва да бъде равна или по-голяма от {1} и равна или по-малка от {2}",
numericMin: "Стойността '{0}' следва да бъде равна или по-голяма от {1}",
numericMax: "Стойността '{0}' следва да бъде равна или по-малка от {1}",
invalidEmail: "Моля, въведете валиден адрес на електронна поща.",
invalidExpression: "Изразът: {0} трябва да дава резултат 'true' (истина).",
urlRequestError: "Заявката води до грешка '{0}'. {1}",
urlGetChoicesError: "Заявката не връща данни или частта 'path' (път до търсения ресурс на сървъра) е неправилно зададена",
exceedMaxSize: "Размерът на файла следва да не превишава {0}.",
otherRequiredError: "Моля, въведете другата стойност.",
uploadingFile: "Вашит файл се зарежда на сървъра. Моля, изчакайте няколко секунди и тогава опитвайте отново.",
loadingFile: "Зареждане...",
chooseFile: "Изберете файл(ове)...",
confirmDelete: "Желаете ли да изтриете записа?",
keyDuplicationError: "Стойността следва да бъде уникална.",
addColumn: "Добавяне на колона",
addRow: "Добавяне на ред",
removeRow: "Премахване на ред",
addPanel: "Добавяне на панел",
removePanel: "Премахване на панел",
choices_Item: "елемент",
matrix_column: "Колона",
matrix_row: "Ред",
savingData: "Резултатите се запазват на сървъра...",
savingDataError: "Поради възникнала грешка резултатите не можаха да бъдат запазени.",
savingDataSuccess: "Резултатите бяха запазени успешно!",
saveAgainButton: "Нов опит",
timerMin: "мин",
timerSec: "сек",
timerSpentAll: "Вие използвахте {0} на тази страница и общо {1}.",
timerSpentPage: "Вие използвахте {0} на тази страница.",
timerSpentSurvey: "Вие използвахте общо {0}.",
timerLimitAll: "Вие изпозвахте {0} от {1} на тази страница и общо {2} от {3}.",
timerLimitPage: "Вие използвахте {0} от {1} на тази страница.",
timerLimitSurvey: "Вие използвахте общо {0} от {1}.",
cleanCaption: "Изчистване",
clearCaption: "Начално състояние",
removeFileCaption: "Премахване на файла"
};
//Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable.
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["bg"] = bulgarianStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["bg"] = "Bulgarian";
/***/ }),
/* 84 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export catalanSurveyStrings */
var catalanSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Següent",
completeText: "Complet",
otherItemText: "Un altre (descrigui)",
progressText: "Pàgina {0} de {1}",
emptySurvey: "No hi ha cap pàgina visible o pregunta a l'enquesta.",
completingSurvey: "Gràcies per completar l'enquesta!",
loadingSurvey: "L'enquesta s'està carregant ...",
optionsCaption: "Selecciona ...",
requiredError: "Si us plau contesti la pregunta.",
requiredInAllRowsError: "Si us plau contesti les preguntes de cada filera.",
numericError: "L'estimació ha de ser numèrica.",
textMinLength: "Si us plau entre almenys {0} símbols.",
textMaxLength: "Si us plau entre menys de {0} símbols.",
textMinMaxLength: "Si us plau entre més de {0} i menys de {1} símbols.",
minRowCountError: "Si us plau ompli almenys {0} fileres.",
minSelectError: "Si us plau seleccioni almenys {0} variants.",
maxSelectError: "Si us plau seleccioni no més de {0} variants.",
numericMinMax: "El '{0}' deu ser igual o més de {1} i igual o menys de {2}",
numericMin: "El '{0}' ha de ser igual o més de {1}",
numericMax: "El '{0}' ha de ser igual o menys de {1}",
invalidEmail: "Si us plau afegiu un correu electrònic vàlid.",
urlRequestError: "La sol·licitud va tornar error '{0}'. {1}",
urlGetChoicesError: "La sol·licitud va tornar buida de dates o la propietat 'trajectòria' no és correcta",
exceedMaxSize: "La mida de l'arxiu no pot excedir {0}.",
otherRequiredError: "Si us plau afegiu l'altra estimació.",
uploadingFile: "El seu arxiu s'està pujant. Si us plau esperi uns segons i intenteu-ho de nou.",
addRow: "Afegiu una filera",
removeRow: "Eliminar una filera",
choices_firstItem: "primer article",
choices_secondItem: "segon article",
choices_thirdItem: "tercer article",
matrix_column: "Columna",
matrix_row: "Filera"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ca"] = catalanSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ca"] = "català";
/***/ }),
/* 85 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export czechSurveyStrings */
var czechSurveyStrings = {
pagePrevText: "Předchozí",
pageNextText: "Další",
completeText: "Hotovo",
otherItemText: "Jiná odpověď (napište)",
progressText: "Strana {0} z {1}",
emptySurvey: "Průzkumu neobsahuje žádné otázky.",
completingSurvey: "Děkujeme za vyplnění průzkumu!",
loadingSurvey: "Probíhá načítání průzkumu...",
optionsCaption: "Vyber...",
requiredError: "Odpovězte prosím na otázku.",
requiredInAllRowsError: "Odpovězte prosím na všechny otázky.",
numericError: "V tomto poli lze zadat pouze čísla.",
textMinLength: "Zadejte prosím alespoň {0} znaků.",
textMaxLength: "Zadejte prosím méně než {0} znaků.",
textMinMaxLength: "Zadejte prosím více než {0} a méně než {1} znaků.",
minRowCountError: "Vyplňte prosím alespoň {0} řádků.",
minSelectError: "Vyberte prosím alespoň {0} varianty.",
maxSelectError: "Nevybírejte prosím více než {0} variant.",
numericMinMax: "Odpověď '{0}' by mělo být větší nebo rovno {1} a menší nebo rovno {2}",
numericMin: "Odpověď '{0}' by mělo být větší nebo rovno {1}",
numericMax: "Odpověď '{0}' by mělo být menší nebo rovno {1}",
invalidEmail: "Zadejte prosím platnou e-mailovou adresu.",
urlRequestError: "Požadavek vrátil chybu '{0}'. {1}",
urlGetChoicesError: "Požadavek nevrátil data nebo cesta je neplatná",
exceedMaxSize: "Velikost souboru by neměla být větší než {0}.",
otherRequiredError: "Zadejte prosím jinou hodnotu.",
uploadingFile: "Váš soubor se nahrává. Zkuste to prosím za několik sekund.",
addRow: "Přidat řádek",
removeRow: "Odstranit"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["cz"] = czechSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["cz"] = "čeština";
/***/ }),
/* 86 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export danishSurveyStrings */
var danishSurveyStrings = {
pagePrevText: "Tilbage",
pageNextText: "Videre",
completeText: "Færdig",
startSurveyText: "Start",
otherItemText: "Valgfrit svar...",
noneItemText: "Ingen",
selectAllItemText: "Vælg alle",
progressText: "Side {0} af {1}",
emptySurvey: "Der er ingen synlige spørgsmål.",
completingSurvey: "Mange tak for din besvarelse!",
completingSurveyBefore: "Vores data viser at du allerede har gennemført dette spørgeskema.",
loadingSurvey: "Spørgeskemaet hentes fra serveren...",
optionsCaption: "Vælg...",
value: "værdi",
requiredError: "Besvar venligst spørgsmålet.",
requiredErrorInPanel: "Besvar venligst mindst ét spørgsmål.",
requiredInAllRowsError: "Besvar venligst spørgsmål i alle rækker.",
numericError: "Angiv et tal.",
textMinLength: "Angiv mindst {0} tegn.",
textMaxLength: "Please enter less than {0} characters.",
textMinMaxLength: "Angiv mere end {0} og mindre end {1} tegn.",
minRowCountError: "Udfyld mindst {0} rækker.",
minSelectError: "Vælg venligst mindst {0} svarmulighed(er).",
maxSelectError: "Vælg venligst færre {0} svarmuligheder(er).",
numericMinMax: "'{0}' skal være lig med eller større end {1} og lig med eller mindre end {2}",
numericMin: "'{0}' skal være lig med eller større end {1}",
numericMax: "'{0}' skal være lig med eller mindre end {1}",
invalidEmail: "Angiv venligst en gyldig e-mail adresse.",
invalidExpression: "Udtrykket: {0} skal returnere 'true'.",
urlRequestError: "Forespørgslen returnerede fejlen '{0}'. {1}",
urlGetChoicesError: "Forespørgslen returnerede ingen data eller 'path' parameteren er forkert",
exceedMaxSize: "Filstørrelsen må ikke overstige {0}.",
otherRequiredError: "Angiv en værdi for dit valgfrie svar.",
uploadingFile: "Din fil bliver uploadet. Vent nogle sekunder og prøv eventuelt igen.",
loadingFile: "Indlæser...",
chooseFile: "Vælg fil(er)...",
confirmDelete: "Vil du fjerne den?",
keyDuplicationError: "Denne værdi skal være unik.",
addColumn: "Tilføj kolonne",
addRow: "Tilføj række",
removeRow: "Fjern",
addPanel: "Tilføj ny",
removePanel: "Fjern",
choices_Item: "valg",
matrix_column: "Kolonne",
matrix_row: "Række",
savingData: "Resultaterne bliver gemt på serveren...",
savingDataError: "Der opstod en fejl og vi kunne ikke gemme resultatet.",
savingDataSuccess: "Resultatet blev gemt!",
saveAgainButton: "Prøv igen",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Du har brugt {0} på denne side og {1} i alt.",
timerSpentPage: "Du har brugt {0} på denne side.",
timerSpentSurvey: "Du har brugt {0} i alt.",
timerLimitAll: "Du har brugt {0} af {1} på denne side og {2} af {3} i alt.",
timerLimitPage: "Du har brugt {0} af {1} på denne side.",
timerLimitSurvey: "Du har brugt {0} af {1} i alt.",
cleanCaption: "Rens",
clearCaption: "Fjern",
removeFileCaption: "Fjern denne fil"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["da"] = danishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["da"] = "dansk";
/***/ }),
/* 87 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export dutchSurveyStrings */
//Created on behalf https://github.com/Frank13
//Modified on behalf Roeland Verbakel
var dutchSurveyStrings = {
pagePrevText: "Vorige",
pageNextText: "Volgende",
completeText: "Verzenden",
otherItemText: "Anders, nl.",
progressText: "Pagina {0} van {1}",
emptySurvey: "Er is geen zichtbare pagina of vraag in deze vragenlijst",
completingSurvey: "Bedankt voor het invullen van de vragenlijst",
loadingSurvey: "De vragenlijst is aan het laden...",
optionsCaption: "Kies...",
requiredError: "Dit is een vereiste vraag",
numericError: "Het antwoord moet een getal zijn",
textMinLength: "Vul minstens {0} karakters in",
minSelectError: "Selecteer minimum {0} antwoorden",
maxSelectError: "Selecteer niet meer dan {0} antwoorden",
numericMinMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1} en kleiner of gelijk aan {2}",
numericMin: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
numericMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
invalidEmail: "Vul een geldig e-mailadres in",
exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}",
otherRequiredError: "Vul het veld 'Anders, nl.' in",
requiredInAllRowsError: "Deze vraag vereist één antwoord per rij"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["nl"] = dutchSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["nl"] = "nederlands";
/***/ }),
/* 88 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export finnishSurveyStrings */
var finnishSurveyStrings = {
pagePrevText: "Edellinen",
pageNextText: "Seuraava",
completeText: "Valmis",
otherItemText: "Muu (kuvaile)",
progressText: "Sivu {0}/{1}",
emptySurvey: "Tässä kyselyssä ei ole yhtäkään näkyvillä olevaa sivua tai kysymystä.",
completingSurvey: "Kiitos kyselyyn vastaamisesta!",
loadingSurvey: "Kyselyä ladataan palvelimelta...",
optionsCaption: "Valitse...",
requiredError: "Vastaa kysymykseen, kiitos.",
numericError: "Arvon tulee olla numeerinen.",
textMinLength: "Ole hyvä ja syötä vähintään {0} merkkiä.",
minSelectError: "Ole hyvä ja valitse vähintään {0} vaihtoehtoa.",
maxSelectError: "Ole hyvä ja valitse enintään {0} vaihtoehtoa.",
numericMinMax: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1} ja vähemmän tai yhtä suuri kuin {2}",
numericMin: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1}",
numericMax: "'{0}' täytyy olla vähemmän tai yhtä suuri kuin {1}",
invalidEmail: "Syötä validi sähköpostiosoite.",
otherRequiredError: 'Ole hyvä ja syötä "Muu (kuvaile)"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fi"] = finnishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fi"] = "suomalainen";
/***/ }),
/* 89 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export frenchSurveyStrings */
var frenchSurveyStrings = {
pagePrevText: "Précédent",
pageNextText: "Suivant",
completeText: "Terminer",
startSurveyText: "Commencer",
otherItemText: "Autre (préciser)",
noneItemText: "Aucun",
selectAllItemText: "Tout sélectionner",
progressText: "Page {0} sur {1}",
emptySurvey: "Il n'y a ni page visible ni question visible dans ce questionnaire",
completingSurvey: "Merci d'avoir répondu au questionnaire !",
completingSurveyBefore: "Nos données indiquent que vous avez déjà rempli ce questionnaire.",
loadingSurvey: "Le questionnaire est en cours de chargement...",
optionsCaption: "Choisissez...",
value: "valeur",
requiredError: "La réponse à cette question est obligatoire.",
requiredErrorInPanel: "Merci de répondre au moins à une question.",
requiredInAllRowsError: "Toutes les lignes sont obligatoires",
numericError: "La réponse doit être un nombre.",
textMinLength: "Merci de saisir au moins {0} caractères.",
textMaxLength: "Merci de saisir moins de {0} caractères.",
textMinMaxLength: "Merci de saisir entre {0} et {1} caractères.",
minRowCountError: "Merci de compléter au moins {0} lignes.",
minSelectError: "Merci de sélectionner au minimum {0} réponses.",
maxSelectError: "Merci de sélectionner au maximum {0} réponses.",
numericMinMax: "Votre réponse '{0}' doit être supérieure ou égale à {1} et inférieure ou égale à {2}",
numericMin: "Votre réponse '{0}' doit être supérieure ou égale à {1}",
numericMax: "Votre réponse '{0}' doit être inférieure ou égale à {1}",
invalidEmail: "Merci d'entrer une adresse mail valide.",
invalidExpression: "L'expression: {0} doit retourner 'true'.",
urlRequestError: "La requête a renvoyé une erreur '{0}'. {1}",
urlGetChoicesError: "La requête a renvoyé des données vides ou la propriété 'path' est incorrecte",
exceedMaxSize: "La taille du fichier ne doit pas excéder {0}.",
otherRequiredError: "Merci de préciser le champ 'Autre'.",
uploadingFile: "Votre fichier est en cours de chargement. Merci d'attendre quelques secondes et de réessayer.",
loadingFile: "Chargement...",
chooseFile: "Ajouter des fichiers...",
confirmDelete: "Voulez-vous supprimer cet enregistrement ?",
keyDuplicationError: "Cette valeur doit être unique.",
addColumn: "Ajouter une colonne",
addRow: "Ajouter une ligne",
removeRow: "Supprimer",
addPanel: "Ajouter",
removePanel: "Supprimer",
choices_Item: "item",
matrix_column: "Colonne",
matrix_row: "Ligne",
savingData: "Les résultats sont en cours de sauvegarde sur le serveur...",
savingDataError: "Une erreur est survenue et a empêché la sauvegarde des résultats.",
savingDataSuccess: "Les résultats ont bien été enregistrés !",
saveAgainButton: "Réessayer",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Vous avez passé {0} sur cette page et {1} au total.",
timerSpentPage: "Vous avez passé {0} sur cette page.",
timerSpentSurvey: "Vous avez passé {0} au total.",
timerLimitAll: "Vous avez passé {0} sur {1} sur cette page et {2} sur {3} au total.",
timerLimitPage: "Vous avez passé {0} sur {1} sur cette page.",
timerLimitSurvey: "Vous avez passé {0} sur {1} au total.",
cleanCaption: "Nettoyer",
clearCaption: "Vider",
removeFileCaption: "Enlever ce fichier",
booleanCheckedLabel: "Oui",
booleanUncheckedLabel: "Non"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fr"] = frenchSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fr"] = "français";
/***/ }),
/* 90 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export georgianSurveyStrings */
var georgianSurveyStrings = {
pagePrevText: "უკან",
pageNextText: "შემდეგ",
completeText: "დასრულება",
progressText: "გვერდი {0} / {1}",
emptySurvey: "არცერთი კითხვა არ არის.",
completingSurvey: "გმადლობთ კითხვარის შევსებისთვის!",
loadingSurvey: "ჩატვირთვა სერვერიდან...",
otherItemText: "სხვა (გთხოვთ მიუთითეთ)",
optionsCaption: "არჩევა...",
requiredError: "გთხოვთ უპასუხეთ კითხვას.",
numericError: "პასუხი უნდა იყოს რიცხვი.",
textMinLength: "გთხოვთ შეიყვანეთ არანაკლებ {0} სიმბოლო.",
minSelectError: "გთხოვთ აირჩიეთ არანაკლებ {0} ვარიანტი.",
maxSelectError: "გთხოვთ აირჩიეთ არაუმეტეს {0} ვარიანტი.",
numericMinMax: "'{0}' უნდა იყოს მეტი ან ტოლი, ვიდრე {1}, და ნაკლები ან ტოლი ვიდრე {2}",
numericMin: "'{0}' უნდა იყოს მეტი ან ტოლი ვიდრე {1}",
numericMax: "'{0}' უნდა იყოს ნაკლები ან ტოლი ვიდრე {1}",
invalidEmail: "გთხოვთ შეიყვანოთ ელ. ფოსტის რეალური მისამართი.",
otherRequiredEror: "გთხოვთ შეავსეთ ველი 'სხვა'"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ka"] = georgianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ka"] = "ქართული";
/***/ }),
/* 91 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export germanSurveyStrings */
var germanSurveyStrings = {
pagePrevText: "Zurück",
pageNextText: "Weiter",
completeText: "Abschließen",
startSurveyText: "Start",
otherItemText: "Sonstiges (Beschreibung)",
noneItemText: "Nichts",
selectAllItemText: "Alle auswählen",
progressText: "Seite {0} von {1}",
emptySurvey: "Es ist keine Frage vorhanden.",
completingSurvey: "Danke, dass Sie die Umfrage abgeschlossen haben!",
completingSurveyBefore: "Wir haben festgestellt, dass Sie diese Umfrage bereits abgeschlossen haben.",
loadingSurvey: "Fragebogen wird geladen...",
optionsCaption: "Bitte auswählen...",
value: "Wert",
requiredError: "Bitte beantworten Sie diese Frage.",
requiredErrorInPanel: "Bitte beantworten Sie mindestens eine Frage.",
requiredInAllRowsError: "Bitte beantworten Sie alle Fragen.",
numericError: "Der Wert muss eine Zahl sein.",
textMinLength: "Bitte geben sie mindestens {0} Zeichen ein.",
textMaxLength: "Bitte geben Sie nicht mehr als {0} Zeichen ein.",
textMinMaxLength: "Bitte geben sie mindestens {0} und maximal {1} Zeichen ein.",
minRowCountError: "Bitte machen Sie in mindestens {0} Zeilen eine Eingabe.",
minSelectError: "Bitte wählen Sie mindestens {0} Variante(n) aus.",
maxSelectError: "Bitte wählen Sie nicht mehr als {0} Variante(n) aus.",
numericMinMax: "'{0}' muss größer oder gleich {1} und kleiner oder gleich {2} sein",
numericMin: "'{0}' muss größer oder gleich {1} sein",
numericMax: "'{0}' muss kleiner oder gleich {1} sein",
invalidEmail: "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
invalidExpression: "Der Ausdruck: {0} muss den Wert 'wahr'(true) zurückliefern.",
urlRequestError: "Die Anfrage lieferte den folgenden Fehler zurück '{0}'. {1}",
urlGetChoicesError: "Die Anfrage lieferte leere Daten zurück oder der Wert der Variable 'path' ist falsch",
exceedMaxSize: "Die Dateigröße darf {0} nicht überschreiten.",
otherRequiredError: "Bitte geben Sie den anderen Wert ein.",
uploadingFile: "Ihre Datei wird hochgeladen. Bitte warten Sie ein paar Sekunden und versuchen Sie es dann erneut.",
loadingFile: "Wird geladen...",
chooseFile: "Datei(en) auswählen...",
confirmDelete: "Wollen Sie den Eintrag löschen?",
keyDuplicationError: "Dieser Wert muss eindeutig sein.",
addColumn: "Spalte hinzufügen",
addRow: "Zeile hinzufügen",
removeRow: "Entfernen",
addPanel: "Neu hinzufügen",
removePanel: "Entfernen",
choices_Item: "Element",
matrix_column: "Spalte",
matrix_row: "Zeile",
savingData: "Die Ergebnisse werden auf dem Server gespeichert...",
savingDataError: "Es ist ein Fehler aufgetreten. Die Ergebnisse konnten nicht gespeichert werden.",
savingDataSuccess: "Die Ergebnisse wurden gespeichert!",
saveAgainButton: "Bitte versuchen Sie es erneut",
timerMin: "Min.",
timerSec: "Sek.",
timerSpentAll: "Sie waren {0} auf dieser Seite und insgesamt {1}.",
timerSpentPage: "Sie waren {0} auf dieser Seite.",
timerSpentSurvey: "Sie haben insgesamt {0} benötigt.",
timerLimitAll: "Sie waren {0} von {1} auf dieser Seite und insgesamt {2} von {3}.",
timerLimitPage: "Sie waren {0} von {1} auf dieser Seite.",
timerLimitSurvey: "Sie haben insgesamt {0} von {1} benötigt.",
cleanCaption: "Sauber",
clearCaption: "Leeren",
removeFileCaption: "Datei löschen"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["de"] = germanSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["de"] = "deutsch";
/***/ }),
/* 92 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export greekSurveyStrings */
//Created by https://github.com/agelospanagiotakis
var greekSurveyStrings = {
pagePrevText: "Προηγούμενο",
pageNextText: "Επόμενο",
completeText: "Ολοκλήρωση",
otherItemText: "Άλλο (παρακαλώ διευκρινίστε)",
progressText: "Σελίδα {0} από {1}",
emptySurvey: "Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.",
completingSurvey: "Ευχαριστούμε για την συμπλήρωση αυτού του ερωτηματολογίου!",
loadingSurvey: "Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...",
optionsCaption: "Επιλέξτε...",
requiredError: "Παρακαλώ απαντήστε στην ερώτηση.",
requiredInAllRowsError: "Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.",
numericError: "Η τιμή πρέπει να είναι αριθμητική.",
textMinLength: "Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.",
minRowCountError: "Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.",
minSelectError: "Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.",
maxSelectError: "Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.",
numericMinMax: "Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}",
numericMin: "Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}",
numericMax: "Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}",
invalidEmail: "Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.",
urlRequestError: "Η αίτηση επέστρεψε σφάλμα '{0}'. {1}",
urlGetChoicesError: "Η αίτηση επέστρεψε κενά δεδομένα ή η ιδιότητα 'μονοπάτι/path' είναι εσφαλμένη",
exceedMaxSize: "Το μέγεθος δεν μπορεί να υπερβαίνει τα {0}.",
otherRequiredError: "Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.",
uploadingFile: "Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.",
addRow: "Προσθήκη γραμμής",
removeRow: "Αφαίρεση"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["gr"] = greekSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["gr"] = "ελληνικά";
/***/ }),
/* 93 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export hebrewSurveyStrings */
var hebrewSurveyStrings = {
pagePrevText: "אחורה",
pageNextText: "קדימה",
completeText: "סיום",
progressText: "דף {1} מתוך {0}",
emptySurvey: "אין שאלות",
completingSurvey: "תודה על מילוי השאלון!",
loadingSurvey: "טעינה מהשרת...",
otherItemText: "אחר (נא לתאר)",
optionsCaption: "בחר...",
requiredError: "אנא השב על השאלה",
numericError: "התשובה צריכה להיות מספר.",
textMinLength: "הזן לפחות {0} תווים.",
minSelectError: "בחר לפחות {0} אפשרויות.",
maxSelectError: "בחר עד {0} אפשרויות.",
numericMinMax: "'{0}' חייב להיות שווה או גדול מ {1}, ושווה ל- {2} או פחות מ- {}}",
numericMin: "'{0}' חייב להיות שווה או גדול מ {1}",
numericMax: "'{0}' חייב להיות שווה או קטן מ {1}",
invalidEmail: 'הזן כתובת דוא"ל חוקית.',
otherRequiredError: 'נא להזין נתונים בשדה "אחר"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["he"] = hebrewSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["he"] = "עברית";
/***/ }),
/* 94 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export hungarianSurveyStrings */
var hungarianSurveyStrings = {
pagePrevText: "Vissza",
pageNextText: "Tovább",
completeText: "Kész",
otherItemText: "Egyéb (adja meg)",
progressText: "{0}./{1} oldal",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Köszönjük, hogy kitöltötte felmérésünket!",
completingSurveyBefore: "Már kitöltötte a felmérést.",
loadingSurvey: "Felmérés betöltése...",
optionsCaption: "Válasszon...",
value: "érték",
requiredError: "Kérjük, válaszolja meg ezt a kérdést!",
requiredInAllRowsError: "Kérjük adjon választ minden sorban!",
numericError: "Az érték szám kell, hogy legyen!",
textMinLength: "Adjon meg legalább {0} karaktert!",
textMaxLength: "Legfeljebb {0} karaktert adjon meg!",
textMinMaxLength: "Adjon meg legalább {0}, de legfeljebb {1} karaktert!",
minRowCountError: "Töltsön ki minimum {0} sort!",
minSelectError: "Válasszon ki legalább {0} lehetőséget!",
maxSelectError: "Ne válasszon többet, mint {0} lehetőség!",
numericMinMax: "'{0}' legyen nagyobb, vagy egyenlő, mint {1} és kisebb, vagy egyenlő, mint {2}!",
numericMin: "'{0}' legyen legalább {1}!",
numericMax: "The '{0}' ne legyen nagyobb, mint {1}!",
invalidEmail: "Adjon meg egy valós email címet!",
urlRequestError: "A lekérdezés hibával tért vissza: '{0}'. {1}",
urlGetChoicesError: "A lekérdezés üres adattal tért vissza, vagy a 'path' paraméter helytelen.",
exceedMaxSize: "A méret nem lehet nagyobb, mint {0}.",
otherRequiredError: "Adja meg az egyéb értéket!",
uploadingFile: "Feltöltés folyamatban. Várjon pár másodpercet, majd próbálja újra.",
confirmDelete: "Törli ezt a rekordot?",
keyDuplicationError: "Az értéknek egyedinek kell lennie.",
addRow: "Sor hozzáadása",
removeRow: "Eltávolítás",
addPanel: "Új hozzáadása",
removePanel: "Eltávolítás",
choices_Item: "elem",
matrix_column: "Oszlop",
matrix_row: "Sor",
savingData: "Eredmény mentése a szerverre...",
savingDataError: "Egy hiba folytán nem tudtuk elmenteni az eredményt.",
savingDataSuccess: "Eredmény sikeresen mentve!",
saveAgainButton: "Próbálja újra"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["hu"] = hungarianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["hu"] = "magyar";
/***/ }),
/* 95 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export icelandicSurveyStrings */
var icelandicSurveyStrings = {
pagePrevText: "Tilbaka",
pageNextText: "Áfram",
completeText: "Lokið",
otherItemText: "Hinn (skýring)",
progressText: "Síða {0} of {1}",
emptySurvey: "Það er enginn síða eða spurningar í þessari könnun.",
completingSurvey: "Takk fyrir að fyllja út þessa könnun!",
loadingSurvey: "Könnunin er að hlaða...",
optionsCaption: "Veldu...",
requiredError: "Vinsamlegast svarið spurningunni.",
requiredInAllRowsError: "Vinsamlegast svarið spurningum í öllum röðum.",
numericError: "Þetta gildi verður að vera tala.",
textMinLength: "Það ætti að vera minnst {0} tákn.",
textMaxLength: "Það ætti að vera mest {0} tákn.",
textMinMaxLength: "Það ætti að vera fleiri en {0} og færri en {1} tákn.",
minRowCountError: "Vinsamlegast fyllið úr að minnsta kosti {0} raðir.",
minSelectError: "Vinsamlegast veljið að minnsta kosti {0} möguleika.",
maxSelectError: "Vinsamlegast veljið ekki fleiri en {0} möguleika.",
numericMinMax: "'{0}' ætti að vera meira en eða jafnt og {1} minna en eða jafnt og {2}",
numericMin: "{0}' ætti að vera meira en eða jafnt og {1}",
numericMax: "'{0}' ætti að vera minna en eða jafnt og {1}",
invalidEmail: "Vinsamlegast sláið inn gilt netfang.",
urlRequestError: "Beiðninn skilaði eftirfaranadi villu '{0}'. {1}",
urlGetChoicesError: "Beiðninng skilaði engum gögnum eða slóðinn var röng",
exceedMaxSize: "Skráinn skal ekki vera stærri en {0}.",
otherRequiredError: "Vinamlegast fyllið út hitt gildið.",
uploadingFile: "Skráinn þín var send. Vinsamlegast bíðið í nokkrar sekúndur og reynið aftur.",
addRow: "Bæta við röð",
removeRow: "Fjarlægja",
choices_firstItem: "fyrsti hlutur",
choices_secondItem: "annar hlutur",
choices_thirdItem: "þriðji hlutur",
matrix_column: "Dálkur",
matrix_row: "Röð"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["is"] = icelandicSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["is"] = "íslenska";
/***/ }),
/* 96 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export indonesianStrings */
var indonesianStrings = {
pagePrevText: "Sebelumnya",
pageNextText: "Selanjutnya",
completeText: "Selesai",
startSurveyText: "Mulai",
otherItemText: "Lainnya (jelaskan)",
noneItemText: "Tidak Ada",
selectAllItemText: "Pilih Semua",
progressText: "Halaman {0} dari {1}",
emptySurvey: "Tidak ada halaman atau pertanyaan dalam survei.",
completingSurvey: "Terima kasih telah menyelesaikan survei!",
completingSurveyBefore: "Catatan kami menunjukkan bahwa Anda telah menyelesaikan survei ini.",
loadingSurvey: "Memuat survei...",
optionsCaption: "Pilih...",
value: "nilai",
requiredError: "Silahkan jawab pertanyaan berikut.",
requiredErrorInPanel: "Silahkan jawab setidaknya satu petanyaan.",
requiredInAllRowsError: "Silahkan jawab pertanyaan pada semua baris.",
numericError: "Nilai harus berupa angka.",
textMinLength: "Silahkan masukkan setidaknya {0} karakter.",
textMaxLength: "Silahkan masukkan kurang {0} karakter.",
textMinMaxLength: "PSilahkan masukkan lebih dari {0} dan kurang dari {1} karakter.",
minRowCountError: "Silahkan isi setidaknya {0} baris.",
minSelectError: "Silahkan pilih setidaknya {0} varian.",
maxSelectError: "Silahkan pilih tidak lebih dari {0} varian.",
numericMinMax: "'{0}' harus sama dengan atau lebih dari {1} dan harus sama dengan atau kurang dari {2}",
numericMin: "'{0}' harus sama dengan atau lebih dari {1}",
numericMax: "'{0}' harus sama dengan atau kurang dari {1}",
invalidEmail: "Silahkan masukkan e-mail yang benar.",
invalidExpression: "Ekspresi: {0} harus mengembalikan 'benar'.",
urlRequestError: "Permintaan mengembalikan kesalahan '{0}'. {1}",
urlGetChoicesError: "Permintaan mengembalikan data kosong atau properti 'path' salah.",
exceedMaxSize: "Ukuran berkas tidak boleh melebihi {0}.",
otherRequiredError: "Silahkan masukkan nilai lainnnya.",
uploadingFile: "Berkas Anda sedang diunggah. Silahkan tunggu beberapa saat atau coba lagi.",
loadingFile: "Memuat...",
chooseFile: "Pilih berkas...",
confirmDelete: "Apakah Anda ingin menghapus catatan?",
keyDuplicationError: "Nilai harus unik.",
addColumn: "Tambah kolom",
addRow: "Tambah baris",
removeRow: "Hapus",
addPanel: "Tambah baru",
removePanel: "Hapus",
choices_Item: "item",
matrix_column: "Kolom",
matrix_row: "Baris",
savingData: "Hasil sedang disimpan pada server...",
savingDataError: "Kesalahan terjadi dan kami tidak dapat menyimpan hasil.",
savingDataSuccess: "Hasil telah sukses disimpan!",
saveAgainButton: "Coba lagi",
timerMin: "menit",
timerSec: "detik",
timerSpentAll: "Anda telah menghabiskan {0} pada halaman ini dan {1} secara keseluruhan.",
timerSpentPage: "YAnda telah menghabiskan {0} pada halaman ini.",
timerSpentSurvey: "Anda telah menghabiskan {0} secara keseluruhan.",
timerLimitAll: "Anda telah menghabiskan {0} dari {1} pada halaman ini dan {2} dari {3} secara keseluruhan.",
timerLimitPage: "Anda telah menghabiskan {0} dari {1} pada halaman ini.",
timerLimitSurvey: "Anda telah menghabiskan {0} dari {1} secara keseluruhan.",
cleanCaption: "Bersihkan",
clearCaption: "Bersihkan",
removeFileCaption: "Hapus berkas ini"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["id"] = indonesianStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["id"] = "Bahasa Indonesia";
/***/ }),
/* 97 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export italianSurveyStrings */
var italianSurveyStrings = {
pagePrevText: "Precedente",
pageNextText: "Successivo",
completeText: "Salva",
startSurveyText: "Inizio",
otherItemText: "Altro (descrivi)",
progressText: "Pagina {0} di {1}",
emptySurvey: "Non ci sono pagine o domande visibili nel questionario.",
completingSurvey: "Grazie per aver completato il questionario!",
completingSurveyBefore: "I nostri records mostrano che hai già completato questo questionario.",
loadingSurvey: "Caricamento del questionario in corso...",
optionsCaption: "Scegli...",
value: "valore",
requiredError: "Campo obbligatorio",
requiredErrorInPanel: "Per Favore, rispondi ad almeno una domanda.",
requiredInAllRowsError: "Completare tutte le righe",
numericError: "Il valore deve essere numerico",
textMinLength: "Inserire almeno {0} caratteri",
textMaxLength: "Lunghezza massima consentita {0} caratteri",
textMinMaxLength: "Inserire una stringa con minimo {0} e massimo {1} caratteri",
minRowCountError: "Completare almeno {0} righe.",
minSelectError: "Selezionare almeno {0} varianti.",
maxSelectError: "Selezionare massimo {0} varianti.",
numericMinMax: "'{0}' deve essere uguale o superiore a {1} e uguale o inferiore a {2}",
numericMin: "'{0}' deve essere uguale o superiore a {1}",
numericMax: "'{0}' deve essere uguale o inferiore a {1}",
invalidEmail: "Inserire indirizzo mail valido",
urlRequestError: "La richiesta ha risposto con un errore '{0}'. {1}",
urlGetChoicesError: "La richiesta ha risposto null oppure il percorso non è corretto",
exceedMaxSize: "Il file non può eccedere {0}",
otherRequiredError: "Inserire il valore 'altro'",
uploadingFile: "File in caricamento. Attendi alcuni secondi e riprova",
confirmDelete: "Sei sicuro di voler elminare il record?",
keyDuplicationError: "Questo valore deve essere univoco.",
addRow: "Aggiungi riga",
removeRow: "Rimuovi riga",
addPanel: "Aggiungi riga",
removePanel: "Elimina",
choices_Item: "Elemento",
matrix_column: "Colonna",
matrix_row: "Riga",
savingData: "Salvataggio dati sul server...",
savingDataError: "Si è verificato un errore e non è stato possibile salvare i risultati.",
savingDataSuccess: "I risultati sono stati salvati con successo!",
saveAgainButton: "Riprova",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Hai impiegato {0} su questa pagina e {1} in totale.",
timerSpentPage: "Hai impiegato {0} su questa pagina.",
timerSpentSurvey: "Hai impiegato {0} in totale.",
timerLimitAll: "Hai impiegato {0} di {1} su questa pagina e {2} di {3} in totale.",
timerLimitPage: "Hai impiegato {0} di {1} su questa pagina.",
timerLimitSurvey: "Hai impiegato {0} di {1} in totale.",
cleanCaption: "Pulisci"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["it"] = italianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["it"] = "italiano";
/***/ }),
/* 98 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export japaneseSurveyStrings */
// Uncomment this line on creating a translation file
var japaneseSurveyStrings = {
pagePrevText: "前の",
pageNextText: "次へ",
completeText: "完了",
startSurveyText: "スタート",
otherItemText: "その他(説明)",
noneItemText: "なし",
selectAllItemText: "すべて選択",
progressText: "{0}/{1}頁",
emptySurvey: "この調査に表示できるページや質問はありません",
completingSurvey: "調査を完了してくれてありがとうございました",
loadingSurvey: "調査をダウンロード中",
optionsCaption: "選択",
requiredError: "質問にお答え下さい",
numericError: "数字でご記入下さい",
textMinLength: "{0} 文字以上で入力して下さい",
minRowCountError: "{0}行以上で入力して下さい",
minSelectError: "{0}種類以上を選択して下さい",
numericMin: "'{0}' は同等か{1}より大きくなければなりません",
numericMax: "'{0}' は同等か{1}より小さくなければなりません",
invalidEmail: "有効なメールアドレスをご記入下さい",
exceedMaxSize: "ファイルのサイズは{0}を超えてはいけません",
uploadingFile: "ファイルをアップロード中です。しばらくしてから再度お試し下さい",
loadingFile: "読み込み中",
chooseFile: "ファイルを選択",
cleanCaption: "削除",
clearCaption: "空白",
removeFileCaption: "このファイルを削除"
};
//Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable.
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ja"] = japaneseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ja"] = "日本語";
/***/ }),
/* 99 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export koreanStrings */
var koreanStrings = {
pagePrevText: "이전",
pageNextText: "다음",
completeText: "완료",
startSurveyText: "시작",
otherItemText: "기타(설명)",
progressText: "페이지 {1} 중 {0}",
emptySurvey: "설문지에 보여지는 페이지나 질문이 없습니다",
completingSurvey: "설문 조사를 완료해 주셔서 감사합니다!",
completingSurveyBefore: "기록에 따르면 이미 설문 조사를 마치셨습니다.",
loadingSurvey: "설문조사가 로드중입니다...",
optionsCaption: "선택하십시오...",
value: "값",
requiredError: "질문에 답하시오.",
requiredErrorInPanel: "하나 이상의 질문에 답하십시오.",
requiredInAllRowsError: "모든 행에 있는 질문에 답하십시오.",
numericError: "값은 숫자여야 합니다.",
textMinLength: "답변의 길이는 최소 {0}자여야 입니다.",
textMaxLength: "답변의 길이는 {0}자를 초과 할 수 없습니다.",
textMinMaxLength: "답변의 길이는 {0} - {1}자 사이여야 합니다.",
minRowCountError: "최소 {0}개의 행을 채우십시오",
minSelectError: "최소 {0}개의 변수를 선택하십시오.",
maxSelectError: "최대 {0}개의 변수를 선택하십시오.",
numericMinMax: "'{0}'은 {1}보다 크거나 같고 {2}보다 작거나 같아야합니다.",
numericMin: "'{0}'은 {1}보다 크거나 같아야합니다.",
numericMax: "'{0}'은 {1}보다 작거나 같아야합니다.",
invalidEmail: "올바른 이메일 주소를 입력하십시오.",
invalidExpression: "표현식: {0}은 '참'이어야 합니다.",
urlRequestError: "'{0}'으로 잘못된 요청입니다. {1}",
urlGetChoicesError: "비어있는 데이터를 요청했거나 잘못된 속성의 경로입니다.",
exceedMaxSize: "파일 크기가 {0}을 초과 할 수 없습니다.",
otherRequiredError: "다른 질문을 작성하십시오.",
uploadingFile: "파일 업로드 중입니다. 잠시 후 다시 시도하십시오.",
loadingFile: "로드 중...",
chooseFile: "파일 선택...",
confirmDelete: "기록을 삭제하시겠습니까?",
keyDuplicationError: " 이 값은 고유해야합니다.",
addColumn: "열 추가",
addRow: "행 추가",
removeRow: "제거",
addPanel: "새롭게 추가",
removePanel: "제거",
choices_Item: "항목",
matrix_column: "열",
matrix_row: "행",
savingData: "결과가 서버에 저장 중입니다...",
savingDataError: "오류가 발생하여 결과를 저장할 수 없습니다.",
savingDataSuccess: "결과가 성공적으로 저장되었습니다!",
saveAgainButton: "다시 시도하십시오",
timerMin: "분",
timerSec: "초",
timerSpentAll: "현재 페이지에서 {0}을 소요해 총 {1}이 걸렸습니다.",
timerSpentPage: "현재 페이지에서 {0]이 걸렸습니다",
timerSpentSurvey: "총 {0}이 걸렸습니다.",
timerLimitAll: "현재 페이지에서 {0}/{1}을 소요해 총 {2}/{3}이 걸렸습니다.",
timerLimitPage: "현재 페이지에서 {0}/{1}이 걸렸습니다.",
timerLimitSurvey: "총 {0}/{1}이 걸렸습니다.",
cleanCaption: "닦기",
clearCaption: "지우기"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ko"] = koreanStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ko"] = "한국어";
/***/ }),
/* 100 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export latvianSurveyStrings */
var latvianSurveyStrings = {
pagePrevText: "Atpakaļ",
pageNextText: "Tālāk",
completeText: "Pabeigt",
progressText: "Lappuse {0} no {1}",
emptySurvey: "Nav neviena jautājuma.",
completingSurvey: "Pateicamies Jums par anketas aizpildīšanu!",
loadingSurvey: "Ielāde no servera...",
otherItemText: "Cits (lūdzu, aprakstiet!)",
optionsCaption: "Izvēlēties...",
requiredError: "Lūdzu, atbildiet uz jautājumu!",
numericError: "Atbildei ir jābūt skaitlim.",
textMinLength: "Lūdzu, ievadiet vismaz {0} simbolus.",
minSelectError: "Lūdzu, izvēlieties vismaz {0} variantu.",
maxSelectError: "Lūdzu, izvēlieties ne vairak par {0} variantiem.",
numericMinMax: "'{0}' jābūt vienādam vai lielākam nekā {1}, un vienādam vai mazākam, nekā {2}",
numericMin: "'{0}' jābūt vienādam vai lielākam {1}",
numericMax: "'{0}' jābūt vienādam vai lielākam {1}",
invalidEmail: "Lūdzu, ievadiet patiesu e-pasta adresi!",
otherRequiredError: 'Lūdzu, ievadiet datus laukā "Cits"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["lv"] = latvianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["lv"] = "latviešu";
/***/ }),
/* 101 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export lithuaniaSurveyStrings */
//Uncomment this line on creating a translation file
var lithuaniaSurveyStrings = {
pagePrevText: "Atgal",
pageNextText: "Toliau",
completeText: "Baigti",
startSurveyText: "Pradėti",
otherItemText: "Kita (įvesti)",
noneItemText: "Nėra",
selectAllItemText: "Pasirinkti visus",
progressText: "Puslapis {0} iš {1}",
emptySurvey: "Apklausoje nėra matomo puslapio ar klausimo.",
completingSurvey: "Dėkojame už dalyvavimą apklausoje!",
completingSurveyBefore: "Mūsų įrašai rodo, kad jau atlikote šią apklausą.",
loadingSurvey: "Prašome palaukti...",
optionsCaption: "Pasirinkti...",
value: "reikšmė",
requiredError: "Būtina atsakyti į šį klausimą.",
requiredErrorInPanel: "Būtina atsakyti bent į vieną klausimą.",
requiredInAllRowsError: "Prašome atsakyti į klausimus visose eilutėse.",
numericError: "Turi būti skaičiai.",
textMinLength: "Prašome suvesti bent {0} simbolius.",
textMaxLength: "Prašome suvesti mažiau nei {0} simbolių.",
textMinMaxLength: "Prašome suvesti daugiau nei {0} ir mažiau nei {1} simbolių.",
minRowCountError: "Prašome suvesti ne mažiau nei {0} eilučių.",
minSelectError: "Prašome pasirinkti bent {0} variantų.",
maxSelectError: "Pasirinkite ne daugiau kaip {0} variantus.",
numericMinMax: "'{0}' turi būti lygus arba didesnis nei {1} ir lygus arba mažesnis nei {2}",
numericMin: "'{0}' turėtų būti lygus arba didesnis nei {1}",
numericMax: "'{0}' turėtų būti lygus ar mažesnis už {1}",
invalidEmail: "Prašome įvesti galiojantį elektroninio pašto adresą.",
invalidExpression: "Reikšmė: {0} turi grąžinti 'true'.",
urlRequestError: "Užklausa grąžino klaidą'{0}'. {1}",
urlGetChoicesError: "Užklausa grąžino tuščius duomenis arba 'path' savybė yra neteisinga",
exceedMaxSize: "Failo dydis neturi viršyti {0}.",
otherRequiredError: "Įveskite kitą reikšmę.",
uploadingFile: "Jūsų failas yra keliamas. Palaukite keletą sekundžių ir bandykite dar kartą.",
loadingFile: "Prašome palaukti...",
chooseFile: "Pasirinkti failą(us)...",
confirmDelete: "Ar norite ištrinti įrašą?",
keyDuplicationError: "Ši reikšmė turėtų būti unikali.",
addColumn: "Pridėti stulpelį",
addRow: "Pridėti eilutę",
removeRow: "Ištrinti",
addPanel: "Pridėti naują",
removePanel: "Ištrinti",
choices_Item: "elementas",
matrix_column: "Stulpelis",
matrix_row: "Eilutė",
savingData: "Rezultatai saugomi serveryje...",
savingDataError: "Įvyko klaida ir mes negalėjome išsaugoti rezultatų.",
savingDataSuccess: "Rezultatai buvo išsaugoti sėkmingai!",
saveAgainButton: "Bandyti dar kartą",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Praleidote {0} šiame puslapyje ir {1} iš viso.",
timerSpentPage: "Praleidote {0} šiame puslapyje.",
timerSpentSurvey: "Praleidote {0} iš viso.",
timerLimitAll: "Praleidote {0} iš {1} šiame puslapyje ir {2} iš {3} iš viso.",
timerLimitPage: "Praleidote {0} iš {1} šiame puslapyje.",
timerLimitSurvey: "Praleidote {0} iš {1} iš viso.",
cleanCaption: "Išvalyti",
clearCaption: "Valyti",
removeFileCaption: "Ištrinti šį failą"
};
//Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable.
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["lt"] = lithuaniaSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["lt"] = "Lietuvių";
/***/ }),
/* 102 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export norwegianSurveyStrings */
var norwegianSurveyStrings = {
pagePrevText: "Forrige",
pageNextText: "Neste",
completeText: "Fullfør",
startSurveyText: "Start",
otherItemText: "Annet (beskriv)",
progressText: "Side {0} av {1}",
emptySurvey: "Det er ingen synlig side eller spørsmål i undersøkelsen.",
completingSurvey: "Takk for at du fullførte undersøkelsen!",
completingSurveyBefore: "Våre data viser at du allerede har gjennomført denne undersøkelsen.",
loadingSurvey: "Undersøkelsen laster...",
optionsCaption: "Velg...",
value: "verdi",
requiredError: "Vennligst svar på spørsmålet.",
requiredErrorInPanel: "Vennligst svar på minst ett spørsmål.",
requiredInAllRowsError: "Vennligst svar på spørsmål i alle rader.",
numericError: "Verdien skal være numerisk.",
textMinLength: "Vennligst skriv inn minst {0} tegn.",
textMaxLength: "Vennligst skriv inn mindre enn {0} tegn.",
textMinMaxLength: "Vennligst skriv inn mer enn {0} og mindre enn {1} tegn.",
minRowCountError: "Vennligst fyll inn minst {0} rader.",
minSelectError: "Vennligst velg minst {0} varianter.",
maxSelectError: "Vennligst ikke velg mer enn {0} varianter.",
numericMinMax: "'{0}' bør være lik eller mer enn {1} og lik eller mindre enn {2}",
numericMin: "'{0}' bør være lik eller mer enn {1}",
numericMax: "'{0}' bør være lik eller mindre enn {1}",
invalidEmail: "Vennligst skriv inn en gyldig e-post adresse.",
urlRequestError: "Forespørselen returnerte feilen '{0}'. {1}",
urlGetChoicesError: "Forespørselen returnerte tomme data, eller 'sti' -egenskapen er feil",
exceedMaxSize: "Filstørrelsen bør ikke overstige {0}.",
otherRequiredError: "Vennligst skriv inn den andre verdien.",
uploadingFile: "Filen din lastes opp. Vennligst vent noen sekunder og prøv igjen.",
confirmDelete: "Ønsker du å slette posten?",
keyDuplicationError: "Denne verdien skal være unik.",
addRow: "Legg til rad",
removeRow: "Fjern",
addPanel: "Legg til ny",
removePanel: "Fjerne",
choices_Item: "element",
matrix_column: "Kolonne",
matrix_row: "Rad",
savingData: "Resultatene lagres på serveren ...",
savingDataError: "Det oppsto en feil, og vi kunne ikke lagre resultatene.",
savingDataSuccess: "Resultatene ble lagret!",
saveAgainButton: "Prøv igjen",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Du har tilbrakt {0} på denne siden og {1} totalt.",
timerSpentPage: "Du har tilbrakt {0} på denne siden.",
timerSpentSurvey: "Du har tilbrakt {0} totalt.",
timerLimitAll: "Du har tilbrakt {0} av {1} på denne siden og totalt {2} av {3}.",
timerLimitPage: "Du har tilbrakt {0} av {1} på denne siden.",
timerLimitSurvey: "Du har tilbrakt {0} av {1} totalt.",
cleanCaption: "Rens"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["no"] = norwegianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["no"] = "norsk";
/***/ }),
/* 103 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export persianSurveyStrings */
var persianSurveyStrings = {
pagePrevText: "قبلی",
pageNextText: "بعدی",
completeText: "تکمیل",
otherItemText: "دیگر(توضیح)",
progressText: "صفحه {0} از {1}",
emptySurvey: "صفحه ای یا گزینه ای برای این پرسشنامه موجود نیست.",
completingSurvey: "از شما بابت تکمیل این پرسشنامه متشکریم",
completingSurveyBefore: "به نظر می رسد هم هم اکنون پرسشنامه را تکمیل کرده اید.",
loadingSurvey: "درحال ایجاد پرسشنامه",
optionsCaption: "انتخاب کنید...",
value: "مقدار",
requiredError: "لطفا به سوال پاسخ دهید",
requiredInAllRowsError: "لطفا به تمام سطر های سوالات پاسخ دهید",
numericError: "مقدار باید عددی باشد",
textMinLength: "لطفا حداقل {0} حرف وارد کنید",
textMaxLength: "لطفا کمتر از {0} حرف وارد کنید.",
textMinMaxLength: "لطفا بیشتر از {0} حرف و کمتر از {1} حرف وارد کنید.",
minRowCountError: "لطفا حداقل {0} سطر وارد کنید.",
minSelectError: "حداقل {0} انتخاب کنید.",
maxSelectError: "لطفا بیشتر از {0} انتخاب کنید.",
numericMinMax: "'{0}' باید بین {1} و {2} باشد",
numericMin: "'{0}' بزرگتر مساوی {1} باشد",
numericMax: "'{0}' باید کوچکتر یا مساوی {1} باشد",
invalidEmail: "لطفا ایمیل صحیح درج کنید",
urlRequestError: "درخواست با خطا روبرو شد: '{0}'. {1}",
urlGetChoicesError: "درخواست مسیری خالی بازگشت داده یا مسیر درست تنظیم نشده",
exceedMaxSize: "بیشترین حجم مجاز فایل: {0}",
otherRequiredError: "مقدار 'دیگر' را وارد کنید",
uploadingFile: "فایل در حال آیلود می باشد. لطفا صبر کنید.",
confirmDelete: "آیا مایل به حذف این ردیف هستید؟",
keyDuplicationError: "این مقدار باید غیر تکراری باشد",
addRow: "سطر جدید",
removeRow: "حذف",
addPanel: "جدید",
removePanel: "حذف",
choices_Item: "آیتم",
matrix_column: "ستون",
matrix_row: "سطر",
savingData: "نتایج در حال ذخیره سازی در سرور می باشد",
savingDataError: "خطایی در ذخیره سازی نتایج رخ داده است",
savingDataSuccess: "نتایج با موفقیت ذخیره شد",
saveAgainButton: "مجدد تلاش کنید"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fa"] = persianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fa"] = "فارْسِى";
/***/ }),
/* 104 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export polishSurveyStrings */
var polishSurveyStrings = {
pagePrevText: "Wstecz",
pageNextText: "Dalej",
completeText: "Gotowe",
otherItemText: "Inna odpowiedź (wpisz)",
progressText: "Strona {0} z {1}",
emptySurvey: "Nie ma widocznych pytań.",
completingSurvey: "Dziękujemy za wypełnienie ankiety!",
loadingSurvey: "Trwa wczytywanie ankiety...",
optionsCaption: "Wybierz...",
requiredError: "Proszę odpowiedzieć na to pytanie.",
requiredInAllRowsError: "Proszę odpowiedzieć na wszystkie pytania.",
numericError: "W tym polu można wpisać tylko liczby.",
textMinLength: "Proszę wpisać co najmniej {0} znaków.",
textMaxLength: "Proszę wpisać mniej niż {0} znaków.",
textMinMaxLength: "Proszę wpisać więcej niż {0} i mniej niż {1} znaków.",
minRowCountError: "Proszę uzupełnić przynajmniej {0} wierszy.",
minSelectError: "Proszę wybrać co najmniej {0} pozycji.",
maxSelectError: "Proszę wybrać nie więcej niż {0} pozycji.",
numericMinMax: "Odpowiedź '{0}' powinna być większa lub równa {1} oraz mniejsza lub równa {2}",
numericMin: "Odpowiedź '{0}' powinna być większa lub równa {1}",
numericMax: "Odpowiedź '{0}' powinna być mniejsza lub równa {1}",
invalidEmail: "Proszę podać prawidłowy adres email.",
urlRequestError: "Żądanie zwróciło błąd '{0}'. {1}",
urlGetChoicesError: "Żądanie nie zwróciło danych albo ścieżka jest nieprawidłowa",
exceedMaxSize: "Rozmiar przesłanego pliku nie może przekraczać {0}.",
otherRequiredError: "Proszę podać inną odpowiedź.",
uploadingFile: "Trwa przenoszenie Twojego pliku, proszę spróbować ponownie za kilka sekund.",
addRow: "Dodaj wiersz",
removeRow: "Usuń",
addPanel: "Dodaj panel",
removePanel: "Usuń",
choices_Item: "element",
matrix_column: "Kolumna",
matrix_row: "Wiersz",
savingData: "Zapisuję wyniki ankiety na serwerze...",
savingDataError: "Wystąpił błąd i wyniki nie mogły zostać zapisane.",
savingDataSuccess: "Wyniki zostały poprawnie zapisane!",
saveAgainButton: "Spróbuj ponownie",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Spędziłeś {0} na tej stronie a w sumie {1}.",
timerSpentPage: "Spędziłeś {0} na tej stronie.",
timerSpentSurvey: "Spędziłeś w smumie {0}.",
timerLimitAll: "Spędziłeś {0} z {1} na tej stronie a w sumie {2} z {3}.",
timerLimitPage: "Spędziłeś {0} z {1} na tej stronie",
timerLimitSurvey: "Spędziłeś {0} z {1}.",
cleanCaption: "Wyczyść"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pl"] = polishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["pl"] = "polski";
/***/ }),
/* 105 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export portugueseSurveyStrings */
var portugueseSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Próximo",
completeText: "Finalizar",
startSurveyText: "Começar",
otherItemText: "Outros (descrever)",
noneItemText: "Nenhum",
selectAllItemText: "Selecionar Todos",
progressText: "Página {0} de {1}",
emptySurvey: "Não há página visível ou pergunta na pesquisa.",
completingSurvey: "Obrigado por finalizar a pesquisa!",
completingSurveyBefore: "Nossos registros mostram que você já finalizou a pesquisa.",
loadingSurvey: "A pesquisa está carregando...",
optionsCaption: "Selecione...",
value: "valor",
requiredError: "Por favor, responda a pergunta.",
requiredErrorInPanel: "Por favor, responda pelo menos uma pergunta.",
requiredInAllRowsError: "Por favor, responda as perguntas em todas as linhas.",
numericError: "O valor deve ser numérico.",
textMinLength: "Por favor, insira pelo menos {0} caracteres.",
textMaxLength: "Por favor, insira menos de {0} caracteres.",
textMinMaxLength: "Por favor, insira mais de {0} e menos de {1} caracteres.",
minRowCountError: "Preencha pelo menos {0} linhas.",
minSelectError: "Selecione pelo menos {0} opções.",
maxSelectError: "Por favor, selecione não mais do que {0} opções.",
numericMinMax: "O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}",
numericMin: "O '{0}' deve ser igual ou superior a {1}",
numericMax: "O '{0}' deve ser igual ou inferior a {1}",
invalidEmail: "Por favor, informe um e-mail válido.",
invalidExpression: "A expressão: {0} deve retornar 'verdadeiro'.",
urlRequestError: "A requisição retornou o erro '{0}'. {1}",
urlGetChoicesError: "A requisição não retornou dados ou o 'caminho' da requisição não está correto",
exceedMaxSize: "O tamanho do arquivo não deve exceder {0}.",
otherRequiredError: "Por favor, informe o outro valor.",
uploadingFile: "Seu arquivo está sendo carregado. Por favor, aguarde alguns segundos e tente novamente.",
loadingFile: "Carregando...",
chooseFile: "Selecione o(s) arquivo(s)...",
confirmDelete: "Tem certeza que deseja deletar?",
keyDuplicationError: "Esse valor deve ser único.",
addColumn: "Adicionar coluna",
addRow: "Adicionar linha",
removeRow: "Remover linha",
addPanel: "Adicionar novo",
removePanel: "Remover",
choices_Item: "item",
matrix_column: "Coluna",
matrix_row: "Linha",
savingData: "Os resultados esto sendo salvos no servidor...",
savingDataError: "Ocorreu um erro e não foi possível salvar os resultados.",
savingDataSuccess: "Os resultados foram salvos com sucesso!",
saveAgainButton: "Tente novamente",
timerMin: "min",
timerSec: "seg",
timerSpentAll: "Você gastou {0} nesta página e {1} no total.",
timerSpentPage: "Você gastou {0} nesta página.",
timerSpentSurvey: "Você gastou {0} no total.",
timerLimitAll: "Você gastou {0} de {1} nesta página e {2} de {3} no total.",
timerLimitPage: "Você gastou {0} de {1} nesta página.",
timerLimitSurvey: "Você gastou {0} de {1} no total.",
cleanCaption: "Limpar",
clearCaption: "Limpar",
removeFileCaption: "Remover este arquivo"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pt"] = portugueseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["pt"] = "português";
/***/ }),
/* 106 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export romanianSurveyStrings */
var romanianSurveyStrings = {
pagePrevText: "Precedent",
pageNextText: "Următor",
completeText: "Finalizare",
otherItemText: "Altul(precizaţi)",
progressText: "Pagina {0} din {1}",
emptySurvey: "Nu sunt întrebări pentru acest chestionar",
completingSurvey: "Vă mulţumim pentru timpul acordat!",
loadingSurvey: "Chestionarul se încarcă...",
optionsCaption: "Alegeţi...",
requiredError: "Răspunsul la această întrebare este obligatoriu.",
requiredInAllRowsError: "Toate răspunsurile sunt obligatorii",
numericError: "Răspunsul trebuie să fie numeric.",
textMinLength: "Trebuie să introduceți minim {0} caractere.",
minSelectError: "Trebuie să selectați minim {0} opţiuni.",
maxSelectError: "Trebuie să selectați maxim {0} opţiuni.",
numericMinMax: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1} şî mai mic sau egal cu {2}",
numericMin: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1}",
numericMax: "Răspunsul '{0}' trebuie să fie mai mic sau egal ca {1}",
invalidEmail: "Trebuie să introduceţi o adresa de email validă.",
exceedMaxSize: "Dimensiunea fişierului nu trebuie să depăşească {0}.",
otherRequiredError: "Trebuie să completați câmpul 'Altul'.",
completingSurveyBefore: "Din înregistrările noastre reiese că ați completat deja acest chestionar.",
value: "valoare",
requiredErrorInPanel: "Vă rugăm să răspundeți la cel puțin o întrebare.",
textMaxLength: "Trebuie să introduceți maxim {0} caractere.",
textMinMaxLength: "Trebuie să introduceți mai mult de {0} și mai puțin de {1} caractere.",
minRowCountError: "Trebuie să completați minim {0} rânduri.",
urlRequestError: "Request-ul a returnat eroarea '{0}'. {1}",
urlGetChoicesError: "Request-ul nu a returnat date sau proprietatea 'path' este incorectă",
uploadingFile: "Fișierul dumneavoastră este în curs de încărcare. Vă rugăm așteptați câteva secunde și reveniți apoi.",
confirmDelete: "Sunteți sigur că doriți să ștergeți înregistrarea?",
keyDuplicationError: "Valoarea trebuie să fie unică.",
addRow: "Adăugare rând",
removeRow: "Ștergere",
addPanel: "Adăugare",
removePanel: "Ștergere",
choices_Item: "opțiune",
matrix_column: "Coloană",
matrix_row: "Rând",
savingData: "Rezultatele sunt în curs de salvare...",
savingDataError: "A intervenit o eroare, rezultatele nu au putut fi salvate.",
savingDataSuccess: "Rezultatele au fost salvate cu succes!",
saveAgainButton: "Încercați din nou",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Ați petrecut {0} pe această pagină și {1} în total.",
timerSpentPage: "Ați petrecut {0} pe această pagină.",
timerSpentSurvey: "Ați petrecut {0} în total.",
timerLimitAll: "Ați petrecut {0} din {1} pe această pagină și {2} din {3} în total.",
timerLimitPage: "Ați petrecut {0} din {1} pe această pagină.",
timerLimitSurvey: "Ați petrecut {0} din {1} în total."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ro"] = romanianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ro"] = "română";
/***/ }),
/* 107 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export russianSurveyStrings */
var russianSurveyStrings = {
pagePrevText: "Назад",
pageNextText: "Далее",
completeText: "Готово",
startSurveyText: "Начать",
otherItemText: "Другое (пожалуйста, опишите)",
noneItemText: "Нет",
selectAllItemText: "Выбрать всё",
progressText: "Страница {0} из {1}",
emptySurvey: "Нет ни одного вопроса.",
completingSurvey: "Благодарим Вас за заполнение анкеты!",
completingSurveyBefore: "Вы уже проходили этот опрос.",
loadingSurvey: "Загрузка с сервера...",
optionsCaption: "Выбрать...",
value: "значение",
requiredError: "Пожалуйста, ответьте на вопрос.",
requiredErrorInPanel: "Пожалуйста, ответьте по крайней мере на один вопрос.",
requiredInAllRowsError: "Пожалуйста, ответьте на вопросы в каждой строке.",
numericError: "Ответ должен быть числом.",
textMinLength: "Пожалуйста введите больше {0} символов.",
textMaxLength: "Пожалуйста введите меньше {0} символов.",
textMinMaxLength: "Пожалуйста введите больше {0} и меньше {1} символов.",
minRowCountError: "Пожалуйста, заполните не меньше {0} строк.",
minSelectError: "Пожалуйста, выберите хотя бы {0} вариантов.",
maxSelectError: "Пожалуйста, выберите не более {0} вариантов.",
numericMinMax: "'{0}' должно быть не меньше чем {1}, и не больше чем {2}",
numericMin: "'{0}' должно быть не меньше чем {1}",
numericMax: "'{0}' должно быть не больше чем {1}",
invalidEmail: "Пожалуйста, введите действительный адрес электронной почты.",
invalidExpression: "Выражение {0} должно возвращать 'true'.",
urlRequestError: "Запрос вернул ошибку '{0}'. {1}",
urlGetChoicesError: "Ответ на запрос пришел пустой или свойство 'path' указано неверно",
exceedMaxSize: "Размер файла не должен превышать {0}.",
otherRequiredError: "Пожалуйста, введите данные в поле 'Другое'",
uploadingFile: "Ваш файл загружается. Подождите несколько секунд и попробуйте снова.",
loadingFile: "Загрузка...",
chooseFile: "Выберите файл(ы)...",
confirmDelete: "Вы точно хотите удалить запись?",
keyDuplicationError: "Это значение должно быть уникальным.",
addColumn: "Добавить колонку",
addRow: "Добавить строку",
removeRow: "Удалить",
addPanel: "Добавить новую",
removePanel: "Удалить",
choices_Item: "Вариант",
matrix_column: "Колонка",
matrix_row: "Строка",
savingData: "Результаты сохраняются на сервер...",
savingDataError: "Произошла ошибка, результат не был сохранён.",
savingDataSuccess: "Результат успешно сохранён!",
saveAgainButton: "Попробовать снова",
timerMin: "мин",
timerSec: "сек",
timerSpentAll: "Вы потратили {0} на этой странице и {1} всего.",
timerSpentPage: "Вы потратили {0} на этой странице.",
timerSpentSurvey: "Вы потратили {0} в течение теста.",
timerLimitAll: "Вы потратили {0} из {1} на этой странице и {2} из {3} для всего теста.",
timerLimitPage: "Вы потратили {0} из {1} на этой странице.",
timerLimitSurvey: "Вы потратили {0} из {1} для всего теста.",
cleanCaption: "Очистить",
clearCaption: "Очистить",
removeFileCaption: "Удалить файл"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ru"] = russianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ru"] = "русский";
/***/ }),
/* 108 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export simplifiedChineseSurveyStrings */
var simplifiedChineseSurveyStrings = {
pagePrevText: "上一页",
pageNextText: "下一页",
completeText: "提交问卷",
startSurveyText: "开始问卷",
otherItemText: "填写其他答案",
noneItemText: "无",
selectAllItemText: "选择全部",
progressText: "第 {0} 页, 共 {1} 页",
questionsProgressText: "第 {0}/{1} 题",
emptySurvey: "问卷中没有问题或页面",
completingSurveyBefore: "你已完成问卷.",
completingSurvey: "感谢您的参与!",
loadingSurvey: "问卷正在加载中...",
optionsCaption: "请选择...",
value: "值",
requiredError: "请填写此问题",
requiredErrorInPanel: "至少回答一题.",
requiredInAllRowsError: "请填写所有行中问题",
numericError: "答案必须是个数字",
textMinLength: "答案长度至少 {0} 个字符",
textMaxLength: "答案长度不能超过 {0} 个字符",
textMinMaxLength: "答案长度必须在 {0} - {1} 个字符之间",
minRowCountError: "最少需要填写 {0} 行答案",
minSelectError: "最少需要选择 {0} 项答案",
maxSelectError: "最多只能选择 {0} 项答案",
numericMinMax: "答案 '{0}' 必须大于等于 {1} 且小于等于 {2}",
numericMin: "答案 '{0}' 必须大于等于 {1}",
numericMax: "答案 '{0}' 必须小于等于 {1}",
invalidEmail: "请输入有效的 Email 地址",
invalidExpression: "公式: {0} 无效.",
urlRequestError: "载入选项时发生错误 '{0}': {1}",
urlGetChoicesError: "未能载入有效的选项或请求参数路径有误",
exceedMaxSize: "文件大小不能超过 {0}",
otherRequiredError: "请完成其他问题",
uploadingFile: "文件上传中... 请耐心等待几秒后重试",
loadingFile: "加载...",
chooseFile: "选择文件...",
noFileChosen: "未选择文件",
confirmDelete: "删除记录?",
keyDuplicationError: "主键不能重复",
addColumn: "添加列",
addRow: "添加行",
removeRow: "删除答案",
addPanel: "新添",
removePanel: "删除",
choices_Item: "选项",
matrix_column: "列",
matrix_row: "行",
savingData: "正在将结果保存到服务器...",
savingDataError: "在保存结果过程中发生了错误,结果未能保存",
savingDataSuccess: "结果保存成功!",
saveAgainButton: "请重试",
timerMin: "分",
timerSec: "秒",
timerSpentAll: "本页用时 {0} 总计用时{1} .",
timerSpentPage: "本页用时{0} .",
timerSpentSurvey: "总计用时 {0} .",
timerLimitAll: "本页用时 {0} 共 {1}, 总计用时 {2} 共 {3} .",
timerLimitPage: "本页用时 {0} 共 {1} .",
timerLimitSurvey: "总计用时 {0} 共 {1}.",
cleanCaption: "清理",
clearCaption: "清除",
removeFileCaption: "移除文件"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["zh-cn"] = simplifiedChineseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["zh-cn"] = "简体中文";
/***/ }),
/* 109 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export spanishSurveyStrings */
var spanishSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Siguiente",
completeText: "Completo",
otherItemText: "Otro (describa)",
progressText: "Página {0} de {1}",
emptySurvey: "No hay página visible o pregunta en la encuesta.",
completingSurvey: "Gracias por completar la encuesta!",
loadingSurvey: "La encuesta está cargando...",
optionsCaption: "Seleccione...",
requiredError: "Por favor conteste la pregunta.",
requiredInAllRowsError: "Por favor conteste las preguntas en cada hilera.",
numericError: "La estimación debe ser numérica.",
textMinLength: "Por favor entre por lo menos {0} símbolos.",
textMaxLength: "Por favor entre menos de {0} símbolos.",
textMinMaxLength: "Por favor entre más de {0} y menos de {1} símbolos.",
minRowCountError: "Por favor llene por lo menos {0} hileras.",
minSelectError: "Por favor seleccione por lo menos {0} variantes.",
maxSelectError: "Por favor seleccione no más de {0} variantes.",
numericMinMax: "El '{0}' debe de ser igual o más de {1} y igual o menos de {2}",
numericMin: "El '{0}' debe ser igual o más de {1}",
numericMax: "El '{0}' debe ser igual o menos de {1}",
invalidEmail: "Por favor agregue un correo electrónico válido.",
urlRequestError: "La solicitud regresó error '{0}'. {1}",
urlGetChoicesError: "La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta",
exceedMaxSize: "El tamaño del archivo no debe de exceder {0}.",
otherRequiredError: "Por favor agregue la otra estimación.",
uploadingFile: "Su archivo se está subiendo. Por favor espere unos segundos e intente de nuevo.",
addRow: "Agregue una hilera",
removeRow: "Eliminar una hilera",
choices_firstItem: "primer artículo",
choices_secondItem: "segundo artículo",
choices_thirdItem: "tercera artículo",
matrix_column: "Columna",
matrix_row: "Hilera"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["es"] = spanishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["es"] = "español";
/***/ }),
/* 110 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export swedishSurveyStrings */
//Create by Mattias Asplund
var swedishSurveyStrings = {
pagePrevText: "Föregående",
pageNextText: "Nästa",
completeText: "Färdig",
otherItemText: "Annat (beskriv)",
progressText: "Sida {0} av {1}",
emptySurvey: "Det finns ingen synlig sida eller fråga i enkäten.",
completingSurvey: "Tack för att du genomfört enkäten!!",
loadingSurvey: "Enkäten laddas...",
optionsCaption: "Välj...",
requiredError: "Var vänlig besvara frågan.",
requiredInAllRowsError: "Var vänlig besvara frågorna på alla rader.",
numericError: "Värdet ska vara numeriskt.",
textMinLength: "Var vänlig ange minst {0} tecken.",
minRowCountError: "Var vänlig fyll i minst {0} rader.",
minSelectError: "Var vänlig välj åtminstone {0} varianter.",
maxSelectError: "Var vänlig välj inte fler än {0} varianter.",
numericMinMax: "'{0}' ska vara lika med eller mer än {1} samt lika med eller mindre än {2}",
numericMin: "'{0}' ska vara lika med eller mer än {1}",
numericMax: "'{0}' ska vara lika med eller mindre än {1}",
invalidEmail: "Var vänlig ange en korrekt e-postadress.",
urlRequestError: "Förfrågan returnerade felet '{0}'. {1}",
urlGetChoicesError: "Antingen returnerade förfrågan ingen data eller så är egenskapen 'path' inte korrekt",
exceedMaxSize: "Filstorleken får ej överstiga {0}.",
otherRequiredError: "Var vänlig ange det andra värdet.",
uploadingFile: "Din fil laddas upp. Var vänlig vänta några sekunder och försök sedan igen.",
addRow: "Lägg till rad",
removeRow: "Ta bort"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["sv"] = swedishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["sv"] = "svenska";
/***/ }),
/* 111 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export traditionalChineseSurveyStrings */
var traditionalChineseSurveyStrings = {
pagePrevText: "上一頁",
pageNextText: "下一頁",
completeText: "提交問卷",
otherItemText: "填寫其他答案",
progressText: "第 {0} 頁, 共 {1} 頁",
emptySurvey: "問卷中沒有問題或頁面",
completingSurvey: "感謝您的參與!",
loadingSurvey: "問卷載入中...",
optionsCaption: "請選擇...",
requiredError: "請填寫此問題",
requiredInAllRowsError: "請填寫所有行中問題",
numericError: "答案必須是個數字",
textMinLength: "答案長度至少 {0} 個字元",
textMaxLength: "答案長度不能超過 {0} 個字元",
textMinMaxLength: "答案長度必須在 {0} - {1} 個字元之間",
minRowCountError: "最少需要填寫 {0} 行答案",
minSelectError: "最少需要選擇 {0} 項答案",
maxSelectError: "最多只能選擇 {0} 項答案",
numericMinMax: "答案 '{0}' 必須大於等於 {1} 且小於等於 {2}",
numericMin: "答案 '{0}' 必須大於等於 {1}",
numericMax: "答案 '{0}' 必須小於等於 {1}",
invalidEmail: "請輸入有效的 Email 地址",
urlRequestError: "載入選項時發生錯誤 '{0}': {1}",
urlGetChoicesError: "未能載入有效的選項或請求參數路徑有誤",
exceedMaxSize: "文件大小不能超過 {0}",
otherRequiredError: "請完成其他問題",
uploadingFile: "文件上傳中... 請耐心等待幾秒後重試",
addRow: "添加答案",
removeRow: "刪除答案",
choices_Item: "選項",
matrix_column: "列",
matrix_row: "行",
savingData: "正在將結果保存到服務器...",
savingDataError: "在保存結果過程中發生了錯誤,結果未能保存",
savingDataSuccess: "結果保存成功!",
saveAgainButton: "請重試"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["zh-tw"] = traditionalChineseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["zh-tw"] = "繁體中文";
/***/ }),
/* 112 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export turkishSurveyStrings */
var turkishSurveyStrings = {
pagePrevText: "Geri",
pageNextText: "İleri",
completeText: "Anketi Tamamla",
otherItemText: "Diğer (açıklayınız)",
progressText: "Sayfa {0} / {1}",
emptySurvey: "Ankette görüntülenecek sayfa ya da soru mevcut değil.",
completingSurvey: "Anketimizi tamamladığınız için teşekkür ederiz.",
loadingSurvey: "Anket sunucudan yükleniyor ...",
optionsCaption: "Seçiniz ...",
requiredError: "Lütfen soruya cevap veriniz",
numericError: "Girilen değer numerik olmalıdır",
textMinLength: "En az {0} sembol giriniz.",
minRowCountError: "Lütfen en az {0} satırı doldurun.",
minSelectError: "Lütfen en az {0} seçeneği seçiniz.",
maxSelectError: "Lütfen {0} adetten fazla seçmeyiniz.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "'{0}' değeri {1} değerine eşit veya büyük olmalıdır",
numericMax: "'{0}' değeri {1} değerine eşit ya da küçük olmalıdır.",
invalidEmail: "Lütfen geçerli bir eposta adresi giriniz.",
urlRequestError: "Talebi şu hatayı döndü '{0}'. {1}",
urlGetChoicesError: "Talep herhangi bir veri dönmedi ya da 'path' özelliği hatalı.",
exceedMaxSize: "Dosya boyutu {0} değerini geçemez.",
otherRequiredError: "Lütfen diğer değerleri giriniz.",
uploadingFile: "Dosyanız yükleniyor. LÜtfen birkaç saniye bekleyin ve tekrar deneyin.",
addRow: "Satır Ekle",
removeRow: "Kaldır"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["tr"] = turkishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["tr"] = "türkçe";
/***/ }),
/* 113 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export ukrainianSurveyStrings */
var ukrainianSurveyStrings = {
pagePrevText: "Назад",
pageNextText: "Далі",
completeText: "Завершити",
startSurveyText: "Почати",
otherItemText: "Інше (будь ласка, опишіть)",
noneItemText: "Жоден",
selectAllItemText: "Вибрати все",
progressText: "Сторінка {0} з {1}",
questionsProgressText: "Відповіли на {0}/{1} питань",
emptySurvey: "Немає жодного питання.",
completingSurvey: "Дякуємо Вам за заповнення анкети!",
completingSurveyBefore: "Ви вже проходили це опитування.",
loadingSurvey: "Завантаження опитування...",
optionsCaption: "Вибрати...",
value: "значення",
requiredError: "Будь ласка, дайте відповідь.",
requiredErrorInPanel: "Будь ласка, дайте відповідь хоча б на одне питання.",
requiredInAllRowsError: "Будь ласка, дайте відповідь на питання в кожному рядку.",
numericError: "Відповідь повинна бути числом.",
textMinLength: "Будь ласка введіть більше {0} символів.",
textMaxLength: "Будь ласка введіть менше {0} символів.",
textMinMaxLength: "Будь ласка введіть більше {0} и менше {1} символів.",
minRowCountError: "Будь ласка, заповніть не менше {0} рядків.",
minSelectError: "Будь ласка, виберіть хоча б {0} варіантів.",
maxSelectError: "Будь ласка, виберіть не більше {0} варіантів.",
numericMinMax: "'{0}' повинно бути не менше ніж {1}, і не більше ніж {2}",
numericMin: "'{0}' повинно бути не менше ніж {1}",
numericMax: "'{0}' повинно бути не більше ніж {1}",
invalidEmail: "Будь ласка, введіть дійсну адресу електронної пошти.",
invalidExpression: "Вираз {0} повинен повертати 'true'.",
urlRequestError: "Запит повернув помилку '{0}'. {1}",
urlGetChoicesError: "Відповідь на запит повернулась порожньою або властивіть 'path' вказано невірно",
exceedMaxSize: "Розмір файлу не повинен перевищувати {0}.",
otherRequiredError: "Будь ласка, введіть дані в поле 'Інше'",
uploadingFile: "Ваш файл завантажується. Зачекайте декілька секунд і спробуйте знову.",
loadingFile: "Завантаження...",
chooseFile: "Виберіть файл(и)...",
noFileChosen: "Файл не вибрано",
confirmDelete: "Ви хочете видалити запис?",
keyDuplicationError: "Це значення повинно бути унікальним.",
addColumn: "Додати колонку",
addRow: "Додати рядок",
removeRow: "Видалити",
addPanel: "Додати нову",
removePanel: "Видалити",
choices_Item: "Варіант",
matrix_column: "Колонка",
matrix_row: "Рядок",
savingData: "Результати зберігаються на сервер...",
savingDataError: "Відбулася помилка, результат не був збережений.",
savingDataSuccess: "Резвультат успішно збережений!",
saveAgainButton: "Спробувати знову",
timerMin: "хв",
timerSec: "сек",
timerSpentAll: "Ви витратили {0} на цій сторінці і {1} загалом.",
timerSpentPage: "Ви витратили {0} на цій сторінці.",
timerSpentSurvey: "Ви витратили {0} протягом тесту.",
timerLimitAll: "Ви витратили {0} з {1} на цій сторінці і {2} з {3} для всього тесту.",
timerLimitPage: "Ви витратили {0} з {1} на цій сторінці.",
timerLimitSurvey: "Ви витратили {0} з {1} для всього тесту.",
cleanCaption: "Очистити",
clearCaption: "Очистити",
removeFileCaption: "Видалити файл"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ua"] = ukrainianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ua"] = "українська";
/***/ }),
/* 114 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBooleanModel; });
/**
* A Model for a boolean question.
*/
var QuestionBooleanModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionBooleanModel, _super);
function QuestionBooleanModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("label", _this, true);
_this.createLocalizableString("labelFalse", _this, true);
_this.createLocalizableString("labelTrue", _this, true);
_this.labelTrue = __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("booleanCheckedLabel");
_this.labelFalse = __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("booleanUncheckedLabel");
return _this;
}
QuestionBooleanModel.prototype.getType = function () {
return "boolean";
};
QuestionBooleanModel.prototype.isLayoutTypeSupported = function (layoutType) {
return true;
};
Object.defineProperty(QuestionBooleanModel.prototype, "isIndeterminate", {
/**
* Returns true if the question check will be rendered in indeterminate mode. value is empty.
*/
get: function () {
return this.isEmpty();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "hasTitle", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
Object.defineProperty(QuestionBooleanModel.prototype, "checkedValue", {
/**
* Get/set question value in 3 modes: indeterminate (value is empty), true (check is set) and false (check is unset).
* @see valueTrue
* @see valueFalse
*/
get: function () {
if (this.isEmpty())
return null;
return this.value == this.getValueTrue();
},
set: function (val) {
if (this.isValueEmpty(val)) {
this.value = null;
}
else {
this.value = val == true ? this.getValueTrue() : this.getValueFalse();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "defaultValue", {
/**
* Set the default state of the check: "indeterminate" - default (value is empty/null), "true" - value equals valueTrue or true, "false" - value equals valueFalse or false.
*/
get: function () {
return this.getPropertyValue("defaultValue");
},
set: function (val) {
if (val === true)
val = "true";
if (val === false)
val = "false";
this.setPropertyValue("defaultValue", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.getDefaultValue = function () {
if (this.defaultValue == "indeterminate")
return null;
return this.defaultValue == "true"
? this.getValueTrue()
: this.getValueFalse();
};
Object.defineProperty(QuestionBooleanModel.prototype, "locTitle", {
get: function () {
return this.showTitle || this.isValueEmpty(this.locLabel.text)
? this.getLocalizableString("title")
: this.locLabel;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "label", {
/**
* The checkbox label. If it is empty and showTitle is false then title is rendered
* @see showTitle
* @see title
*/
get: function () {
return this.getLocalizableStringText("label");
},
set: function (val) {
this.setLocalizableStringText("label", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabel", {
get: function () {
return this.getLocalizableString("label");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locDisplayLabel", {
get: function () {
if (this.locLabel.text)
return this.locLabel;
return this.showTitle ? this.locLabel : this.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "labelTrue", {
/**
* Set this property, if you want to have a different label for state when check is set.
*/
get: function () {
return this.getLocalizableStringText("labelTrue");
},
set: function (val) {
this.setLocalizableStringText("labelTrue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabelTrue", {
get: function () {
return this.getLocalizableString("labelTrue");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "labelFalse", {
/**
* Set this property, if you want to have a different label for state when check is unset.
*/
get: function () {
return this.getLocalizableStringText("labelFalse");
},
set: function (val) {
this.setLocalizableStringText("labelFalse", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabelFalse", {
get: function () {
return this.getLocalizableString("labelFalse");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "showTitle", {
/**
* Set this property to true to show the question title. It is hidden by default.
*/
get: function () {
return this.getPropertyValue("showTitle");
},
set: function (val) {
this.setPropertyValue("showTitle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "valueTrue", {
/**
* Set this property, if you want to have a different value from true when check is set.
*/
get: function () {
return this.getPropertyValue("valueTrue");
},
set: function (val) {
this.setPropertyValue("valueTrue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "valueFalse", {
/**
* Set this property, if you want to have a different value from false when check is unset.
*/
get: function () {
return this.getPropertyValue("valueFalse");
},
set: function (val) {
this.setPropertyValue("valueFalse", val);
},
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.getValueTrue = function () {
return this.valueTrue ? this.valueTrue : true;
};
QuestionBooleanModel.prototype.getValueFalse = function () {
return this.valueFalse ? this.valueFalse : false;
};
QuestionBooleanModel.prototype.setDefaultValue = function () {
if (this.defaultValue == "true")
this.checkedValue = true;
if (this.defaultValue == "false")
this.checkedValue = false;
if (this.defaultValue == "indeterminate")
this.value = null;
};
return QuestionBooleanModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("boolean", [
{
name: "defaultValue:dropdown",
alternativeName: "booleanDefaultValue",
default: "indeterminate",
choices: ["indeterminate", "false", "true"]
},
{ name: "label:text", serializationProperty: "locLabel" },
{
name: "labelTrue:text",
serializationProperty: "locLabelTrue"
},
{
name: "labelFalse:text",
serializationProperty: "locLabelFalse"
},
"showTitle:boolean",
"valueTrue",
"valueFalse"
], function () {
return new QuestionBooleanModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("boolean", function (name) {
return new QuestionBooleanModel(name);
});
/***/ }),
/* 115 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxModel; });
/**
* A Model for a checkbox question
*/
var QuestionCheckboxModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCheckboxModel, _super);
function QuestionCheckboxModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.noneItemValue = new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */]("none");
_this.selectAllItemValue = new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */]("selectall");
var noneItemText = _this.createLocalizableString("noneText", _this, true);
noneItemText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noneItemText");
};
_this.noneItemValue.locOwner = _this;
_this.noneItemValue.setLocText(noneItemText);
var selectAllItemText = _this.createLocalizableString("selectAllText", _this, true);
selectAllItemText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("selectAllItemText");
};
_this.selectAllItem.locOwner = _this;
_this.selectAllItem.setLocText(selectAllItemText);
var self = _this;
_this.registerFunctionOnPropertiesValueChanged(["hasNone", "noneText", "hasSelectAll", "selectAllText"], function () {
self.onVisibleChoicesChanged();
});
return _this;
}
QuestionCheckboxModel.prototype.getType = function () {
return "checkbox";
};
QuestionCheckboxModel.prototype.onCreating = function () {
_super.prototype.onCreating.call(this);
this.createNewArray("renderedValue");
this.createNewArray("value");
};
QuestionCheckboxModel.prototype.getFirstInputElementId = function () {
return this.inputId + "_0";
};
Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllItem", {
/**
* Returns the select all item. By using this property, you may change programmatically it's value and text.
* @see hasSelectAll
*/
get: function () {
return this.selectAllItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "noneItem", {
/**
* Returns the none item. By using this property, you may change programmatically it's value and text.
* @see hasNone
*/
get: function () {
return this.noneItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "noneText", {
/**
* Use this property to set the different text for none item.
*/
get: function () {
return this.getLocalizableStringText("noneText", __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noneItemText"));
},
set: function (val) {
this.setLocalizableStringText("noneText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "locNoneText", {
get: function () {
return this.getLocalizableString("noneText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllText", {
/**
* Use this property to set the different text for Select All item.
*/
get: function () {
return this.getLocalizableStringText("selectAllText", __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("selectAllItemText"));
},
set: function (val) {
this.setLocalizableStringText("selectAllText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "locSelectAllText", {
get: function () {
return this.getLocalizableString("selectAllText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "hasSelectAll", {
/**
* Set this property to true, to show the "Select All" item on the top. If end-user checks this item, then all items are checked.
*/
get: function () {
return this.getPropertyValue("hasSelectAll", false);
},
set: function (val) {
this.setPropertyValue("hasSelectAll", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "isAllSelected", {
/**
* Returns true if all items are selected
* @see toggleSelectAll
*/
get: function () {
var val = this.value;
if (!val || !Array.isArray(val))
return false;
if (this.isItemSelected(this.noneItem))
return false;
var allItemCount = this.visibleChoices.length;
if (this.hasOther)
allItemCount--;
if (this.hasNone)
allItemCount--;
if (this.hasSelectAll)
allItemCount--;
var selectedCount = val.length;
if (this.isItemSelected(this.otherItem))
selectedCount--;
return selectedCount === allItemCount;
},
set: function (val) {
if (val) {
this.selectAll();
}
else {
this.clearValue();
}
},
enumerable: true,
configurable: true
});
/**
* It will select all items, except other and none. If all items have been already selected then it will clear the value
* @see isAllSelected
* @see selectAll
*/
QuestionCheckboxModel.prototype.toggleSelectAll = function () {
this.isAllSelected = !this.isAllSelected;
};
/**
* Select all items, except other and none.
*/
QuestionCheckboxModel.prototype.selectAll = function () {
var val = [];
for (var i = 0; i < this.visibleChoices.length; i++) {
var item = this.visibleChoices[i];
if (item === this.noneItem ||
item === this.otherItem ||
item === this.selectAllItem)
continue;
val.push(item.value);
}
this.value = val;
};
Object.defineProperty(QuestionCheckboxModel.prototype, "hasNone", {
/**
* Set this property to true, to show the "None" item on the bottom. If end-user checks this item, all other items would be unchecked.
*/
get: function () {
return this.getPropertyValue("hasNone", false);
},
set: function (val) {
this.setPropertyValue("hasNone", val);
},
enumerable: true,
configurable: true
});
/**
* Returns true if item is checked
* @param item checkbox item value
*/
QuestionCheckboxModel.prototype.isItemSelected = function (item) {
if (item === this.selectAllItem)
return this.isAllSelected;
var val = this.renderedValue;
if (!val || !Array.isArray(val))
return false;
for (var i = 0; i < val.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(val[i], item.value))
return true;
}
return false;
};
QuestionCheckboxModel.prototype.setNewValue = function (newValue) {
newValue = this.valueFromData(newValue);
var value = this.value;
if (!newValue)
newValue = [];
if (!value)
value = [];
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(value, newValue))
return;
if (this.hasNone) {
var prevNoneIndex = this.noneIndexInArray(value);
var newNoneIndex = this.noneIndexInArray(newValue);
if (prevNoneIndex > -1) {
if (newNoneIndex > -1 && newValue.length > 1) {
newValue.splice(newNoneIndex, 1);
}
}
else {
if (newNoneIndex > -1) {
newValue.splice(0, newValue.length);
newValue.push(this.noneItem.value);
}
}
}
_super.prototype.setNewValue.call(this, newValue);
};
QuestionCheckboxModel.prototype.noneIndexInArray = function (val) {
if (!val || !Array.isArray(val))
return -1;
var noneValue = this.noneItem.value;
for (var i = 0; i < val.length; i++) {
if (val[i] == noneValue)
return i;
}
return -1;
};
QuestionCheckboxModel.prototype.canUseFilteredChoices = function () {
return !this.hasNone && !this.hasSelectAll && _super.prototype.canUseFilteredChoices.call(this);
};
QuestionCheckboxModel.prototype.addToVisibleChoices = function (items) {
if (this.hasSelectAll) {
items.unshift(this.selectAllItem);
}
_super.prototype.addToVisibleChoices.call(this, items);
if (this.hasNone) {
items.push(this.noneItem);
}
};
QuestionCheckboxModel.prototype.getDisplayValueCore = function (keysAsText, value) {
if (!Array.isArray(value))
return _super.prototype.getDisplayValueCore.call(this, keysAsText, value);
var items = this.visibleChoices;
var str = "";
for (var i = 0; i < value.length; i++) {
var valStr = this.getChoicesDisplayValue(items, value[i]);
if (valStr) {
if (str)
str += ", ";
str += valStr;
}
}
return str;
};
QuestionCheckboxModel.prototype.clearIncorrectValuesCore = function () {
this.clearIncorrectAndDisabledValues(false);
};
QuestionCheckboxModel.prototype.clearDisabledValuesCore = function () {
this.clearIncorrectAndDisabledValues(true);
};
QuestionCheckboxModel.prototype.clearIncorrectAndDisabledValues = function (clearDisabled) {
var val = this.value;
if (!val)
return;
if (!Array.isArray(val) || val.length == 0) {
if (!clearDisabled) {
if (this.hasComment) {
this.value = null;
}
else {
this.clearValue();
}
}
return;
}
var newValue = [];
for (var i = 0; i < val.length; i++) {
if ((!clearDisabled && !this.canClearValueAnUnknow(val[i])) ||
(clearDisabled && !this.isValueDisabled(val[i]))) {
newValue.push(val[i]);
}
}
if (newValue.length == val.length)
return;
if (newValue.length == 0) {
this.clearValue();
}
else {
this.value = newValue;
}
};
QuestionCheckboxModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
var json = _super.prototype.getConditionJson.call(this);
if (operator == "contains" || operator == "notcontains") {
json["type"] = "radiogroup";
}
return json;
};
QuestionCheckboxModel.prototype.isAnswerCorrect = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isArrayContainsEqual(this.value, this.correctAnswer);
};
QuestionCheckboxModel.prototype.setDefaultValueWithOthers = function () {
this.value = this.renderedValueFromDataCore(this.defaultValue);
};
QuestionCheckboxModel.prototype.getHasOther = function (val) {
if (!val || !Array.isArray(val))
return false;
return val.indexOf(this.otherItem.value) >= 0;
};
QuestionCheckboxModel.prototype.valueFromData = function (val) {
if (!val)
return val;
if (!Array.isArray(val))
return [_super.prototype.valueFromData.call(this, val)];
var value = [];
for (var i = 0; i < val.length; i++) {
var choiceitem = __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.activeChoices, val[i]);
if (!!choiceitem) {
value.push(choiceitem.value);
}
else {
value.push(val[i]);
}
}
return value;
};
QuestionCheckboxModel.prototype.renderedValueFromDataCore = function (val) {
if (!val || !Array.isArray(val))
val = [];
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value)
return val;
if (this.hasUnknownValue(val[i])) {
this.comment = val[i];
var newVal = val.slice();
newVal[i] = this.otherItem.value;
return newVal;
}
}
return val;
};
QuestionCheckboxModel.prototype.rendredValueToDataCore = function (val) {
if (!val || !val.length)
return val;
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value) {
if (this.getComment()) {
var newVal = val.slice();
newVal[i] = this.getComment();
return newVal;
}
}
}
return val;
};
QuestionCheckboxModel.prototype.hasUnknownValue = function (val, includeOther) {
if (includeOther === void 0) { includeOther = false; }
if (this.hasNone && val == this.noneItemValue.value)
return false;
return _super.prototype.hasUnknownValue.call(this, val, includeOther);
};
QuestionCheckboxModel.prototype.addSupportedValidators = function (supportedValidators) {
_super.prototype.addSupportedValidators.call(this, supportedValidators);
supportedValidators.push("answercount");
};
return QuestionCheckboxModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("checkbox", [
"hasSelectAll:boolean",
"hasNone:boolean",
{ name: "noneText", serializationProperty: "locNoneText" },
{ name: "selectAllText", serializationProperty: "locSelectAllText" }
], function () {
return new QuestionCheckboxModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("checkbox", function (name) {
var q = new QuestionCheckboxModel(name);
q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 116 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCommentModel; });
/**
* A Model for a comment question
*/
var QuestionCommentModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCommentModel, _super);
function QuestionCommentModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("placeHolder", _this);
return _this;
}
QuestionCommentModel.prototype.isTextValue = function () {
return true;
};
Object.defineProperty(QuestionCommentModel.prototype, "maxLength", {
/**
* The maximim text length. If it is -1, defaul value, then the survey maxTextLength property will be used.
* If it is 0, then the value is unlimited
* @see SurveyModel.maxTextLength
*/
get: function () {
return this.getPropertyValue("maxLength");
},
set: function (val) {
this.setPropertyValue("maxLength", val);
},
enumerable: true,
configurable: true
});
QuestionCommentModel.prototype.getMaxLength = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, this.survey ? this.survey.maxTextLength : -1);
};
Object.defineProperty(QuestionCommentModel.prototype, "placeHolder", {
/**
* Use this property to set the input place holder.
*/
get: function () {
return this.getLocalizableStringText("placeHolder");
},
set: function (val) {
this.setLocalizableStringText("placeHolder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "locPlaceHolder", {
get: function () {
return this.getLocalizableString("placeHolder");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "rows", {
/**
* The html rows attribute.
*/
get: function () {
return this.getPropertyValue("rows");
},
set: function (val) {
this.setPropertyValue("rows", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "cols", {
/**
* The html cols attribute.
*/
get: function () {
return this.getPropertyValue("cols");
},
set: function (val) {
this.setPropertyValue("cols", val);
},
enumerable: true,
configurable: true
});
QuestionCommentModel.prototype.getType = function () {
return "comment";
};
QuestionCommentModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value === "";
};
QuestionCommentModel.prototype.addSupportedValidators = function (supportedValidators) {
_super.prototype.addSupportedValidators.call(this, supportedValidators);
supportedValidators.push("text", "regex");
};
return QuestionCommentModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("comment", [
{ name: "maxLength:number", default: -1 },
{ name: "cols:number", default: 50 },
{ name: "rows:number", default: 4 },
{ name: "placeHolder", serializationProperty: "locPlaceHolder" }
], function () {
return new QuestionCommentModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) {
return new QuestionCommentModel(name);
});
/***/ }),
/* 117 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionEmptyModel; });
/**
* A Model for an question that renders empty "div" tag. It used as a base class for some custom widgets
*/
var QuestionEmptyModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionEmptyModel, _super);
function QuestionEmptyModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionEmptyModel.prototype.getType = function () {
return "empty";
};
return QuestionEmptyModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("empty", [], function () {
return new QuestionEmptyModel("");
}, "question");
/***/ }),
/* 118 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFileModel; });
/**
* A Model for a file question
*/
var QuestionFileModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionFileModel, _super);
function QuestionFileModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isUploading = false;
/**
* The event is fired after question state has been changed.
*
sender the question object that fires the event
*
options.state new question state value.
*/
_this.onStateChanged = new __WEBPACK_IMPORTED_MODULE_4__base__["c" /* Event */]();
_this.previewValue = [];
_this.currentState = "empty";
return _this;
}
QuestionFileModel.prototype.getType = function () {
return "file";
};
Object.defineProperty(QuestionFileModel.prototype, "showPreview", {
/**
* Set it to true, to show the preview for the image files.
*/
get: function () {
return this.getPropertyValue("showPreview");
},
set: function (val) {
this.setPropertyValue("showPreview", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "allowMultiple", {
/**
* Set it to true, to allow select multiple files.
*/
get: function () {
return this.getPropertyValue("allowMultiple", false);
},
set: function (val) {
this.setPropertyValue("allowMultiple", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () {
return this.getPropertyValue("imageHeight");
},
set: function (val) {
this.setPropertyValue("imageHeight", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "imageWidth", {
/**
* The image width.
*/
get: function () {
return this.getPropertyValue("imageWidth");
},
set: function (val) {
this.setPropertyValue("imageWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "acceptedTypes", {
/**
* Accepted file types. Passed to the 'accept' attribute of the file input tag. See https://www.w3schools.com/tags/att_input_accept.asp for more details.
*/
get: function () {
return this.getPropertyValue("acceptedTypes");
},
set: function (val) {
this.setPropertyValue("acceptedTypes", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "storeDataAsText", {
/**
* Set it to false if you do not want to serialize file content as text in the survey.data.
* In this case, you have to write the code onUploadFiles event to store the file content.
* @see SurveyModel.onUploadFiles
*/
get: function () {
return this.getPropertyValue("storeDataAsText");
},
set: function (val) {
this.setPropertyValue("storeDataAsText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "waitForUpload", {
/**
* Set it to true if you want to wait until files will be uploaded to your server.
*/
get: function () {
return this.getPropertyValue("waitForUpload", false);
},
set: function (val) {
this.setPropertyValue("waitForUpload", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "allowImagesPreview", {
/**
* Set it to false if you want to disable images preview.
*/
get: function () {
return this.getPropertyValue("allowImagesPreview");
},
set: function (val) {
this.setPropertyValue("allowImagesPreview", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "maxSize", {
/**
* Use this property to setup the maximum allowed file size.
*/
get: function () {
return this.getPropertyValue("maxSize", 0);
},
set: function (val) {
this.setPropertyValue("maxSize", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "needConfirmRemoveFile", {
/**
* Use this property to setup confirmation to remove file.
*/
get: function () {
return this.getPropertyValue("needConfirmRemoveFile");
},
set: function (val) {
this.setPropertyValue("needConfirmRemoveFile", val);
},
enumerable: true,
configurable: true
});
/**
* The remove file confirmation message.
*/
QuestionFileModel.prototype.getConfirmRemoveMessage = function (fileName) {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */]
.getString("confirmRemoveFile")["format"](fileName);
};
Object.defineProperty(QuestionFileModel.prototype, "confirmRemoveAllMessage", {
/**
* The remove all files confirmation message.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("confirmRemoveAllFiles");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "noFileChosenCaption", {
/**
* The no file chosen caption for modern theme.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noFileChosen");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "chooseButtonCaption", {
/**
* The choose files button caption for modern theme.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("chooseFileCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "cleanButtonCaption", {
/**
* The clean files button caption.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("cleanCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "removeFileCaption", {
/**
* The remove file button caption.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("removeFileCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "inputTitle", {
/**
* The input title value.
*/
get: function () {
if (this.isUploading)
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("loadingFile");
if (this.isEmpty())
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("chooseFile");
return " ";
},
enumerable: true,
configurable: true
});
/**
* Clear value programmatically.
*/
QuestionFileModel.prototype.clear = function (doneCallback) {
var _this = this;
this.survey.clearFiles(this.name, this.value, null, function (status, data) {
if (status === "success") {
_this.value = undefined;
_this.errors = [];
!!doneCallback && doneCallback();
}
});
};
/**
* Remove file item programmatically.
*/
QuestionFileModel.prototype.removeFile = function (content) {
var _this = this;
this.survey.clearFiles(this.name, this.value, content.name, function (status, data) {
if (status === "success") {
var oldValue = _this.value;
if (Array.isArray(oldValue)) {
_this.value = oldValue.filter(function (f) { return f.name !== content.name; });
}
else {
_this.value = undefined;
}
}
});
};
/**
* Load multiple files programmatically.
* @param files
*/
QuestionFileModel.prototype.loadFiles = function (files) {
var _this = this;
if (!this.survey) {
return;
}
this.errors = [];
if (!this.allFilesOk(files)) {
return;
}
this.stateChanged("loading");
var loadFilesProc = function () {
var content = [];
if (_this.storeDataAsText) {
files.forEach(function (file) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
content = content.concat([
{ name: file.name, type: file.type, content: fileReader.result }
]);
if (content.length === files.length) {
_this.value = (_this.value || []).concat(content);
}
};
fileReader.readAsDataURL(file);
});
}
else {
_this.survey.uploadFiles(_this.name, files, function (status, data) {
if (status === "error") {
_this.stateChanged("error");
}
if (status === "success") {
_this.value = (_this.value || []).concat(data.map(function (r) {
return {
name: r.file.name,
type: r.file.type,
content: r.content
};
}));
}
});
}
};
if (this.allowMultiple) {
loadFilesProc();
}
else {
this.clear(loadFilesProc);
}
};
QuestionFileModel.prototype.canPreviewImage = function (fileItem) {
return this.allowImagesPreview && !!fileItem && this.isFileImage(fileItem);
};
QuestionFileModel.prototype.setQuestionValue = function (newValue) {
var _this = this;
_super.prototype.setQuestionValue.call(this, newValue);
this.previewValue = [];
var state = (!Array.isArray(newValue) && !!newValue) ||
(Array.isArray(newValue) && newValue.length > 0)
? this.showPreview
? "loading"
: "loaded"
: "empty";
this.stateChanged(state);
if (!this.showPreview || !newValue)
return;
var newValues = Array.isArray(newValue)
? newValue
: !!newValue
? [newValue]
: [];
if (this.storeDataAsText) {
newValues.forEach(function (value) {
var content = value.content || value;
_this.previewValue = _this.previewValue.concat([
{
name: value.name,
type: value.type,
content: content
}
]);
});
if (state === "loading")
this.stateChanged("loaded");
}
else {
newValues.forEach(function (value) {
var content = value.content || value;
_this.survey.downloadFile(_this.name, value, function (status, data) {
if (status === "success") {
_this.previewValue = _this.previewValue.concat([
{
content: data,
name: value.name,
type: value.type
}
]);
if (_this.previewValue.length === newValues.length) {
_this.stateChanged("loaded");
}
}
else {
_this.stateChanged("error");
}
});
});
}
};
QuestionFileModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.isUploading && this.waitForUpload) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["g" /* UploadingFileError */](__WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile"), this));
}
};
QuestionFileModel.prototype.stateChanged = function (state) {
if (state === "loading") {
this.isUploading = true;
}
if (state === "loaded") {
this.isUploading = false;
}
this.currentState = state;
this.onStateChanged.fire(this, { state: state });
};
QuestionFileModel.prototype.allFilesOk = function (files) {
var _this = this;
var errorLength = this.errors ? this.errors.length : 0;
(files || []).forEach(function (file) {
if (_this.maxSize > 0 && file.size > _this.maxSize) {
_this.errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["e" /* ExceedSizeError */](_this.maxSize, _this));
}
});
return errorLength === this.errors.length;
};
QuestionFileModel.prototype.isFileImage = function (file) {
if (!file)
return false;
var imagePrefix = "data:image";
var subStr = file.content && file.content.substr(0, imagePrefix.length);
subStr = subStr && subStr.toLowerCase();
var result = subStr === imagePrefix ||
(!!file.type && file.type.toLowerCase().indexOf("image/") === 0);
return result;
};
QuestionFileModel.prototype.getPlainData = function (options) {
if (options === void 0) { options = {
includeEmpty: true
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData && !this.isEmpty()) {
questionPlainData.isNode = false;
var values = Array.isArray(this.value) ? this.value : [this.value];
questionPlainData.data = values.map(function (dataValue, index) {
return {
name: index,
title: "File",
value: (dataValue.content && dataValue.content) || dataValue,
displayValue: (dataValue.name && dataValue.name) || dataValue,
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false
};
});
}
return questionPlainData;
};
return QuestionFileModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("file", [
{ name: "showPreview:boolean", default: true },
"allowMultiple:boolean",
{ name: "allowImagesPreview:boolean", default: true },
"imageHeight",
"imageWidth",
"acceptedTypes",
{ name: "storeDataAsText:boolean", default: true },
{ name: "waitForUpload:boolean", default: false },
"maxSize:number",
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
{ name: "validators", visible: false },
{ name: "needConfirmRemoveFile:boolean", visible: true, default: false }
], function () {
return new QuestionFileModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) {
return new QuestionFileModel(name);
});
/***/ }),
/* 119 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionnonvalue__ = __webpack_require__(49);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionHtmlModel; });
/**
* A Model for html question. Unlike other questions it doesn't have value and title.
*/
var QuestionHtmlModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionHtmlModel, _super);
function QuestionHtmlModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
var locHtml = _this.createLocalizableString("html", _this);
var self = _this;
locHtml.onGetTextCallback = function (str) {
return !!self.survey ? self.survey.processHtml(str) : str;
};
return _this;
}
QuestionHtmlModel.prototype.getType = function () {
return "html";
};
Object.defineProperty(QuestionHtmlModel.prototype, "html", {
/**
* Set html to display it
*/
get: function () {
return this.getLocalizableStringText("html", "");
},
set: function (val) {
this.setLocalizableStringText("html", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "locHtml", {
get: function () {
return this.getLocalizableString("html");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "processedHtml", {
get: function () {
return this.survey ? this.survey.processHtml(this.html) : this.html;
},
enumerable: true,
configurable: true
});
return QuestionHtmlModel;
}(__WEBPACK_IMPORTED_MODULE_1__questionnonvalue__["a" /* QuestionNonValue */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("html", [{ name: "html:html", serializationProperty: "locHtml" }], function () {
return new QuestionHtmlModel("");
}, "nonvalue");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) {
return new QuestionHtmlModel(name);
});
/***/ }),
/* 120 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionImagePickerModel; });
/**
* A Model for a select image question.
*/
var QuestionImagePickerModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionImagePickerModel, _super);
function QuestionImagePickerModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.colCount = 0;
return _this;
}
QuestionImagePickerModel.prototype.getType = function () {
return "imagepicker";
};
QuestionImagePickerModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionImagePickerModel.prototype.getItemValueType = function () {
return "imageitemvalue";
};
Object.defineProperty(QuestionImagePickerModel.prototype, "multiSelect", {
/**
* Multi select option. If set to true, then allows to select multiple images.
*/
get: function () {
return this.getPropertyValue("multiSelect", false);
},
set: function (newValue) {
this.setPropertyValue("multiSelect", newValue);
},
enumerable: true,
configurable: true
});
/**
* Returns true if item is checked
* @param item image picker item value
*/
QuestionImagePickerModel.prototype.isItemSelected = function (item) {
var val = this.renderedValue;
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isValueEmpty(val))
return false;
if (!this.multiSelect)
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(val, item.value);
if (!Array.isArray(val))
return false;
for (var i = 0; i < val.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(val[i], item.value))
return true;
}
return false;
};
QuestionImagePickerModel.prototype.clearIncorrectValues = function () {
if (this.multiSelect) {
var val = this.value;
if (!val)
return;
if (!Array.isArray(val) || val.length == 0) {
this.clearValue();
return;
}
var newValue = [];
for (var i = 0; i < val.length; i++) {
if (!this.hasUnknownValue(val[i], true)) {
newValue.push(val[i]);
}
}
if (newValue.length == val.length)
return;
if (newValue.length == 0) {
this.clearValue();
}
else {
this.value = newValue;
}
}
else {
_super.prototype.clearIncorrectValues.call(this);
}
};
Object.defineProperty(QuestionImagePickerModel.prototype, "showLabel", {
/**
* Show label under the image.
*/
get: function () {
return this.getPropertyValue("showLabel", false);
},
set: function (newValue) {
this.setPropertyValue("showLabel", newValue);
},
enumerable: true,
configurable: true
});
QuestionImagePickerModel.prototype.getValueCore = function () {
var value = _super.prototype.getValueCore.call(this);
if (value !== undefined) {
return value;
}
if (this.multiSelect) {
return [];
}
return value;
};
Object.defineProperty(QuestionImagePickerModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () {
return this.getPropertyValue("imageHeight");
},
set: function (val) {
this.setPropertyValue("imageHeight", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "imageWidth", {
/**
* The image width.
*/
get: function () {
return this.getPropertyValue("imageWidth");
},
set: function (val) {
this.setPropertyValue("imageWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "imageFit", {
/**
* The image fit mode.
*/
get: function () {
return this.getPropertyValue("imageFit");
},
set: function (val) {
this.setPropertyValue("imageFit", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "contentMode", {
/**
* The content mode.
*/
get: function () {
return this.getPropertyValue("contentMode");
},
set: function (val) {
this.setPropertyValue("contentMode", val);
if (val === "video") {
this.showLabel = true;
}
},
enumerable: true,
configurable: true
});
return QuestionImagePickerModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("imageitemvalue", [], undefined, "itemvalue");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addProperty("imageitemvalue", {
name: "imageLink"
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("imagepicker", [
{ name: "hasOther", visible: false },
{ name: "otherText", visible: false },
{ name: "optionsCaption", visible: false },
{ name: "otherErrorText", visible: false },
{ name: "storeOthersAsComment", visible: false },
{
name: "contentMode",
default: "image",
choices: ["image", "video"]
},
{
name: "imageFit",
default: "contain",
choices: ["none", "contain", "cover", "fill"]
},
{ name: "imageHeight:number", default: 150, minValue: 0 },
{ name: "imageWidth:number", default: 200, minValue: 0 }
], function () {
return new QuestionImagePickerModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addProperty("imagepicker", {
name: "showLabel:boolean",
default: false
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addProperty("imagepicker", {
name: "colCount:number",
default: 0,
choices: [0, 1, 2, 3, 4, 5]
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addProperty("imagepicker", {
name: "multiSelect:boolean",
default: false
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addProperty("imagepicker", {
name: "choices:imageitemvalue[]"
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("imagepicker", function (name) {
var q = new QuestionImagePickerModel(name);
//q.choices = QuestionFactory.DefaultChoices;
return q;
});
/***/ }),
/* 121 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__martixBase__ = __webpack_require__(43);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__question_dropdown__ = __webpack_require__(46);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MartrixCells; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return QuestionMatrixModel; });
var MatrixRowModel = /** @class */ (function () {
function MatrixRowModel(item, fullName, data, value) {
this.fullName = fullName;
this.item = item;
this.data = data;
this.rowValue = value;
}
Object.defineProperty(MatrixRowModel.prototype, "name", {
get: function () {
return this.item.value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "text", {
get: function () {
return this.item.text;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "locText", {
get: function () {
return this.item.locText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "value", {
get: function () {
return this.rowValue;
},
set: function (newValue) {
this.rowValue = newValue;
if (this.data)
this.data.onMatrixRowChanged(this);
this.onValueChanged();
},
enumerable: true,
configurable: true
});
MatrixRowModel.prototype.onValueChanged = function () { };
return MatrixRowModel;
}());
var MartrixCells = /** @class */ (function () {
function MartrixCells(cellsOwner) {
this.cellsOwner = cellsOwner;
this.values = {};
}
Object.defineProperty(MartrixCells.prototype, "isEmpty", {
get: function () {
return Object.keys(this.values).length == 0;
},
enumerable: true,
configurable: true
});
MartrixCells.prototype.setCellText = function (row, column, val) {
row = this.getCellRowColumnValue(row, this.rows);
column = this.getCellRowColumnValue(column, this.columns);
if (!row || !column)
return;
if (val) {
if (!this.values[row])
this.values[row] = {};
if (!this.values[row][column])
this.values[row][column] = this.createString();
this.values[row][column].text = val;
}
else {
if (this.values[row] && this.values[row][column]) {
var loc = this.values[row][column];
loc.text = "";
if (loc.isEmpty) {
delete this.values[row][column];
if (Object.keys(this.values[row]).length == 0) {
delete this.values[row];
}
}
}
}
};
MartrixCells.prototype.setDefaultCellText = function (column, val) {
this.setCellText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column, val);
};
MartrixCells.prototype.getCellLocText = function (row, column) {
row = this.getCellRowColumnValue(row, this.rows);
column = this.getCellRowColumnValue(column, this.columns);
if (!row || !column)
return null;
if (!this.values[row])
return null;
if (!this.values[row][column])
return null;
return this.values[row][column];
};
MartrixCells.prototype.getDefaultCellLocText = function (column, val) {
return this.getCellLocText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column);
};
MartrixCells.prototype.getCellDisplayLocText = function (row, column) {
var cellText = this.getCellLocText(row, column);
if (cellText && !cellText.isEmpty)
return cellText;
cellText = this.getCellLocText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column);
if (cellText && !cellText.isEmpty)
return cellText;
if (typeof column == "number") {
column =
column >= 0 && column < this.columns.length
? this.columns[column]
: null;
}
if (column && column.locText)
return column.locText;
return null;
};
MartrixCells.prototype.getCellText = function (row, column) {
var loc = this.getCellLocText(row, column);
return loc ? loc.calculatedText : null;
};
MartrixCells.prototype.getDefaultCellText = function (column) {
var loc = this.getCellLocText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column);
return loc ? loc.calculatedText : null;
};
MartrixCells.prototype.getCellDisplayText = function (row, column) {
var loc = this.getCellDisplayLocText(row, column);
return loc ? loc.calculatedText : null;
};
Object.defineProperty(MartrixCells.prototype, "rows", {
get: function () {
return this.cellsOwner ? this.cellsOwner.getRows() : [];
},
enumerable: true,
configurable: true
});
Object.defineProperty(MartrixCells.prototype, "columns", {
get: function () {
return this.cellsOwner ? this.cellsOwner.getColumns() : [];
},
enumerable: true,
configurable: true
});
MartrixCells.prototype.getCellRowColumnValue = function (val, values) {
if (typeof val == "number") {
if (val < 0 || val >= values.length)
return null;
val = values[val].value;
}
if (val.value)
return val.value;
return val;
};
MartrixCells.prototype.getJson = function () {
if (this.isEmpty)
return null;
var res = {};
for (var row in this.values) {
var resRow = {};
var rowValues = this.values[row];
for (var col in rowValues) {
resRow[col] = rowValues[col].getJson();
}
res[row] = resRow;
}
return res;
};
MartrixCells.prototype.setJson = function (value) {
this.values = {};
if (!value)
return;
for (var row in value) {
if (row == "pos")
continue;
var rowValues = value[row];
this.values[row] = {};
for (var col in rowValues) {
if (col == "pos")
continue;
var loc = this.createString();
loc.setJson(rowValues[col]);
this.values[row][col] = loc;
}
}
};
MartrixCells.prototype.createString = function () {
return new __WEBPACK_IMPORTED_MODULE_8__localizablestring__["a" /* LocalizableString */](this.cellsOwner, true);
};
return MartrixCells;
}());
/**
* A Model for a simple matrix question.
*/
var QuestionMatrixModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixModel, _super);
function QuestionMatrixModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isRowChanging = false;
_this.emptyLocalizableString = new __WEBPACK_IMPORTED_MODULE_8__localizablestring__["a" /* LocalizableString */](_this);
_this.cellsValue = new MartrixCells(_this);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("columns", function () {
self.onColumnsChanged();
});
_this.registerFunctionOnPropertyValueChanged("rows", function () {
if (!self.filterItems()) {
self.onRowsChanged();
}
});
return _this;
}
QuestionMatrixModel.prototype.getType = function () {
return "matrix";
};
Object.defineProperty(QuestionMatrixModel.prototype, "isAllRowRequired", {
/**
* Set this property to true, if you want a user to answer all rows.
*/
get: function () {
return this.getPropertyValue("isAllRowRequired", false);
},
set: function (val) {
this.setPropertyValue("isAllRowRequired", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "hasRows", {
/**
* Returns true, if there is at least one row.
*/
get: function () {
return this.rows.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "rowsOrder", {
/**
* Use this property to render items in a specific order: "random" or "initial". Default is "initial".
*/
get: function () {
return this.getPropertyValue("rowsOrder");
},
set: function (val) {
val = val.toLowerCase();
if (val == this.rowsOrder)
return;
this.setPropertyValue("rowsOrder", val);
this.onRowsChanged();
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.getRows = function () {
return this.rows;
};
QuestionMatrixModel.prototype.getColumns = function () {
return this.visibleColumns;
};
QuestionMatrixModel.prototype.getQuizQuestionCount = function () {
var res = 0;
for (var i = 0; i < this.rows.length; i++) {
if (!this.isValueEmpty(this.correctAnswer[this.rows[i].value]))
res++;
}
return res;
};
QuestionMatrixModel.prototype.getCorrectAnswerCount = function () {
var res = 0;
var value = this.value;
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i].value;
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value[row]) &&
__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(this.correctAnswer[row], value[row]))
res++;
}
return res;
};
QuestionMatrixModel.prototype.getVisibleRows = function () {
var result = new Array();
var val = this.value;
if (!val)
val = {};
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (this.isValueEmpty(row.value))
continue;
result.push(this.createMatrixRow(row, this.id + "_" + row.value.toString().replace(/\s/g, "_"), val[row.value]));
}
if (result.length == 0 && !this.filteredRows) {
result.push(this.createMatrixRow(new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](null), this.name.replace(/\s/g, "_"), val));
}
this.generatedVisibleRows = result;
return result;
};
QuestionMatrixModel.prototype.sortVisibleRows = function (array) {
var order = this.rowsOrder.toLowerCase();
if (order === "random")
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].randomizeArray(array);
return array;
};
QuestionMatrixModel.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.rows = this.sortVisibleRows(this.rows);
};
QuestionMatrixModel.prototype.processRowsOnSet = function (newRows) {
return this.sortVisibleRows(newRows);
};
Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", {
/**
* Returns the list of visible rows as model objects.
* @see rowsVisibleIf
*/
get: function () {
return this.getVisibleRows();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "cells", {
get: function () {
return this.cellsValue;
},
set: function (value) {
this.cells.setJson(value && value.getJson ? value.getJson() : null);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "hasCellText", {
get: function () {
return !this.cells.isEmpty;
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.setCellText = function (row, column, val) {
this.cells.setCellText(row, column, val);
};
QuestionMatrixModel.prototype.getCellText = function (row, column) {
return this.cells.getCellText(row, column);
};
QuestionMatrixModel.prototype.setDefaultCellText = function (column, val) {
this.cells.setDefaultCellText(column, val);
};
QuestionMatrixModel.prototype.getDefaultCellText = function (column) {
return this.cells.getDefaultCellText(column);
};
QuestionMatrixModel.prototype.getCellDisplayText = function (row, column) {
return this.cells.getCellDisplayText(row, column);
};
QuestionMatrixModel.prototype.getCellDisplayLocText = function (row, column) {
var loc = this.cells.getCellDisplayLocText(row, column);
return loc ? loc : this.emptyLocalizableString;
};
QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () {
return this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["i" /* RequiredInAllRowsError */](null, this));
}
};
QuestionMatrixModel.prototype.hasErrorInRows = function () {
if (!this.isAllRowRequired)
return false;
return !this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.hasValuesInAllRows = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (!rows)
return true;
for (var i = 0; i < rows.length; i++) {
var val = rows[i].value;
if (!val)
return false;
}
return true;
};
QuestionMatrixModel.prototype.getIsAnswered = function () {
return _super.prototype.getIsAnswered.call(this) && this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) {
return new MatrixRowModel(item, fullName, this, value);
};
QuestionMatrixModel.prototype.setQuestionValue = function (newValue) {
_super.prototype.setQuestionValue.call(this, newValue);
if (this.isRowChanging ||
!this.generatedVisibleRows ||
this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.value;
if (!val)
val = {};
if (this.rows.length == 0) {
this.generatedVisibleRows[0].value = val;
}
else {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
var rowVal = val[row.name] ? val[row.name] : null;
this.generatedVisibleRows[i].value = rowVal;
}
}
this.isRowChanging = false;
};
QuestionMatrixModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var res = {};
for (var key in value) {
var newKey = keysAsText
? __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, key)
: key;
if (!newKey)
newKey = key;
var newValue = __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.columns, value[key]);
if (!newValue)
newValue = value[key];
res[newKey] = newValue;
}
return res;
};
QuestionMatrixModel.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
var values = this.createValueCopy();
questionPlainData.isNode = true;
questionPlainData.data = Object.keys(values || {}).map(function (rowName) {
var row = _this.rows.filter(function (r) { return r.value === rowName; })[0];
var rowDataItem = {
name: rowName,
title: !!row ? row.text : "row",
value: values[rowName],
displayValue: __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(_this.visibleColumns, values[rowName]),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false
};
var item = __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getItemByValue(_this.visibleColumns, values[rowName]);
if (!!item) {
(options.calculations || []).forEach(function (calculation) {
rowDataItem[calculation.propertyName] =
item[calculation.propertyName];
});
}
return rowDataItem;
});
}
return questionPlainData;
};
QuestionMatrixModel.prototype.addConditionNames = function (names) {
for (var i = 0; i < this.rows.length; i++) {
if (this.rows[i].value) {
names.push(this.name + "." + this.rows[i].value);
}
}
};
QuestionMatrixModel.prototype.addConditionObjectsByContext = function (objects, context) {
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
if (!!row.value) {
objects.push({
name: this.name + "." + row.value,
text: this.processedTitle + "." + row.calculatedText,
question: this
});
}
}
};
QuestionMatrixModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this);
var question = new __WEBPACK_IMPORTED_MODULE_9__question_dropdown__["a" /* QuestionDropdownModel */](path);
question.choices = this.columns;
var json = new __WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */]().toJsonObject(question);
json["type"] = question.getType();
return json;
};
QuestionMatrixModel.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
if (this.hasRows) {
this.clearInvisibleValuesInRows();
}
};
QuestionMatrixModel.prototype.getFirstInputElementId = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (rows.length > 0 && this.visibleColumns.length > 0) {
return this.inputId + "_" + rows[0].name + "_" + 0;
}
return _super.prototype.getFirstInputElementId.call(this);
};
//IMatrixData
QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) {
if (this.isRowChanging)
return;
this.isRowChanging = true;
if (!this.hasRows) {
this.setNewValue(row.value);
}
else {
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[row.name] = row.value;
this.setNewValue(newValue);
}
this.isRowChanging = false;
};
return QuestionMatrixModel;
}(__WEBPACK_IMPORTED_MODULE_3__martixBase__["a" /* QuestionMatrixBaseModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("matrix", [
{
name: "columns:itemvalue[]",
baseValue: function () {
return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column");
}
},
{
name: "rows:itemvalue[]",
baseValue: function () {
return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row");
}
},
{ name: "cells:cells", serializationProperty: "cells" },
{
name: "rowsOrder",
default: "initial",
choices: ["initial", "random"]
},
"isAllRowRequired:boolean"
], function () {
return new QuestionMatrixModel("");
}, "matrixbase");
__WEBPACK_IMPORTED_MODULE_7__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrixModel(name);
q.rows = __WEBPACK_IMPORTED_MODULE_7__questionfactory__["a" /* QuestionFactory */].DefaultRows;
q.columns = __WEBPACK_IMPORTED_MODULE_7__questionfactory__["a" /* QuestionFactory */].DefaultColums;
return q;
});
/***/ }),
/* 122 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDropdownRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDropdownModel; });
var MatrixDropdownRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownRowModel, _super);
function MatrixDropdownRowModel(name, item, data, value) {
var _this = _super.call(this, data, value) || this;
_this.name = name;
_this.item = item;
_this.buildCells(value);
return _this;
}
Object.defineProperty(MatrixDropdownRowModel.prototype, "rowName", {
get: function () {
return this.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModel.prototype, "text", {
get: function () {
return this.item.text;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModel.prototype, "locText", {
get: function () {
return this.item.locText;
},
enumerable: true,
configurable: true
});
return MatrixDropdownRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* MatrixDropdownRowModelBase */]));
/**
* A Model for a matrix dropdown question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.
*/
var QuestionMatrixDropdownModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDropdownModel, _super);
function QuestionMatrixDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("totalText", _this, true);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rows", function () {
self.generatedVisibleRows = null;
self.filterItems();
});
return _this;
}
QuestionMatrixDropdownModel.prototype.getType = function () {
return "matrixdropdown";
};
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "totalText", {
/**
* Set this property to show it on the first column for the total row.
*/
get: function () {
return this.getLocalizableStringText("totalText", "");
},
set: function (val) {
this.setLocalizableStringText("totalText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "locTotalText", {
get: function () {
return this.getLocalizableString("totalText");
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModel.prototype.getFooterText = function () {
return this.locTotalText;
};
QuestionMatrixDropdownModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var values = this.createValueCopy();
if (!values)
return values;
var rows = this.visibleRows;
var res = {};
for (var i = 0; i < rows.length; i++) {
var rowValue = this.rows[i].value;
var val = values[rowValue];
if (!val)
continue;
if (keysAsText) {
var displayRowValue = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, rowValue);
if (!!displayRowValue) {
rowValue = displayRowValue;
}
}
res[rowValue] = this.getRowDisplayValue(rows[i], val);
}
return values;
};
QuestionMatrixDropdownModel.prototype.addConditionNames = function (names) {
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value)
continue;
var prefix = this.name + "." + this.rows[i].value + ".";
for (var j = 0; j < this.columns.length; j++) {
names.push(prefix + this.columns[j].name);
}
}
};
QuestionMatrixDropdownModel.prototype.addConditionObjectsByContext = function (objects, context) {
var hasContext = !!context ? this.columns.indexOf(context) > -1 : false;
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
if (!row.value)
continue;
var prefixName = this.name + "." + row.value + ".";
var prefixTitle = this.processedTitle + "." + row.calculatedText + ".";
for (var j = 0; j < this.columns.length; j++) {
var column = this.columns[j];
objects.push({
name: prefixName + column.name,
text: prefixTitle + column.fullTitle,
question: this
});
}
}
if (hasContext) {
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
if (column == context)
continue;
objects.push({
name: "row." + column.name,
text: "row." + column.fullTitle,
question: this
});
}
}
};
QuestionMatrixDropdownModel.prototype.clearIncorrectValues = function () {
var val = this.value;
if (!val)
return;
var newVal = null;
var isChanged = false;
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
for (var key in val) {
if (__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key)) {
if (newVal == null)
newVal = {};
newVal[key] = val[key];
}
else {
isChanged = true;
}
}
if (isChanged) {
this.value = newVal;
}
_super.prototype.clearIncorrectValues.call(this);
};
QuestionMatrixDropdownModel.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
this.clearInvisibleValuesInRows();
};
QuestionMatrixDropdownModel.prototype.generateRows = function () {
var result = new Array();
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
if (!rows || rows.length === 0)
return result;
var val = this.value;
if (!val)
val = {};
for (var i = 0; i < rows.length; i++) {
if (!rows[i].value)
continue;
result.push(this.createMatrixRow(rows[i], val[rows[i].value]));
}
return result;
};
QuestionMatrixDropdownModel.prototype.createMatrixRow = function (item, value) {
return new MatrixDropdownRowModel(item.value, item, this, value);
};
return QuestionMatrixDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("matrixdropdown", [
{
name: "rows:itemvalue[]"
},
"rowsVisibleIf:condition",
{ name: "totalText", serializationProperty: "locTotalText" }
], function () {
return new QuestionMatrixDropdownModel("");
}, "matrixdropdownbase");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdropdown", function (name) {
var q = new QuestionMatrixDropdownModel(name);
q.choices = [1, 2, 3, 4, 5];
q.rows = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].DefaultColums;
__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 123 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDynamicRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDynamicModel; });
var MatrixDynamicRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDynamicRowModel, _super);
function MatrixDynamicRowModel(index, data, value) {
var _this = _super.call(this, data, value) || this;
_this.index = index;
_this.buildCells(value);
return _this;
}
Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", {
get: function () {
return this.id;
},
enumerable: true,
configurable: true
});
return MatrixDynamicRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* MatrixDropdownRowModelBase */]));
/**
* A Model for a matrix dymanic question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.
* An end-user may dynamically add/remove rows, unlike in matrix dropdown question.
*/
var QuestionMatrixDynamicModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDynamicModel, _super);
function QuestionMatrixDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rowCounter = 0;
_this.rowCountValue = 2;
_this.setRowCountValueFromData = false;
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("addRowText", _this);
_this.createLocalizableString("removeRowText", _this);
return _this;
}
QuestionMatrixDynamicModel.prototype.getType = function () {
return "matrixdynamic";
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isRowsDynamic", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDelete", {
/**
* Set it to true, to show a confirmation dialog on removing a row
* @see ConfirmDeleteText
*/
get: function () {
return this.getPropertyValue("confirmDelete", false);
},
set: function (val) {
this.setPropertyValue("confirmDelete", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyName", {
/**
* Set it to a column name and the library shows duplication error, if there are same values in different rows in the column.
* @see keyDuplicationError
*/
get: function () {
return this.getPropertyValue("keyName", "");
},
set: function (val) {
this.setPropertyValue("keyName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultRowValue", {
/**
* If it is not empty, then this value is set to every new row, including rows created initially, unless the defaultValue is not empty
* @see defaultValue
* @see defaultValueFromLastRow
*/
get: function () {
return this.getPropertyValue("defaultRowValue");
},
set: function (val) {
this.setPropertyValue("defaultRowValue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultValueFromLastRow", {
/**
* Set it to true to copy the value into new added row from the last row. If defaultRowValue is set and this property equals to true,
* then the value for new added row is merging.
* @see defaultValue
* @see defaultRowValue
*/
get: function () {
return this.getPropertyValue("defaultValueFromLastRow", false);
},
set: function (val) {
this.setPropertyValue("defaultValueFromLastRow", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.isDefaultValueEmpty = function () {
return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultRowValue));
};
QuestionMatrixDynamicModel.prototype.setDefaultValue = function () {
if (this.isValueEmpty(this.defaultRowValue) ||
!this.isValueEmpty(this.defaultValue)) {
_super.prototype.setDefaultValue.call(this);
return;
}
if (!this.isEmpty() || this.rowCount == 0)
return;
var newValue = [];
for (var i = 0; i < this.rowCount; i++) {
newValue.push(this.defaultRowValue);
}
this.value = newValue;
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCount", {
/**
* The number of rows in the matrix.
* @see minRowCount
* @see maxRowCount
*/
get: function () {
return this.rowCountValue;
},
set: function (val) {
if (val < 0 || val > __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount)
return;
this.setRowCountValueFromData = false;
var prevValue = this.rowCountValue;
this.rowCountValue = val;
if (this.value && this.value.length > val) {
var qVal = this.value;
qVal.splice(val);
this.value = qVal;
}
if (this.isLoadingFromJson)
return;
if (this.generatedVisibleRows) {
this.generatedVisibleRows.splice(val);
for (var i = prevValue; i < val; i++) {
var newRow = this.createMatrixRow(null);
this.generatedVisibleRows.push(newRow);
this.onMatrixRowCreated(newRow);
}
}
this.onRowsChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "minRowCount", {
/**
* The minimum row count. A user could not delete a row if the rowCount equals to minRowCount
* @see rowCount
* @see maxRowCount
*/
get: function () {
return this.getPropertyValue("minRowCount", 0);
},
set: function (val) {
if (val < 0)
val = 0;
this.setPropertyValue("minRowCount", val);
if (val > this.maxRowCount)
this.maxRowCount = val;
if (this.rowCount < val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "maxRowCount", {
/**
* The maximum row count. A user could not add a row if the rowCount equals to maxRowCount
* @see rowCount
* @see minRowCount
*/
get: function () {
return this.getPropertyValue("maxRowCount", __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount)
val = __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount;
if (val == this.maxRowCount)
return;
this.setPropertyValue("maxRowCount", val);
if (val < this.minRowCount)
this.minRowCount = val;
if (this.rowCount > val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canAddRow", {
/**
* Returns true, if a new row can be added.
* @see maxRowCount
* @see canRemoveRows
* @see rowCount
*/
get: function () {
return !this.isReadOnly && this.rowCount < this.maxRowCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canRemoveRows", {
/**
* Returns true, if row can be removed.
* @see minRowCount
* @see canAddRow
* @see rowCount
*/
get: function () {
return !this.isReadOnly && this.rowCount > this.minRowCount;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.canRemoveRow = function (row) {
if (!this.survey)
return true;
return this.survey.matrixAllowRemoveRow(this, row.index, row);
};
/**
* Creates and add a new row.
*/
QuestionMatrixDynamicModel.prototype.addRow = function () {
var options = { question: this, canAddRow: this.canAddRow };
if (!!this.survey) {
this.survey.matrixBeforeRowAdded(options);
}
if (!options.canAddRow)
return;
this.onStartRowAddingRemoving();
this.addRowCore();
this.onEndRowAdding();
};
QuestionMatrixDynamicModel.prototype.hasRowsAsItems = function () {
return false;
};
QuestionMatrixDynamicModel.prototype.addRowCore = function () {
var prevRowCount = this.rowCount;
this.rowCount = this.rowCount + 1;
var defaultValue = this.getDefaultRowValue(true);
var newValue = null;
if (!this.isValueEmpty(defaultValue)) {
newValue = this.createNewValue();
if (newValue.length == this.rowCount) {
newValue[newValue.length - 1] = defaultValue;
this.value = newValue;
}
}
if (this.data) {
this.runCellsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
var row = this.visibleRows[this.rowCount - 1];
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(row.value)) {
if (!newValue) {
newValue = this.createNewValue();
}
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isTwoValueEquals(newValue[newValue.length - 1], row.value)) {
newValue[newValue.length - 1] = row.value;
this.value = newValue;
}
}
}
if (this.survey) {
if (prevRowCount + 1 == this.rowCount) {
this.survey.matrixRowAdded(this);
this.onRowsChanged();
}
}
};
QuestionMatrixDynamicModel.prototype.getDefaultRowValue = function (isRowAdded) {
var res = null;
for (var i = 0; i < this.columns.length; i++) {
var q = this.columns[i].templateQuestion;
if (!!q && !this.isValueEmpty(q.getDefaultValue())) {
res = res || {};
res[this.columns[i].name] = q.getDefaultValue();
}
}
if (!this.isValueEmpty(this.defaultRowValue)) {
for (var key in this.defaultRowValue) {
res = res || {};
res[key] = this.defaultRowValue[key];
}
}
if (isRowAdded && this.defaultValueFromLastRow) {
var val = this.value;
if (!!val && Array.isArray(val) && val.length >= this.rowCount - 1) {
var rowValue = val[this.rowCount - 2];
for (var key in rowValue) {
res = res || {};
res[key] = rowValue[key];
}
}
}
return res;
};
/**
* Removes a row by it's index. If confirmDelete is true, show a confirmation dialog
* @param index a row index, from 0 to rowCount - 1
* @see removeRow
* @see confirmDelete
*/
QuestionMatrixDynamicModel.prototype.removeRowUI = function (value) {
if (!!value && !!value.rowName) {
var index = this.visibleRows.indexOf(value);
if (index < 0)
return;
value = index;
}
if (!this.isRequireConfirmOnRowDelete(value) ||
confirm(this.confirmDeleteText)) {
this.removeRow(value);
}
};
QuestionMatrixDynamicModel.prototype.isRequireConfirmOnRowDelete = function (index) {
if (!this.confirmDelete)
return false;
if (index < 0 || index >= this.rowCount)
return false;
var value = this.createNewValue();
if (__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value) || !Array.isArray(value))
return false;
if (index >= value.length)
return false;
return !__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value[index]);
};
/**
* Removes a row by it's index.
* @param index a row index, from 0 to rowCount - 1
*/
QuestionMatrixDynamicModel.prototype.removeRow = function (index) {
if (!this.canRemoveRows)
return;
if (index < 0 || index >= this.rowCount)
return;
this.onStartRowAddingRemoving();
this.removeRowCore(index);
this.onEndRowRemoving(index);
};
QuestionMatrixDynamicModel.prototype.removeRowCore = function (index) {
if (this.survey) {
var row = this.generatedVisibleRows
? this.generatedVisibleRows[index]
: null;
this.survey.matrixRowRemoved(this, index, row);
}
if (this.generatedVisibleRows && index < this.generatedVisibleRows.length) {
this.generatedVisibleRows.splice(index, 1);
}
this.rowCountValue--;
if (this.value) {
var val = [];
if (Array.isArray(this.value) && index < this.value.length) {
val = this.createValueCopy();
}
else {
val = this.createNewValue();
}
val.splice(index, 1);
val = this.deleteRowValue(val, null);
this.isRowChanging = true;
this.value = val;
this.isRowChanging = false;
}
this.onRowsChanged();
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDeleteText", {
/**
* Use this property to change the default text showing in the confirmation delete dialog on removing a row.
*/
get: function () {
return this.getLocalizableStringText("confirmDeleteText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("confirmDelete"));
},
set: function (val) {
this.setLocalizableStringText("confirmDeleteText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locConfirmDeleteText", {
get: function () {
return this.getLocalizableString("confirmDeleteText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyDuplicationError", {
/**
* The duplication value error text. Set it to show the text different from the default.
* @see keyName
*/
get: function () {
return this.getLocalizableStringText("keyDuplicationError", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError"));
},
set: function (val) {
this.setLocalizableStringText("keyDuplicationError", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locKeyDuplicationError", {
get: function () {
return this.getLocalizableString("keyDuplicationError");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowText", {
/**
* Use this property to change the default value of add row button text.
*/
get: function () {
var defaultLocName = this.isColumnLayoutHorizontal ? "addRow" : "addColumn";
return this.getLocalizableStringText("addRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString(defaultLocName));
},
set: function (val) {
this.setLocalizableStringText("addRowText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locAddRowText", {
get: function () {
return this.getLocalizableString("addRowText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowLocation", {
/**
* By default the 'Add Row' button is shown on bottom if columnLayout is horizontal and on top if columnLayout is vertical.
* You may set it to "top", "bottom" or "topBottom" (to show on top and bottom).
* @see columnLayout
*/
get: function () {
return this.getPropertyValue("addRowLocation");
},
set: function (val) {
this.setPropertyValue("addRowLocation", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isAddRowOnTop", {
get: function () {
if (!this.canAddRow)
return false;
if (this.addRowLocation === "default")
return this.columnLayout === "vertical";
return this.addRowLocation !== "bottom";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isAddRowOnBottom", {
get: function () {
if (!this.canAddRow)
return false;
if (this.addRowLocation === "default")
return this.columnLayout === "horizontal";
return this.addRowLocation !== "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "removeRowText", {
/**
* Use this property to change the default value of remove row button text.
*/
get: function () {
return this.getLocalizableStringText("removeRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("removeRow"));
},
set: function (val) {
this.setLocalizableStringText("removeRowText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locRemoveRowText", {
get: function () {
return this.getLocalizableString("removeRowText");
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var values = this.createValueCopy();
if (!values || !Array.isArray(values))
return values;
var rows = this.visibleRows;
for (var i = 0; i < rows.length && i < values.length; i++) {
var val = values[i];
if (!val)
continue;
values[i] = this.getRowDisplayValue(rows[i], val);
}
return values;
};
QuestionMatrixDynamicModel.prototype.addConditionNames = function (names) {
for (var i = 0; i < this.columns.length; i++) {
names.push(this.name + "[0]." + this.columns[i].name);
}
};
QuestionMatrixDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) {
var hasContext = !!context ? this.columns.indexOf(context) > -1 : false;
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
objects.push({
name: this.name + "[0]." + column.name,
text: this.processedTitle + "[0]." + column.fullTitle,
question: this
});
if (hasContext && column != context) {
objects.push({
name: "row." + column.name,
text: "row." + column.fullTitle,
question: this
});
}
}
};
QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () {
return false;
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "hasRowText", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["j" /* MinRowCountError */](this.minRowCount, this));
}
};
QuestionMatrixDynamicModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var prevValue = _super.prototype.hasErrors.call(this, fireCallback);
var isDuplicated = this.isValueDuplicated();
return isDuplicated || prevValue;
};
QuestionMatrixDynamicModel.prototype.hasErrorInRows = function () {
if (this.minRowCount <= 0 || !this.generatedVisibleRows)
return false;
var res = false;
var setRowCount = 0;
for (var rowIndex = 0; rowIndex < this.generatedVisibleRows.length; rowIndex++) {
var row = this.generatedVisibleRows[rowIndex];
if (!row.isEmpty)
setRowCount++;
}
return setRowCount < this.minRowCount;
};
QuestionMatrixDynamicModel.prototype.isValueDuplicated = function () {
if (!this.keyName || !this.generatedVisibleRows)
return false;
var column = this.getColumnByName(this.keyName);
if (!column)
return false;
var keyValues = [];
var res = false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
res =
this.isValueDuplicatedInRow(this.generatedVisibleRows[i], column, keyValues) || res;
}
return res;
};
QuestionMatrixDynamicModel.prototype.isValueDuplicatedInRow = function (row, column, keyValues) {
var question = row.getQuestionByColumn(column);
if (!question || question.isEmpty())
return false;
var value = question.value;
for (var i = 0; i < keyValues.length; i++) {
if (value == keyValues[i]) {
question.addError(new __WEBPACK_IMPORTED_MODULE_5__error__["f" /* KeyDuplicationError */](this.keyDuplicationError, this));
return true;
}
}
keyValues.push(value);
return false;
};
QuestionMatrixDynamicModel.prototype.generateRows = function () {
var result = new Array();
if (this.rowCount === 0)
return result;
var val = this.createNewValue();
for (var i = 0; i < this.rowCount; i++) {
result.push(this.createMatrixRow(this.getRowValueByIndex(val, i)));
}
if (!this.isValueEmpty(this.getDefaultRowValue(false))) {
this.value = val;
}
return result;
};
QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) {
return new MatrixDynamicRowModel(this.rowCounter++, this, value);
};
QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) {
if (!val || !Array.isArray(val))
return;
var newRowCount = val.length;
if (newRowCount == this.rowCount)
return;
if (!this.setRowCountValueFromData && newRowCount < this.rowCount)
return;
this.setRowCountValueFromData = true;
this.rowCountValue = newRowCount;
if (this.generatedVisibleRows) {
this.generatedVisibleRows = null;
this.generatedVisibleRows = this.visibleRows;
this.onRowsChanged();
}
};
QuestionMatrixDynamicModel.prototype.createNewValue = function () {
var result = this.createValueCopy();
if (!result || !Array.isArray(result))
result = [];
if (result.length > this.rowCount)
result.splice(this.rowCount);
var rowValue = this.getDefaultRowValue(false);
rowValue = rowValue || {};
for (var i = result.length; i < this.rowCount; i++) {
result.push(__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].getUnbindValue(rowValue));
}
return result;
};
QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) {
var isEmpty = true;
for (var i = 0; i < newValue.length; i++) {
if (this.isObject(newValue[i]) && Object.keys(newValue[i]).length > 0) {
isEmpty = false;
break;
}
}
return isEmpty ? null : newValue;
};
QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) {
return index >= 0 && index < questionValue.length
? questionValue[index]
: null;
};
QuestionMatrixDynamicModel.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
if (!this.generatedVisibleRows)
return {};
var res = this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));
if (!res && create)
res = {};
return res;
};
return QuestionMatrixDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* Serializer */].addClass("matrixdynamic", [
{ name: "rowsVisibleIf:condition", visible: false },
{ name: "rowCount:number", default: 2, minValue: 0 },
{ name: "minRowCount:number", default: 0, minValue: 0 },
{
name: "maxRowCount:number",
default: __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount
},
{ name: "keyName" },
{
name: "keyDuplicationError",
serializationProperty: "locKeyDuplicationError"
},
"defaultRowValue:rowvalue",
"defaultValueFromLastRow:boolean",
{ name: "confirmDelete:boolean" },
{
name: "confirmDeleteText",
serializationProperty: "locConfirmDeleteText"
},
{
name: "addRowLocation",
default: "default",
choices: ["default", "top", "bottom", "topBottom"]
},
{ name: "addRowText", serializationProperty: "locAddRowText" },
{ name: "removeRowText", serializationProperty: "locRemoveRowText" }
], function () {
return new QuestionMatrixDynamicModel("");
}, "matrixdropdownbase");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdynamic", function (name) {
var q = new QuestionMatrixDynamicModel(name);
q.choices = [1, 2, 3, 4, 5];
__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 124 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_text__ = __webpack_require__(48);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultipleTextItemModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMultipleTextModel; });
var MultipleTextItemModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MultipleTextItemModel, _super);
function MultipleTextItemModel(name, title) {
if (name === void 0) { name = null; }
if (title === void 0) { title = null; }
var _this = _super.call(this) || this;
_this.editorValue = _this.createEditor(name);
_this.editor.questionTitleTemplateCallback = function () {
return "";
};
_this.editor.titleLocation = "left";
if (title) {
_this.title = title;
}
return _this;
}
MultipleTextItemModel.prototype.getType = function () {
return "multipletextitem";
};
Object.defineProperty(MultipleTextItemModel.prototype, "id", {
get: function () {
return this.editor.id;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "name", {
/**
* The item name.
*/
get: function () {
return this.editor.name;
},
set: function (val) {
this.editor.name = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "editor", {
get: function () {
return this.editorValue;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.createEditor = function (name) {
return new __WEBPACK_IMPORTED_MODULE_3__question_text__["a" /* QuestionTextModel */](name);
};
MultipleTextItemModel.prototype.addUsedLocales = function (locales) {
_super.prototype.addUsedLocales.call(this, locales);
this.editor.addUsedLocales(locales);
};
MultipleTextItemModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
this.editor.locStrsChanged();
};
MultipleTextItemModel.prototype.setData = function (data) {
this.data = data;
if (!!data) {
this.editor.defaultValue = data.getItemDefaultValue(this.name);
this.editor.setSurveyImpl(this);
this.editor.parent = data;
}
};
Object.defineProperty(MultipleTextItemModel.prototype, "isRequired", {
/**
* Set this property to true, to make the item a required. If a user doesn't fill the item then a validation error will be generated.
*/
get: function () {
return this.editor.isRequired;
},
set: function (val) {
this.editor.isRequired = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () {
return this.editor.inputType;
},
set: function (val) {
this.editor.inputType = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "title", {
/**
* Item title. If it is empty, the item name is rendered as title. This property supports markdown.
* @see name
*/
get: function () {
return this.editor.title;
},
set: function (val) {
this.editor.title = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locTitle", {
get: function () {
return this.editor.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "fullTitle", {
/**
* Returns the text or html for rendering the title.
*/
get: function () {
return this.editor.fullTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "maxLength", {
/**
* The maximim text length. If it is -1, defaul value, then the survey maxTextLength property will be used.
* If it is 0, then the value is unlimited
* @see SurveyModel.maxTextLength
*/
get: function () {
return this.editor.maxLength;
},
set: function (val) {
this.editor.maxLength = val;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getMaxLength = function () {
var survey = this.getSurvey();
return __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, survey ? survey.maxTextLength : -1);
};
Object.defineProperty(MultipleTextItemModel.prototype, "placeHolder", {
/**
* The input place holder.
*/
get: function () {
return this.editor.placeHolder;
},
set: function (val) {
this.editor.placeHolder = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locPlaceHolder", {
get: function () {
return this.editor.locPlaceHolder;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
*/
get: function () {
return this.editor.requiredErrorText;
},
set: function (val) {
this.editor.requiredErrorText = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locRequiredErrorText", {
get: function () {
return this.editor.locRequiredErrorText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "validators", {
/**
* The list of question validators.
*/
get: function () {
return this.editor.validators;
},
set: function (val) {
this.editor.validators = val;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getValidators = function () {
return this.validators;
};
Object.defineProperty(MultipleTextItemModel.prototype, "value", {
/**
* The item value.
*/
get: function () {
return this.data ? this.data.getMultipleTextValue(this.name) : null;
},
set: function (value) {
if (this.data != null) {
this.data.setMultipleTextValue(this.name, value);
}
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.isEmpty = function () {
return __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(this.value);
};
MultipleTextItemModel.prototype.onValueChanged = function (newValue) {
if (this.valueChangedCallback)
this.valueChangedCallback(newValue);
};
//ISurveyImpl
MultipleTextItemModel.prototype.geSurveyData = function () {
return this;
};
MultipleTextItemModel.prototype.getSurvey = function () {
return this.data ? this.data.getSurvey() : null;
};
MultipleTextItemModel.prototype.getTextProcessor = function () {
return this.data ? this.data.getTextProcessor() : null;
};
//ISurveyData
MultipleTextItemModel.prototype.getValue = function (name) {
if (!this.data)
return null;
return this.data.getMultipleTextValue(name);
};
MultipleTextItemModel.prototype.setValue = function (name, value) {
if (this.data) {
this.data.setMultipleTextValue(name, value);
}
};
MultipleTextItemModel.prototype.getVariable = function (name) {
return undefined;
};
MultipleTextItemModel.prototype.setVariable = function (name, newValue) { };
MultipleTextItemModel.prototype.getComment = function (name) {
return null;
};
MultipleTextItemModel.prototype.setComment = function (name, newValue) { };
MultipleTextItemModel.prototype.getAllValues = function () {
if (this.data)
return this.data.getAllValues();
return this.value;
};
MultipleTextItemModel.prototype.getFilteredValues = function () {
return this.getAllValues();
};
MultipleTextItemModel.prototype.getFilteredProperties = function () {
return { survey: this.getSurvey() };
};
//IValidatorOwner
MultipleTextItemModel.prototype.getValidatorTitle = function () {
return this.title;
};
Object.defineProperty(MultipleTextItemModel.prototype, "validatedValue", {
get: function () {
return this.value;
},
set: function (val) {
this.value = val;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getDataFilteredValues = function () {
return this.getFilteredValues();
};
MultipleTextItemModel.prototype.getDataFilteredProperties = function () {
return this.getFilteredProperties();
};
return MultipleTextItemModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
/**
* A Model for a multiple text question.
*/
var QuestionMultipleTextModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMultipleTextModel, _super);
function QuestionMultipleTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isMultipleItemValueChanging = false;
var self = _this;
_this.items = _this.createNewArray("items", function (item) {
item.setData(self);
});
_this.registerFunctionOnPropertyValueChanged("items", function () {
self.fireCallback(self.colCountChangedCallback);
});
_this.registerFunctionOnPropertyValueChanged("colCount", function () {
self.fireCallback(self.colCountChangedCallback);
});
return _this;
}
QuestionMultipleTextModel.prototype.getType = function () {
return "multipletext";
};
QuestionMultipleTextModel.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
for (var i = 0; i < this.items.length; i++) {
this.items[i].setData(this);
}
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionMultipleTextModel.prototype.onSurveyLoad = function () {
this.editorsOnSurveyLoad();
_super.prototype.onSurveyLoad.call(this);
this.fireCallback(this.colCountChangedCallback);
};
QuestionMultipleTextModel.prototype.setQuestionValue = function (newValue) {
_super.prototype.setQuestionValue.call(this, newValue, false);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor)
item.editor.updateValueFromSurvey(item.value);
}
this.updateIsAnswered();
};
QuestionMultipleTextModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor)
item.editor.onSurveyValueChanged(item.value);
}
};
QuestionMultipleTextModel.prototype.editorsOnSurveyLoad = function () {
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor) {
item.editor.onSurveyLoad();
}
}
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "items", {
/**
* The list of input items.
*/
get: function () {
return this.getPropertyValue("items");
},
set: function (val) {
this.setPropertyValue("items", val);
},
enumerable: true,
configurable: true
});
/**
* Add a new text item.
* @param name a item name
* @param title a item title (optional)
*/
QuestionMultipleTextModel.prototype.addItem = function (name, title) {
if (title === void 0) { title = null; }
var item = this.createTextItem(name, title);
this.items.push(item);
return item;
};
QuestionMultipleTextModel.prototype.getItemByName = function (name) {
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].name == name)
return this.items[i];
}
return null;
};
QuestionMultipleTextModel.prototype.addConditionNames = function (names) {
for (var i = 0; i < this.items.length; i++) {
names.push(this.name + "." + this.items[i].name);
}
};
QuestionMultipleTextModel.prototype.addConditionObjectsByContext = function (objects, context) {
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
objects.push({
name: this.name + "." + item.name,
text: this.processedTitle + "." + item.fullTitle,
question: this
});
}
};
QuestionMultipleTextModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this);
var item = this.getItemByName(path);
if (!item)
return null;
var json = new __WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */]().toJsonObject(item);
json["type"] = "text";
return json;
};
QuestionMultipleTextModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
for (var i = 0; i < this.items.length; i++) {
this.items[i].locStrsChanged();
}
};
QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () {
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].isEmpty())
return false;
}
return true;
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "colCount", {
/**
* The number of columns. Items are rendred in one line if the value is 0.
*/
get: function () {
return this.getPropertyValue("colCount");
},
set: function (val) {
if (val < 1 || val > 5)
return;
this.setPropertyValue("colCount", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMultipleTextModel.prototype, "itemSize", {
/**
* The default text input size.
*/
get: function () {
return this.getPropertyValue("itemSize");
},
set: function (val) {
this.setPropertyValue("itemSize", val);
},
enumerable: true,
configurable: true
});
/**
* Returns the list of rendered rows.
*/
QuestionMultipleTextModel.prototype.getRows = function () {
var colCount = this.colCount;
var items = this.items;
var rows = [];
var index = 0;
for (var i = 0; i < items.length; i++) {
if (index == 0) {
rows.push([]);
}
rows[rows.length - 1].push(items[i]);
index++;
if (index >= colCount) {
index = 0;
}
}
return rows;
};
QuestionMultipleTextModel.prototype.onValueChanged = function () {
_super.prototype.onValueChanged.call(this);
this.onItemValueChanged();
};
QuestionMultipleTextModel.prototype.createTextItem = function (name, title) {
return new MultipleTextItemModel(name, title);
};
QuestionMultipleTextModel.prototype.onItemValueChanged = function () {
if (this.isMultipleItemValueChanging)
return;
for (var i = 0; i < this.items.length; i++) {
var itemValue = null;
if (this.value && this.items[i].name in this.value) {
itemValue = this.value[this.items[i].name];
}
this.items[i].onValueChanged(itemValue);
}
};
QuestionMultipleTextModel.prototype.getIsRunningValidators = function () {
if (_super.prototype.getIsRunningValidators.call(this))
return true;
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].editor.isRunningValidators)
return true;
}
return false;
};
QuestionMultipleTextModel.prototype.hasErrors = function (fireCallback, rec) {
var _this = this;
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var res = false;
for (var i = 0; i < this.items.length; i++) {
this.items[i].editor.onCompletedAsyncValidators = function (hasErrors) {
_this.raiseOnCompletedAsyncValidators();
};
res = this.items[i].editor.hasErrors(fireCallback) || res;
}
return _super.prototype.hasErrors.call(this, fireCallback) || res;
};
QuestionMultipleTextModel.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
for (var i = 0; i < this.items.length; i++) {
var errors = this.items[i].editor.getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
return result;
};
QuestionMultipleTextModel.prototype.clearErrors = function () {
_super.prototype.clearErrors.call(this);
for (var i = 0; i < this.items.length; i++) {
this.items[i].editor.clearErrors();
}
};
QuestionMultipleTextModel.prototype.getContainsErrors = function () {
var res = _super.prototype.getContainsErrors.call(this);
if (res)
return res;
var items = this.items;
for (var i = 0; i < items.length; i++) {
if (items[i].editor.containsErrors)
return true;
}
return false;
};
QuestionMultipleTextModel.prototype.getIsAnswered = function () {
if (!_super.prototype.getIsAnswered.call(this))
return false;
for (var i = 0; i < this.items.length; i++) {
var editor = this.items[i].editor;
if (editor.isVisible && !editor.isAnswered)
return false;
}
return true;
};
//IMultipleTextData
QuestionMultipleTextModel.prototype.getMultipleTextValue = function (name) {
if (!this.value)
return null;
return this.value[name];
};
QuestionMultipleTextModel.prototype.setMultipleTextValue = function (name, value) {
this.isMultipleItemValueChanging = true;
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[name] = value;
this.setNewValue(newValue);
this.isMultipleItemValueChanging = false;
};
QuestionMultipleTextModel.prototype.getItemDefaultValue = function (name) {
return !!this.defaultValue ? this.defaultValue[name] : null;
};
QuestionMultipleTextModel.prototype.getSurvey = function () {
return this.survey;
};
QuestionMultipleTextModel.prototype.getTextProcessor = function () {
return this.textProcessor;
};
QuestionMultipleTextModel.prototype.getAllValues = function () {
return this.data ? this.data.getAllValues() : null;
};
QuestionMultipleTextModel.prototype.getIsRequiredText = function () {
return this.survey ? this.survey.requiredText : "";
};
//IPanel
QuestionMultipleTextModel.prototype.addElement = function (element, index) { };
QuestionMultipleTextModel.prototype.removeElement = function (element) {
return false;
};
QuestionMultipleTextModel.prototype.getQuestionTitleLocation = function () {
return "left";
};
QuestionMultipleTextModel.prototype.getChildrenLayoutType = function () {
return "row";
};
QuestionMultipleTextModel.prototype.elementWidthChanged = function (el) { };
Object.defineProperty(QuestionMultipleTextModel.prototype, "elements", {
get: function () {
return [];
},
enumerable: true,
configurable: true
});
QuestionMultipleTextModel.prototype.indexOf = function (el) {
return -1;
};
return QuestionMultipleTextModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("multipletextitem", [
"name",
"isRequired:boolean",
{ name: "placeHolder", serializationProperty: "locPlaceHolder" },
{
name: "inputType",
default: "text",
choices: [
"color",
"date",
"datetime",
"datetime-local",
"email",
"month",
"number",
"password",
"range",
"tel",
"text",
"time",
"url",
"week"
]
},
{ name: "title", serializationProperty: "locTitle" },
{ name: "maxLength:number", default: -1 },
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText"
},
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
}
], function () {
return new MultipleTextItemModel("");
});
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* Serializer */].addClass("multipletext", [
{ name: "!items:textitems", className: "multipletextitem" },
{ name: "itemSize:number", default: 25, minValue: 0 },
{ name: "colCount:number", default: 1, choices: [1, 2, 3, 4, 5] }
], function () {
return new QuestionMultipleTextModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleTextModel(name);
q.addItem("text1");
q.addItem("text2");
return q;
});
/***/ }),
/* 125 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__panel__ = __webpack_require__(23);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionPanelDynamicItem; });
/* unused harmony export QuestionPanelDynamicTemplateSurveyImpl */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionPanelDynamicModel; });
var QuestionPanelDynamicItem = /** @class */ (function () {
function QuestionPanelDynamicItem(data, panel) {
this.data = data;
this.panelValue = panel;
var self = this;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
this.setSurveyImpl();
}
Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", {
get: function () {
return this.panelValue;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicItem.prototype.setSurveyImpl = function () {
this.panel.setSurveyImpl(this);
};
QuestionPanelDynamicItem.prototype.getValue = function (name) {
var values = this.getAllValues();
return values[name];
};
QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) {
this.data.setPanelItemData(this, name, newValue);
};
QuestionPanelDynamicItem.prototype.getVariable = function (name) {
return undefined;
};
QuestionPanelDynamicItem.prototype.setVariable = function (name, newValue) { };
QuestionPanelDynamicItem.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix);
return result ? result : "";
};
QuestionPanelDynamicItem.prototype.setComment = function (name, newValue, locNotification) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix, newValue);
};
QuestionPanelDynamicItem.prototype.getAllValues = function () {
return this.data.getPanelItemData(this);
};
QuestionPanelDynamicItem.prototype.getFilteredValues = function () {
var values = {};
var surveyValues = !!this.data && !!this.data.getRootData()
? this.data.getRootData().getFilteredValues()
: {};
for (var key in surveyValues) {
values[key] = surveyValues[key];
}
values[QuestionPanelDynamicItem.ItemVariableName] = this.getAllValues();
return values;
};
QuestionPanelDynamicItem.prototype.getFilteredProperties = function () {
if (!!this.data && !!this.data.getRootData())
return this.data.getRootData().getFilteredProperties();
return { survey: this.getSurvey() };
};
QuestionPanelDynamicItem.prototype.geSurveyData = function () {
return this;
};
QuestionPanelDynamicItem.prototype.getSurvey = function () {
return this.data ? this.data.getSurvey() : null;
};
QuestionPanelDynamicItem.prototype.getTextProcessor = function () {
return this;
};
//ITextProcessor
QuestionPanelDynamicItem.prototype.getProcessedTextValue = function (textValue) {
if (!textValue)
return;
var panelIndex = !!this.data ? this.data.getItemIndex(this) : -1;
if (textValue.name == QuestionPanelDynamicItem.IndexVariableName) {
textValue.isExists = true;
textValue.value = panelIndex + 1;
return;
}
var firstName = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
textValue.isExists = firstName == QuestionPanelDynamicItem.ItemVariableName;
textValue.canProcess = textValue.isExists;
if (!textValue.canProcess)
return;
//name should start with the panel
textValue.name = textValue.name.replace(QuestionPanelDynamicItem.ItemVariableName + ".", "");
var firstName = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
var question = this.panel.getQuestionByValueName(firstName);
if (!question && panelIndex > -1) {
question = this.data.getSharedQuestionFromArray(firstName, panelIndex);
}
var values = {};
if (question) {
values[firstName] = textValue.returnDisplayValue
? question.displayValue
: question.value;
}
else {
var allValues = this.getAllValues();
if (allValues) {
values[firstName] = allValues[firstName];
}
}
textValue.value = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getValue(textValue.name, values);
};
QuestionPanelDynamicItem.prototype.processText = function (text, returnDisplayValue) {
text = this.textPreProcessor.process(text, returnDisplayValue);
var survey = this.getSurvey();
return survey ? survey.processText(text, returnDisplayValue) : text;
};
QuestionPanelDynamicItem.prototype.processTextEx = function (text, returnDisplayValue) {
text = this.processText(text, returnDisplayValue);
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = { hasAllValuesOnLastRun: true, text: text };
if (this.getSurvey()) {
res = this.getSurvey().processTextEx(text, returnDisplayValue, false);
}
res.hasAllValuesOnLastRun =
res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
QuestionPanelDynamicItem.ItemVariableName = "panel";
QuestionPanelDynamicItem.IndexVariableName = "panelIndex";
return QuestionPanelDynamicItem;
}());
var QuestionPanelDynamicTemplateSurveyImpl = /** @class */ (function () {
function QuestionPanelDynamicTemplateSurveyImpl(data) {
this.data = data;
}
QuestionPanelDynamicTemplateSurveyImpl.prototype.geSurveyData = function () {
return null;
};
QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurvey = function () {
return this.data.getSurvey();
};
QuestionPanelDynamicTemplateSurveyImpl.prototype.getTextProcessor = function () {
return null;
};
return QuestionPanelDynamicTemplateSurveyImpl;
}());
/**
* A Model for a panel dymanic question. You setup the template panel, but adding elements (any question or a panel) and assign a text to it's title, and this panel will be used as a template on creating dynamic panels. The number of panels is defined by panelCount property.
* An end-user may dynamically add/remove panels, unless you forbidden this.
*/
var QuestionPanelDynamicModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionPanelDynamicModel, _super);
function QuestionPanelDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.loadingPanelCount = 0;
_this.currentIndexValue = -1;
_this.isAddingNewPanels = false;
_this.createNewArray("panels");
_this.templateValue = _this.createAndSetupNewPanelObject();
_this.template.renderWidth = "100%";
_this.template.selectedElementInDesign = _this;
var self = _this;
_this.template.addElementCallback = function (element) {
self.addOnPropertyChangedCallback(element);
self.rebuildPanels();
};
_this.template.removeElementCallback = function (element) {
self.rebuildPanels();
};
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("panelAddText", _this);
_this.createLocalizableString("panelRemoveText", _this);
_this.createLocalizableString("panelPrevText", _this);
_this.createLocalizableString("panelNextText", _this);
_this.registerFunctionOnPropertyValueChanged("panelsState", function () {
self.setPanelsState();
});
return _this;
}
QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.setTemplatePanelSurveyImpl();
this.setPanelsSurveyImpl();
};
QuestionPanelDynamicModel.prototype.assignOnPropertyChangedToTemplate = function () {
var elements = this.template.elements;
for (var i = 0; i < elements.length; i++) {
this.addOnPropertyChangedCallback(elements[i]);
}
};
QuestionPanelDynamicModel.prototype.addOnPropertyChangedCallback = function (element) {
var self = this;
element.onPropertyChanged.add(function (element, options) {
self.onTemplateElementPropertyChanged(element, options);
});
if (element.isPanel) {
element.addElementCallback = function (element) {
self.addOnPropertyChangedCallback(element);
};
}
};
QuestionPanelDynamicModel.prototype.onTemplateElementPropertyChanged = function (element, options) {
if (this.isLoadingFromJson || this.isDesignMode || this.panels.length == 0)
return;
var property = __WEBPACK_IMPORTED_MODULE_7__jsonobject__["c" /* Serializer */].findProperty(element.getType(), options.name);
if (!property)
return;
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
var question = panels[i].getQuestionByName(element.name);
if (!!question && question[options.name] !== options.newValue) {
question[options.name] = options.newValue;
}
}
};
QuestionPanelDynamicModel.prototype.getType = function () {
return "paneldynamic";
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.removeElement = function (element) {
return this.template.removeElement(element);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "template", {
/**
* The template Panel. This panel is used as a template on creatign dynamic panels
* @see templateElements
* @see templateTitle
* @see panelCount
*/
get: function () {
return this.templateValue;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.getPanel = function () {
return this.template;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateElements", {
/**
* The template Panel elements, questions and panels.
* @see templateElements
* @see template
* @see panelCount
*/
get: function () {
return this.template.elements;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitle", {
/**
* The template Panel title property.
* @see templateElements
* @see template
* @see panelCount
*/
get: function () {
return this.template.title;
},
set: function (newValue) {
this.template.title = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateTitle", {
get: function () {
return this.template.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateDescription", {
/**
* The template Panel description property.
* @see templateElements
* @see template
* @see panelCount
* @see templateTitle
*/
get: function () {
return this.template.description;
},
set: function (newValue) {
this.template.description = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateDescription", {
get: function () {
return this.template.locDescription;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "items", {
get: function () {
var res = [];
for (var i = 0; i < this.panels.length; i++) {
res.push(this.panels[i].data);
}
return res;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panels", {
/**
* The array of dynamic panels created based on panel template
* @see template
* @see panelCount
*/
get: function () {
return this.getPropertyValue("panels");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentIndex", {
/**
* The index of current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns -1, otherwise it returns a value from 0 to panelCount - 1.
* @see currentPanel
* @see panels
* @see panelCount
* @see renderMode
*/
get: function () {
if (this.isRenderModeList)
return -1;
if (this.isDesignMode)
return 0;
if (this.currentIndexValue < 0 && this.panelCount > 0) {
this.currentIndexValue = 0;
}
if (this.currentIndexValue >= this.panelCount) {
this.currentIndexValue = this.panelCount - 1;
}
return this.currentIndexValue;
},
set: function (val) {
if (this.currentIndexValue !== val) {
if (val >= this.panelCount)
val = this.panelCount - 1;
this.currentIndexValue = val;
this.fireCallback(this.currentIndexChangedCallback);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentPanel", {
/**
* The current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns null.
* @see currenIndex
* @see panels
* @see panelCount
* @see renderMode
*/
get: function () {
var index = this.currentIndex;
if (index < 0 || index >= this.panels.length)
return null;
return this.panels[index];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDelete", {
/**
* Set it to true, to show a confirmation dialog on removing a panel
* @see ConfirmDeleteText
*/
get: function () {
return this.getPropertyValue("confirmDelete", false);
},
set: function (val) {
this.setPropertyValue("confirmDelete", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyName", {
/**
* Set it to a question name used in the template panel and the library shows duplication error, if there are same values in different panels of this question.
* @see keyDuplicationError
*/
get: function () {
return this.getPropertyValue("keyName", "");
},
set: function (val) {
this.setPropertyValue("keyName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDeleteText", {
/**
* Use this property to change the default text showing in the confirmation delete dialog on removing a panel.
*/
get: function () {
return this.getLocalizableStringText("confirmDeleteText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("confirmDelete"));
},
set: function (val) {
this.setLocalizableStringText("confirmDeleteText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locConfirmDeleteText", {
get: function () {
return this.getLocalizableString("confirmDeleteText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyDuplicationError", {
/**
* The duplication value error text. Set it to show the text different from the default.
* @see keyName
*/
get: function () {
return this.getLocalizableStringText("keyDuplicationError", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError"));
},
set: function (val) {
this.setLocalizableStringText("keyDuplicationError", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locKeyDuplicationError", {
get: function () {
return this.getLocalizableString("keyDuplicationError");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelPrevText", {
/**
* Use this property to change the default previous button text. Previous button shows the previous panel, change the currentPanel, when the renderMode doesn't equal to "list".
* @see currentPanel
* @see currentIndex
* @see renderMode
*/
get: function () {
return this.getLocalizableStringText("panelPrevText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("pagePrevText"));
},
set: function (val) {
this.setLocalizableStringText("panelPrevText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelPrevText", {
get: function () {
return this.getLocalizableString("panelPrevText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelNextText", {
/**
* Use this property to change the default next button text. Next button shows the next panel, change the currentPanel, when the renderMode doesn't equal to "list".
* @see currentPanel
* @see currentIndex
* @see renderMode
*/
get: function () {
return this.getLocalizableStringText("panelNextText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("pageNextText"));
},
set: function (val) {
this.setLocalizableStringText("panelNextText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelNextText", {
get: function () {
return this.getLocalizableString("panelNextText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelAddText", {
/**
* Use this property to change the default value of add panel button text.
*/
get: function () {
return this.getLocalizableStringText("panelAddText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("addPanel"));
},
set: function (value) {
this.setLocalizableStringText("panelAddText", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelAddText", {
get: function () {
return this.getLocalizableString("panelAddText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelRemoveText", {
/**
* Use this property to change the default value of remove panel button text.
*/
get: function () {
return this.getLocalizableStringText("panelRemoveText", __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */].getString("removePanel"));
},
set: function (val) {
this.setLocalizableStringText("panelRemoveText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelRemoveText", {
get: function () {
return this.getLocalizableString("panelRemoveText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressTopShowing", {
/**
* Returns true when the renderMode equals to "progressTop" or "progressTopBottom"
*/
get: function () {
return (this.renderMode == "progressTop" || this.renderMode == "progressTopBottom");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressBottomShowing", {
/**
* Returns true when the renderMode equals to "progressBottom" or "progressTopBottom"
*/
get: function () {
return (this.renderMode == "progressBottom" ||
this.renderMode == "progressTopBottom");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isPrevButtonShowing", {
/**
* Returns true when currentIndex is more than 0.
* @see currenIndex
* @see currenPanel
*/
get: function () {
return this.currentIndex > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isNextButtonShowing", {
/**
* Returns true when currentIndex is more than or equal 0 and less then panelCount - 1.
* @see currenIndex
* @see currenPanel
* @see panelCount
*/
get: function () {
return this.currentIndex >= 0 && this.currentIndex < this.panelCount - 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRangeShowing", {
/**
* Returns true when showRangeInProgress equals to true, renderMode doesn't equal to "list" and panelCount is >= 2.
*/
get: function () {
return (this.showRangeInProgress && this.currentIndex >= 0 && this.panelCount > 1);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return includeHidden ? [this.template] : this.templateElements;
};
QuestionPanelDynamicModel.prototype.prepareValueForPanelCreating = function () {
this.addingNewPanelsValue = this.value;
this.isAddingNewPanels = true;
this.isNewPanelsValueChanged = false;
};
QuestionPanelDynamicModel.prototype.setValueAfterPanelsCreating = function () {
this.isAddingNewPanels = false;
if (this.isNewPanelsValueChanged) {
this.isValueChangingInternally = true;
this.value = this.addingNewPanelsValue;
this.isValueChangingInternally = false;
}
};
QuestionPanelDynamicModel.prototype.getValueCore = function () {
return this.isAddingNewPanels
? this.addingNewPanelsValue
: _super.prototype.getValueCore.call(this);
};
QuestionPanelDynamicModel.prototype.setValueCore = function (newValue) {
if (this.isAddingNewPanels) {
this.isNewPanelsValueChanged = true;
this.addingNewPanelsValue = newValue;
}
else {
_super.prototype.setValueCore.call(this, newValue);
}
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelCount", {
/**
* Use this property to get/set the number of dynamic panels.
* @see template
* @see minPanelCount
* @see maxPanelCount
* @see addPanel
* @see removePanel
* @see removePanelUI
*/
get: function () {
return this.isLoadingFromJson || this.isDesignMode
? this.loadingPanelCount
: this.panels.length;
},
set: function (val) {
if (val < 0)
return;
if (this.isLoadingFromJson || this.isDesignMode) {
this.loadingPanelCount = val;
return;
}
if (val == this.panels.length || this.isDesignMode)
return;
this.prepareValueForPanelCreating();
for (var i = this.panelCount; i < val; i++) {
var panel = this.createNewPanel();
this.panels.push(panel);
if (this.renderMode == "list" && this.panelsState != "default") {
if (this.panelsState === "expand") {
panel.expand();
}
else {
panel.collapse();
}
}
}
if (val < this.panelCount)
this.panels.splice(val, this.panelCount - val);
this.setValueAfterPanelsCreating();
this.setValueBasedOnPanelCount();
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelsState", {
/**
* Use this property to allow the end-user to collapse/expand the panels. It works only if the renderMode property equals to "list" and templateTitle property is not empty. The following values are available:
*
default - the default value. User can't collpase/expand panels
*
expanded - User can collpase/expand panels and all panels are expanded by default
*
collapsed - User can collpase/expand panels and all panels are collapsed by default
*
firstExpanded - User can collpase/expand panels. The first panel is expanded and others are collapsed
* @see renderMode
* @see templateTitle
*/
get: function () {
return this.getPropertyValue("panelsState");
},
set: function (val) {
this.setPropertyValue("panelsState", val);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setTemplatePanelSurveyImpl = function () {
this.template.setSurveyImpl(this.isDesignMode
? this.surveyImpl
: new QuestionPanelDynamicTemplateSurveyImpl(this));
};
QuestionPanelDynamicModel.prototype.setPanelsSurveyImpl = function () {
for (var i = 0; i < this.panels.length; i++) {
var panel = this.panels[i];
if (panel == this.template)
continue;
panel.setSurveyImpl(panel.data);
}
};
QuestionPanelDynamicModel.prototype.setPanelsState = function () {
if (this.isDesignMode || this.renderMode != "list")
return;
for (var i = 0; i < this.panels.length; i++) {
var state = this.panelsState;
if (state === "firstExpanded") {
state = i === 0 ? "expanded" : "collapsed";
}
this.panels[i].state = state;
}
};
QuestionPanelDynamicModel.prototype.setValueBasedOnPanelCount = function () {
var value = this.value;
if (!value || !Array.isArray(value))
value = [];
if (value.length == this.panelCount)
return;
for (var i = value.length; i < this.panelCount; i++)
value.push({});
if (value.length > this.panelCount) {
value.splice(this.panelCount, value.length - this.panelCount);
}
this.isValueChangingInternally = true;
this.value = value;
this.isValueChangingInternally = false;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "minPanelCount", {
/**
* The minimum panel count. A user could not delete a panel if the panelCount equals to minPanelCount
* @see panelCount
* @see maxPanelCount
*/
get: function () {
return this.getPropertyValue("minPanelCount", 0);
},
set: function (val) {
if (val < 0)
val = 0;
if (val == this.minPanelCount)
return;
this.setPropertyValue("minPanelCount", val);
if (val > this.maxPanelCount)
this.maxPanelCount = val;
if (this.panelCount < val)
this.panelCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "maxPanelCount", {
/**
* The maximum panel count. A user could not add a panel if the panelCount equals to maxPanelCount
* @see panelCount
* @see minPanelCount
*/
get: function () {
return this.getPropertyValue("maxPanelCount", __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount)
val = __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount;
if (val == this.maxPanelCount)
return;
this.setPropertyValue("maxPanelCount", val);
if (val < this.minPanelCount)
this.minPanelCount = val;
if (this.panelCount > val)
this.panelCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowAddPanel", {
/**
* Set this property to false to hide the 'Add New' button
* @see allowRemovePanel
*/
get: function () {
return this.getPropertyValue("allowAddPanel");
},
set: function (val) {
this.setPropertyValue("allowAddPanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowRemovePanel", {
/**
* Set this property to false to hide the 'Remove' button
* @see allowAddPanel
*/
get: function () {
return this.getPropertyValue("allowRemovePanel");
},
set: function (val) {
this.setPropertyValue("allowRemovePanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitleLocation", {
/**
* Set this property different from "default" to set the specific question title location for the template questions.
* @see SurveyModel.questionTitleLocation
* @see PanelModelBase.questionTitleLocation
*/
get: function () {
return this.getPropertyValue("templateTitleLocation");
},
set: function (value) {
this.setPropertyValue("templateTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "showQuestionNumbers", {
/**
* Use this property to show/hide the numbers in titles in questions inside a dynamic panel.
* By default the value is "off". You may set it to "onPanel" and the first question inside a dynamic panel will start with 1 or "onSurvey" to include nested questions in dymamic panels into global survey question numbering.
*/
get: function () {
return this.getPropertyValue("showQuestionNumbers");
},
set: function (val) {
this.setPropertyValue("showQuestionNumbers", val);
if (!this.isLoadingFromJson && this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "showRangeInProgress", {
/**
* Shows the range from 1 to panelCount when renderMode doesn't equal to "list". Set to false to hide this element.
* @see panelCount
* @see renderMode
*/
get: function () {
return this.getPropertyValue("showRangeInProgress", true);
},
set: function (val) {
this.setPropertyValue("showRangeInProgress", val);
this.fireCallback(this.currentIndexChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "renderMode", {
/**
* By default the property equals to "list" and all dynamic panels are rendered one by one on the page. You may change it to: "progressTop", "progressBottom" or "progressTopBottom" to render only one dynamic panel at once. The progress and navigation elements can be rendred on top, bottom or both.
*/
get: function () {
return this.getPropertyValue("renderMode");
},
set: function (val) {
this.setPropertyValue("renderMode", val);
this.fireCallback(this.renderModeChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRenderModeList", {
/**
* Returns true when renderMode equals to "list".
* @see renderMode
*/
get: function () {
return this.renderMode == "list";
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setVisibleIndex = function (value) {
if (!this.isVisible)
return 0;
var startIndex = this.showQuestionNumbers == "onSurvey" ? value : 0;
for (var i = 0; i < this.panels.length; i++) {
var counter = this.setPanelVisibleIndex(this.panels[i], startIndex, this.showQuestionNumbers != "off");
if (this.showQuestionNumbers == "onSurvey") {
startIndex += counter;
}
}
_super.prototype.setVisibleIndex.call(this, this.showQuestionNumbers != "onSurvey" ? value : -1);
return this.showQuestionNumbers != "onSurvey" ? 1 : startIndex - value;
};
QuestionPanelDynamicModel.prototype.setPanelVisibleIndex = function (panel, index, showIndex) {
if (!showIndex) {
panel.setVisibleIndex(-1);
return 0;
}
return panel.setVisibleIndex(index);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "canAddPanel", {
/**
* Returns true when an end user may add a new panel. The question is not read only and panelCount less than maxPanelCount
* @see isReadOnly
* @see panelCount
* @see maxPanelCount
*/
get: function () {
if (this.survey && this.survey.isDesignMode)
return false;
return (this.allowAddPanel &&
!this.isReadOnly &&
this.panelCount < this.maxPanelCount);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "canRemovePanel", {
/**
* Returns true when an end user may remove a panel. The question is not read only and panelCount is more than minPanelCount
* @see isReadOnly
* @see panelCount
* @see minPanelCount
*/
get: function () {
if (this.survey && this.survey.isDesignMode)
return false;
return (this.allowRemovePanel &&
!this.isReadOnly &&
this.panelCount > this.minPanelCount);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.rebuildPanels = function () {
var _a;
if (this.isLoadingFromJson)
return;
this.prepareValueForPanelCreating();
var panels = [];
if (this.isDesignMode) {
new QuestionPanelDynamicItem(this, this.template);
panels.push(this.template);
}
else {
for (var i = 0; i < this.panelCount; i++) {
panels.push(this.createNewPanel());
}
}
(_a = this.panels).splice.apply(_a, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["d" /* __spreadArrays */])([0, this.panels.length], panels));
this.setValueAfterPanelsCreating();
this.setPanelsState();
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultPanelValue", {
/**
* If it is not empty, then this value is set to every new panel, including panels created initially, unless the defaultValue is not empty
* @see defaultValue
* @see defaultValueFromLastRow
*/
get: function () {
return this.getPropertyValue("defaultPanelValue");
},
set: function (val) {
this.setPropertyValue("defaultPanelValue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultValueFromLastPanel", {
/**
* Set it to true to copy the value into new added panel from the last panel. If defaultPanelValue is set and this property equals to true,
* then the value for new added panel is merging.
* @see defaultValue
* @see defaultPanelValue
*/
get: function () {
return this.getPropertyValue("defaultValueFromLastPanel", false);
},
set: function (val) {
this.setPropertyValue("defaultValueFromLastPanel", val);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.isDefaultValueEmpty = function () {
return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultPanelValue));
};
QuestionPanelDynamicModel.prototype.setDefaultValue = function () {
if (this.isValueEmpty(this.defaultPanelValue) ||
!this.isValueEmpty(this.defaultValue)) {
_super.prototype.setDefaultValue.call(this);
return;
}
if (!this.isEmpty() || this.panelCount == 0)
return;
var newValue = [];
for (var i = 0; i < this.panelCount; i++) {
newValue.push(this.defaultPanelValue);
}
this.value = newValue;
};
QuestionPanelDynamicModel.prototype.isEmpty = function () {
var val = this.value;
if (!val || !Array.isArray(val))
return true;
for (var i = 0; i < val.length; i++) {
if (!this.isRowEmpty(val[i]))
return false;
}
return true;
};
QuestionPanelDynamicModel.prototype.isRowEmpty = function (val) {
for (var prop in val) {
if (val.hasOwnProperty(prop))
return false;
}
return true;
};
/**
* Add a new dynamic panel based on the template Panel. It checks if canAddPanel returns true and then calls addPanel method.
* @see template
* @see panelCount
* @see panels
* @see canAddPanel
*/
QuestionPanelDynamicModel.prototype.addPanelUI = function () {
if (!this.canAddPanel)
return null;
var newPanel = this.addPanel();
if (this.renderMode === "list" && this.panelsState !== "default") {
newPanel.expand();
}
return newPanel;
};
/**
* Add a new dynamic panel based on the template Panel.
* @see template
* @see panelCount
* @see panels
*/
QuestionPanelDynamicModel.prototype.addPanel = function () {
this.panelCount++;
if (!this.isRenderModeList) {
this.currentIndex = this.panelCount - 1;
}
var newValue = this.value;
var hasModified = false;
if (!this.isValueEmpty(this.defaultPanelValue)) {
if (!!newValue &&
Array.isArray(newValue) &&
newValue.length == this.panelCount) {
hasModified = true;
this.copyValue(newValue[newValue.length - 1], this.defaultPanelValue);
}
}
if (this.defaultValueFromLastPanel &&
!!newValue &&
Array.isArray(newValue) &&
newValue.length > 1 &&
newValue.length == this.panelCount) {
hasModified = true;
this.copyValue(newValue[newValue.length - 1], newValue[newValue.length - 2]);
}
if (hasModified) {
this.value = newValue;
}
if (this.survey)
this.survey.dynamicPanelAdded(this);
return this.panels[this.panelCount - 1];
};
QuestionPanelDynamicModel.prototype.copyValue = function (src, dest) {
for (var key in dest) {
src[key] = dest[key];
}
};
/**
* Call removePanel function. Do nothing is canRemovePanel returns false. If confirmDelete set to true, it shows the confirmation dialog first.
* @param value a panel or panel index
* @see removePanel
* @see confirmDelete
* @see confirmDeleteText
* @see canRemovePanel
*
*/
QuestionPanelDynamicModel.prototype.removePanelUI = function (value) {
if (!this.canRemovePanel)
return;
if (!this.confirmDelete || confirm(this.confirmDeleteText)) {
this.removePanel(value);
}
};
/**
* Goes to the next panel in the PanelDynamic
*
*/
QuestionPanelDynamicModel.prototype.goToNextPanel = function () {
if (this.renderMode !== "list" && this.currentPanel.hasErrors())
return;
this.currentIndex++;
};
/**
* Goes to the previous panel in the PanelDynamic
*
*/
QuestionPanelDynamicModel.prototype.goToPrevPanel = function () {
this.currentIndex--;
};
/**
* Removes a dynamic panel from the panels array.
* @param value a panel or panel index
* @see panels
* @see template
*/
QuestionPanelDynamicModel.prototype.removePanel = function (value) {
var index = this.getPanelIndex(value);
if (index < 0 || index >= this.panelCount)
return;
this.panels.splice(index, 1);
var value = this.value;
if (!value || !Array.isArray(value) || index >= value.length)
return;
value.splice(index, 1);
this.value = value;
this.fireCallback(this.panelCountChangedCallback);
if (this.survey)
this.survey.dynamicPanelRemoved(this, index);
};
QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) {
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isNumber(val))
return val;
var items = this.items;
for (var i = 0; i < this.panels.length; i++) {
if (this.panels[i] === val || items[i] === val)
return i;
}
return -1;
};
QuestionPanelDynamicModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
panels[i].locStrsChanged();
}
};
QuestionPanelDynamicModel.prototype.clearIncorrectValues = function () {
for (var i = 0; i < this.panels.length; i++) {
this.clearIncorrectValuesInPanel(i);
}
};
QuestionPanelDynamicModel.prototype.clearErrors = function () {
_super.prototype.clearErrors.call(this);
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].clearErrors();
}
};
QuestionPanelDynamicModel.prototype.getQuestionFromArray = function (name, index) {
if (index >= this.panelCount)
return null;
return this.panels[index].getQuestionByName(name);
};
QuestionPanelDynamicModel.prototype.clearIncorrectValuesInPanel = function (index) {
var panel = this.panels[index];
panel.clearIncorrectValues();
var val = this.value;
var values = !!val && index < val.length ? val[index] : null;
if (!values)
return;
var isChanged = false;
for (var key in values) {
if (!panel.getQuestionByName(key) &&
!this.getSharedQuestionFromArray(key, index)) {
delete values[key];
isChanged = true;
}
}
if (isChanged) {
val[index] = values;
this.value = val;
}
};
QuestionPanelDynamicModel.prototype.getSharedQuestionFromArray = function (name, panelIndex) {
return !!this.survey && !!this.valueName
? (this.survey.getQuestionByValueNameFromArray(this.valueName, name, panelIndex))
: null;
};
QuestionPanelDynamicModel.prototype.addConditionNames = function (names) {
var prefix = this.name + "[0].";
var panelNames = [];
var questions = this.template.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].addConditionNames(panelNames);
}
for (var i = 0; i < panelNames.length; i++) {
names.push(prefix + panelNames[i]);
}
};
QuestionPanelDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) {
var hasContext = !!context
? this.template.questions.indexOf(context) > -1
: false;
var prefixName = this.name + "[0].";
var prefixText = this.processedTitle + "[0].";
var panelObjs = new Array();
var questions = this.template.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].addConditionObjectsByContext(panelObjs, context);
}
for (var i = 0; i < panelObjs.length; i++) {
objects.push({
name: prefixName + panelObjs[i].name,
text: prefixText + panelObjs[i].text,
question: panelObjs[i].question
});
}
if (hasContext) {
for (var i = 0; i < panelObjs.length; i++) {
if (panelObjs[i].question == context)
continue;
objects.push({
name: "panel." + panelObjs[i].name,
text: "panel." + panelObjs[i].text,
question: panelObjs[i].question
});
}
}
};
QuestionPanelDynamicModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this, operator, path);
var questionName = path;
var pos = path.indexOf(".");
if (pos > -1) {
questionName = path.substr(0, pos);
path = path.substr(pos + 1);
}
var question = this.template.getQuestionByName(questionName);
if (!question)
return null;
return question.getConditionJson(operator, path);
};
QuestionPanelDynamicModel.prototype.onReadOnlyChanged = function () {
var readOnly = this.isReadOnly;
this.template.readOnly = readOnly;
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].readOnly = readOnly;
}
_super.prototype.onReadOnlyChanged.call(this);
};
QuestionPanelDynamicModel.prototype.onSurveyLoad = function () {
this.template.readOnly = this.isReadOnly;
this.template.onSurveyLoad();
if (this.loadingPanelCount > 0) {
this.panelCount = this.loadingPanelCount;
}
if (this.isDesignMode) {
this.rebuildPanels();
}
this.setPanelsSurveyImpl();
this.setPanelsState();
this.assignOnPropertyChangedToTemplate();
_super.prototype.onSurveyLoad.call(this);
};
QuestionPanelDynamicModel.prototype.onFirstRendering = function () {
this.template.onFirstRendering();
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].onFirstRendering();
}
_super.prototype.onFirstRendering.call(this);
};
QuestionPanelDynamicModel.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runPanelsCondition(values, properties);
};
QuestionPanelDynamicModel.prototype.reRunCondition = function () {
if (!this.data)
return;
this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
};
QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values, properties) {
var cachedValues = {};
if (values && values instanceof Object) {
cachedValues = JSON.parse(JSON.stringify(values));
}
for (var i = 0; i < this.panels.length; i++) {
var panelValues = this.getPanelItemData(this.panels[i].data);
//Should be unique for every panel due async expression support
var newValues = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].createCopy(cachedValues);
newValues[QuestionPanelDynamicItem.ItemVariableName.toLowerCase()] = panelValues;
newValues[QuestionPanelDynamicItem.IndexVariableName.toLowerCase()] = i;
this.panels[i].runCondition(newValues, properties);
}
};
QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].onAnyValueChanged(name);
this.panels[i].onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName);
}
};
QuestionPanelDynamicModel.prototype.hasKeysDuplicated = function (fireCallback, rec) {
if (rec === void 0) { rec = null; }
var keyValues = [];
var res;
for (var i = 0; i < this.panels.length; i++) {
res =
this.isValueDuplicated(this.panels[i], keyValues, rec, fireCallback) ||
res;
}
return res;
};
QuestionPanelDynamicModel.prototype.updatePanelsContainsErrors = function () {
var question = this.changingValueQuestion;
var parent = question.parent;
while (!!parent) {
parent.updateContainsErrors();
parent = parent.parent;
}
this.updateContainsErrors();
};
QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
if (this.isValueChangingInternally)
return false;
var res = false;
if (!!this.changingValueQuestion) {
var res = this.changingValueQuestion.hasErrors(fireCallback, rec);
res = this.hasKeysDuplicated(fireCallback, rec) || res;
this.updatePanelsContainsErrors();
return res;
}
else {
var errosInPanels = this.hasErrorInPanels(fireCallback, rec);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels;
}
};
QuestionPanelDynamicModel.prototype.getContainsErrors = function () {
var res = _super.prototype.getContainsErrors.call(this);
if (res)
return res;
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
if (panels[i].containsErrors)
return true;
}
return false;
};
QuestionPanelDynamicModel.prototype.getIsAnswered = function () {
if (!_super.prototype.getIsAnswered.call(this))
return false;
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
var visibleQuestions = [];
panels[i].addQuestionsToList(visibleQuestions, true);
for (var j = 0; j < visibleQuestions.length; j++) {
if (!visibleQuestions[j].isAnswered)
return false;
}
}
return true;
};
QuestionPanelDynamicModel.prototype.clearValueIfInvisible = function () {
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
questions[j].clearValueIfInvisible();
}
}
_super.prototype.clearValueIfInvisible.call(this);
};
QuestionPanelDynamicModel.prototype.getIsRunningValidators = function () {
if (_super.prototype.getIsRunningValidators.call(this))
return true;
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
if (questions[j].isRunningValidators)
return true;
}
}
return false;
};
QuestionPanelDynamicModel.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
var errors = questions[j].getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
}
return result;
};
QuestionPanelDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var values = this.createValueCopy();
if (!values || !Array.isArray(values))
return values;
for (var i = 0; i < this.panels.length && i < values.length; i++) {
var val = values[i];
if (!val)
continue;
values[i] = this.getPanelDisplayValue(i, val, keysAsText);
}
return values;
};
QuestionPanelDynamicModel.prototype.getPanelDisplayValue = function (panelIndex, val, keysAsText) {
if (!val)
return val;
var panel = this.panels[panelIndex];
for (var key in val) {
var question = panel.getQuestionByValueName(key);
if (!question) {
question = this.getSharedQuestionFromArray(key, panelIndex);
}
if (!!question) {
val[key] = question.getDisplayValue(keysAsText);
}
}
return val;
};
QuestionPanelDynamicModel.prototype.hasErrorInPanels = function (fireCallback, rec) {
var res = false;
var panels = this.panels;
var keyValues = [];
for (var i = 0; i < panels.length; i++) {
this.setOnCompleteAsyncInPanel(panels[i]);
}
for (var i = 0; i < panels.length; i++) {
var pnlError = panels[i].hasErrors(fireCallback, !!rec && rec.focuseOnFirstError, rec);
pnlError = this.isValueDuplicated(panels[i], keyValues, rec) || pnlError;
if (!this.isRenderModeList && pnlError && !res) {
this.currentIndex = i;
}
res = pnlError || res;
}
return res;
};
QuestionPanelDynamicModel.prototype.setOnCompleteAsyncInPanel = function (panel) {
var _this = this;
var questions = panel.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].onCompletedAsyncValidators = function (hasErrors) {
_this.raiseOnCompletedAsyncValidators();
};
}
};
QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues, rec, fireCallback) {
if (!this.keyName)
return false;
var question = panel.getQuestionByValueName(this.keyName);
if (!question || question.isEmpty())
return false;
var value = question.value;
if (!!this.changingValueQuestion &&
question != this.changingValueQuestion) {
question.hasErrors(fireCallback, rec);
}
for (var i = 0; i < keyValues.length; i++) {
if (value == keyValues[i]) {
question.addError(new __WEBPACK_IMPORTED_MODULE_9__error__["f" /* KeyDuplicationError */](this.keyDuplicationError, this));
if (!!rec && !rec.firstErrorQuestion) {
rec.firstErrorQuestion = question;
}
return true;
}
}
keyValues.push(value);
return false;
};
QuestionPanelDynamicModel.prototype.createNewPanel = function () {
var panel = this.createAndSetupNewPanelObject();
var json = this.template.toJSON();
new __WEBPACK_IMPORTED_MODULE_7__jsonobject__["b" /* JsonObject */]().toObject(json, panel);
panel.renderWidth = "100%";
panel.updateCustomWidgets();
new QuestionPanelDynamicItem(this, panel);
return panel;
};
QuestionPanelDynamicModel.prototype.createAndSetupNewPanelObject = function () {
var panel = this.createNewPanelObject();
var self = this;
panel.onGetQuestionTitleLocation = function () {
return self.getTemplateQuestionTitleLocation();
};
return panel;
};
QuestionPanelDynamicModel.prototype.getTemplateQuestionTitleLocation = function () {
return this.templateTitleLocation != "default"
? this.templateTitleLocation
: this.getTitleLocationCore();
};
QuestionPanelDynamicModel.prototype.createNewPanelObject = function () {
return new __WEBPACK_IMPORTED_MODULE_6__panel__["c" /* PanelModel */]();
};
QuestionPanelDynamicModel.prototype.setPanelCountBasedOnValue = function () {
if (this.isValueChangingInternally)
return;
var val = this.value;
var newPanelCount = val && Array.isArray(val) ? val.length : 0;
if (newPanelCount == 0 && this.loadingPanelCount > 0) {
newPanelCount = this.loadingPanelCount;
}
this.panelCount = newPanelCount;
};
QuestionPanelDynamicModel.prototype.setQuestionValue = function (newValue) {
_super.prototype.setQuestionValue.call(this, newValue, false);
this.setPanelCountBasedOnValue();
for (var i = 0; i < this.panels.length; i++) {
this.panelUpdateValueFromSurvey(this.panels[i]);
}
this.updateIsAnswered();
};
QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.panels.length; i++) {
this.panelSurveyValueChanged(this.panels[i]);
}
if (newValue === undefined) {
this.setValueBasedOnPanelCount();
}
};
QuestionPanelDynamicModel.prototype.panelUpdateValueFromSurvey = function (panel) {
var questions = panel.questions;
var values = this.getPanelItemData(panel.data);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.updateValueFromSurvey(values[q.getValueName()]);
q.updateCommentFromSurvey(values[q.getValueName() + __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix]);
}
};
QuestionPanelDynamicModel.prototype.panelSurveyValueChanged = function (panel) {
var questions = panel.questions;
var values = this.getPanelItemData(panel.data);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.onSurveyValueChanged(values[q.getValueName()]);
}
};
QuestionPanelDynamicModel.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
if (this.isDesignMode) {
this.setTemplatePanelSurveyImpl();
this.rebuildPanels();
}
};
//IQuestionPanelDynamicData
QuestionPanelDynamicModel.prototype.getItemIndex = function (item) {
return this.items.indexOf(item);
};
QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) {
var items = this.items;
var index = items.indexOf(item);
var qValue = this.value;
if (index < 0 && Array.isArray(qValue) && qValue.length > items.length) {
index = items.length;
}
if (index < 0)
return {};
if (!qValue || !Array.isArray(qValue) || qValue.length <= index)
return {};
return qValue[index];
};
QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) {
var items = this.items;
var index = items.indexOf(item);
if (index < 0)
index = items.length;
var qValue = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.value);
if (!qValue || !Array.isArray(qValue)) {
qValue = [];
}
if (qValue.length <= index) {
for (var i = qValue.length; i <= index; i++) {
qValue.push({});
}
}
if (!qValue[index])
qValue[index] = {};
if (!this.isValueEmpty(val)) {
qValue[index][name] = val;
}
else {
delete qValue[index][name];
}
if (index >= 0 && index < this.panels.length) {
this.changingValueQuestion = this.panels[index].getQuestionByValueName(name);
}
this.value = qValue;
this.changingValueQuestion = null;
if (this.survey) {
var options = {
question: this,
panel: item.panel,
name: name,
itemIndex: index,
itemValue: qValue[index],
value: val
};
this.survey.dynamicPanelItemValueChanged(this, options);
}
};
QuestionPanelDynamicModel.prototype.getSurvey = function () {
return this.survey;
};
QuestionPanelDynamicModel.prototype.getRootData = function () {
return this.data;
};
QuestionPanelDynamicModel.prototype.getPlainData = function (options) {
if (options === void 0) { options = {
includeEmpty: true
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
questionPlainData.isNode = true;
questionPlainData.data = this.panels.map(function (panel, index) {
var panelDataItem = {
name: panel.name || index,
title: panel.title || "Panel",
value: panel.getValue(),
displayValue: panel.getValue(),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: true,
data: panel.questions
.map(function (question) { return question.getPlainData(options); })
.filter(function (d) { return !!d; })
};
(options.calculations || []).forEach(function (calculation) {
panelDataItem[calculation.propertyName] = panel[calculation.propertyName];
});
return panelDataItem;
});
}
return questionPlainData;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "progressText", {
get: function () {
var rangeMax = this.panelCount;
return __WEBPACK_IMPORTED_MODULE_2__surveyStrings__["a" /* surveyLocalization */]
.getString("panelDynamicProgressText")["format"](this.currentIndex + 1, rangeMax);
},
enumerable: true,
configurable: true
});
return QuestionPanelDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_5__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_7__jsonobject__["c" /* Serializer */].addClass("paneldynamic", [
{
name: "templateElements",
alternativeName: "questions",
visible: false,
isLightSerializable: false
},
{ name: "templateTitle:text", serializationProperty: "locTemplateTitle" },
{
name: "templateDescription:text",
serializationProperty: "locTemplateDescription"
},
{ name: "allowAddPanel:boolean", default: true },
{ name: "allowRemovePanel:boolean", default: true },
{
name: "panelCount:number",
default: 0,
choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
},
{ name: "minPanelCount:number", default: 0, minValue: 0 },
{
name: "maxPanelCount:number",
default: __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount
},
"defaultPanelValue:panelvalue",
"defaultValueFromLastPanel:boolean",
{
name: "panelsState",
default: "default",
choices: ["default", "collapsed", "expanded", "firstExpanded"]
},
{ name: "keyName" },
{
name: "keyDuplicationError",
serializationProperty: "locKeyDuplicationError"
},
{ name: "confirmDelete:boolean" },
{
name: "confirmDeleteText",
serializationProperty: "locConfirmDeleteText"
},
{ name: "panelAddText", serializationProperty: "locPanelAddText" },
{ name: "panelRemoveText", serializationProperty: "locPanelRemoveText" },
{ name: "panelPrevText", serializationProperty: "locPanelPrevText" },
{ name: "panelNextText", serializationProperty: "locPanelNextText" },
{
name: "showQuestionNumbers",
default: "off",
choices: ["off", "onPanel", "onSurvey"]
},
{ name: "showRangeInProgress:boolean", default: true },
{
name: "renderMode",
default: "list",
choices: ["list", "progressTop", "progressBottom", "progressTopBottom"]
},
{
name: "templateTitleLocation",
default: "default",
choices: ["default", "top", "bottom", "left"]
}
], function () {
return new QuestionPanelDynamicModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) {
return new QuestionPanelDynamicModel(name);
});
/***/ }),
/* 126 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroupModel; });
/**
* A Model for a radiogroup question.
*/
var QuestionRadiogroupModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionRadiogroupModel, _super);
function QuestionRadiogroupModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionRadiogroupModel.prototype.getType = function () {
return "radiogroup";
};
QuestionRadiogroupModel.prototype.getFirstInputElementId = function () {
return this.inputId + "_0";
};
Object.defineProperty(QuestionRadiogroupModel.prototype, "selectedItem", {
get: function () {
if (this.isEmpty())
return null;
return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.visibleChoices, this.value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRadiogroupModel.prototype, "showClearButton", {
/**
* Show "clear button" flag.
*/
get: function () {
return this.getPropertyValue("showClearButton", false);
},
set: function (val) {
this.setPropertyValue("showClearButton", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRadiogroupModel.prototype, "canShowClearButton", {
get: function () {
return this.showClearButton && !this.isReadOnly;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRadiogroupModel.prototype, "clearButtonCaption", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("clearCaption");
},
enumerable: true,
configurable: true
});
QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
return QuestionRadiogroupModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* Serializer */].addClass("radiogroup", [{ name: "showClearButton:boolean", default: false }], function () {
return new QuestionRadiogroupModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("radiogroup", function (name) {
var q = new QuestionRadiogroupModel(name);
q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 127 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRatingModel; });
/**
* A Model for a rating question.
*/
var QuestionRatingModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionRatingModel, _super);
function QuestionRatingModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rates = _this.createItemValues("rates");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rates", function () {
self.fireCallback(self.rateValuesChangedCallback);
});
_this.onPropertyChanged.add(function (sender, options) {
if (options.name == "rateMin" ||
options.name == "rateMax" ||
options.name == "rateStep") {
self.fireCallback(self.rateValuesChangedCallback);
}
});
var locMinRateDescriptionValue = _this.createLocalizableString("minRateDescription", _this, true);
var locMaxRateDescriptionValue = _this.createLocalizableString("maxRateDescription", _this, true);
locMinRateDescriptionValue.onGetTextCallback = function (text) {
return text ? text + " " : text;
};
locMaxRateDescriptionValue.onGetTextCallback = function (text) {
return text ? " " + text : text;
};
return _this;
}
QuestionRatingModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.fireCallback(this.rateValuesChangedCallback);
};
Object.defineProperty(QuestionRatingModel.prototype, "rateValues", {
/**
* The list of rate items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. If it is empty the array is generated by using rateMin, rateMax and rateStep properties.
* @see rateMin
* @see rateMax
* @see rateStep
*/
get: function () {
return this.rates;
},
set: function (val) {
this.setPropertyValue("rates", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateMin", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the first value in the rating. The default value is 1.
* @see rateValues
* @see rateMax
* @see rateStep
*/
get: function () {
return this.getPropertyValue("rateMin");
},
set: function (val) {
if (!this.isLoadingFromJson && val > this.rateMax - this.rateStep)
val = this.rateMax - this.rateStep;
this.setPropertyValue("rateMin", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateMax", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the last value in the rating. The default value is 5.
* @see rateValues
* @see rateMin
* @see rateStep
*/
get: function () {
return this.getPropertyValue("rateMax");
},
set: function (val) {
if (!this.isLoadingFromJson && val < this.rateMin + this.rateStep)
val = this.rateMin + this.rateStep;
this.setPropertyValue("rateMax", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateStep", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the step value. The number of rate values are (rateMax - rateMin) / rateStep. The default value is 1.
* @see rateValues
* @see rateMin
* @see rateMax
*/
get: function () {
return this.getPropertyValue("rateStep");
},
set: function (val) {
if (val <= 0)
val = 1;
if (!this.isLoadingFromJson && val > this.rateMax - this.rateMin)
val = this.rateMax - this.rateMin;
this.setPropertyValue("rateStep", val);
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var res = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.visibleRateValues, value);
return !!res ? res : value;
};
Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", {
get: function () {
if (this.rateValues.length > 0)
return this.rateValues;
var res = [];
var value = this.rateMin;
while (value <= this.rateMax &&
res.length < __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].ratingMaximumRateValueCount) {
res.push(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](value));
value += this.rateStep;
}
return res;
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.getType = function () {
return "rating";
};
QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionRatingModel.prototype.supportComment = function () {
return true;
};
QuestionRatingModel.prototype.supportOther = function () {
return true;
};
Object.defineProperty(QuestionRatingModel.prototype, "minRateDescription", {
/**
* The description of minimum (first) item.
*/
get: function () {
return this.getLocalizableStringText("minRateDescription");
},
set: function (val) {
this.setLocalizableStringText("minRateDescription", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "locMinRateDescription", {
get: function () {
return this.getLocalizableString("minRateDescription");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "maxRateDescription", {
/**
* The description of maximum (last) item.
*/
get: function () {
return this.getLocalizableStringText("maxRateDescription");
},
set: function (val) {
this.setLocalizableStringText("maxRateDescription", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "locMaxRateDescription", {
get: function () {
return this.getLocalizableString("maxRateDescription");
},
enumerable: true,
configurable: true
});
return QuestionRatingModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("rating", [
{ name: "hasComment:boolean", layout: "row" },
{
name: "commentText",
serializationProperty: "locCommentText",
layout: "row"
},
{
name: "rateValues:itemvalue[]"
},
{ name: "rateMin:number", default: 1 },
{ name: "rateMax:number", default: 5 },
{ name: "rateStep:number", default: 1, minValue: 1 },
{
name: "minRateDescription",
alternativeName: "mininumRateDescription",
serializationProperty: "locMinRateDescription"
},
{
name: "maxRateDescription",
alternativeName: "maximumRateDescription",
serializationProperty: "locMaxRateDescription"
}
], function () {
return new QuestionRatingModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("rating", function (name) {
return new QuestionRatingModel(name);
});
/***/ }),
/* 128 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyCustomWidget; });
var SurveyCustomWidget = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyCustomWidget, _super);
function SurveyCustomWidget(props) {
return _super.call(this, props) || this;
}
SurveyCustomWidget.prototype._afterRender = function () {
if (this.questionBase.customWidget) {
var el = this.refs["widget"];
if (!!el) {
this.questionBase.customWidget.afterRender(this.questionBase, el);
this.questionBase.customWidgetData.isNeedRender = false;
}
}
};
SurveyCustomWidget.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (this.questionBase) {
this._afterRender();
}
};
SurveyCustomWidget.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
var isDefaultRender = !!this.questionBase.customWidget &&
this.questionBase.customWidget.isDefaultRender;
if (this.questionBase && !isDefaultRender) {
this._afterRender();
}
};
SurveyCustomWidget.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.questionBase.customWidget) {
var el = this.refs["widget"];
if (!!el) {
this.questionBase.customWidget.willUnmount(this.questionBase, el);
}
}
};
SurveyCustomWidget.prototype.render = function () {
if (!this.questionBase || !this.creator) {
return null;
}
if (!this.questionBase.visible) {
return null;
}
var customWidget = this.questionBase.customWidget;
if (customWidget.isDefaultRender) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "widget" }, this.creator.createQuestionElement(this.questionBase)));
}
var widget = null;
if (customWidget.widgetJson.render) {
widget = customWidget.widgetJson.render(this.questionBase);
}
else {
if (customWidget.htmlTemplate) {
var htmlValue = { __html: customWidget.htmlTemplate };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "widget", dangerouslySetInnerHTML: htmlValue });
}
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: "widget" }, widget);
};
return SurveyCustomWidget;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
/***/ }),
/* 129 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__expressions_expressions__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(15);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return Trigger; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTrigger; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyTriggerVisible; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyTriggerComplete; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyTriggerSetValue; });
/* unused harmony export SurveyTriggerSkip */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return SurveyTriggerRunExpression; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return SurveyTriggerCopyValue; });
/**
* A base class for all triggers.
* A trigger calls a method when the expression change the result: from false to true or from true to false.
* Please note, it runs only one changing the expression result.
*/
var Trigger = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Trigger, _super);
function Trigger() {
var _this = _super.call(this) || this;
_this.usedNames = [];
var self = _this;
_this.registerFunctionOnPropertiesValueChanged(["operator", "value", "name"], function () {
self.oldPropertiesChanged();
});
_this.registerFunctionOnPropertyValueChanged("expression", function () {
self.onExpressionChanged();
});
return _this;
}
Object.defineProperty(Trigger, "operators", {
get: function () {
if (Trigger.operatorsValue != null)
return Trigger.operatorsValue;
Trigger.operatorsValue = {
empty: function (value, expectedValue) {
return !value;
},
notempty: function (value, expectedValue) {
return !!value;
},
equal: function (value, expectedValue) {
return value == expectedValue;
},
notequal: function (value, expectedValue) {
return value != expectedValue;
},
contains: function (value, expectedValue) {
return value && value["indexOf"] && value.indexOf(expectedValue) > -1;
},
notcontains: function (value, expectedValue) {
return (!value || !value["indexOf"] || value.indexOf(expectedValue) == -1);
},
greater: function (value, expectedValue) {
return value > expectedValue;
},
less: function (value, expectedValue) {
return value < expectedValue;
},
greaterorequal: function (value, expectedValue) {
return value >= expectedValue;
},
lessorequal: function (value, expectedValue) {
return value <= expectedValue;
}
};
return Trigger.operatorsValue;
},
enumerable: true,
configurable: true
});
Trigger.prototype.getType = function () {
return "triggerbase";
};
Trigger.prototype.toString = function () {
var res = this.getType().replace("trigger", "");
var exp = !!this.expression ? this.expression : this.buildExpression();
if (exp) {
res += ", " + exp;
}
return res;
};
Object.defineProperty(Trigger.prototype, "operator", {
get: function () {
return this.getPropertyValue("operator", "equal");
},
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (!Trigger.operators[value])
return;
this.setPropertyValue("operator", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "value", {
get: function () {
return this.getPropertyValue("value", null);
},
set: function (val) {
this.setPropertyValue("value", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "name", {
get: function () {
return this.getPropertyValue("name", "");
},
set: function (val) {
this.setPropertyValue("name", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "expression", {
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
Trigger.prototype.checkExpression = function (keys, values, properties) {
if (properties === void 0) { properties = null; }
if (!this.isCheckRequired(keys))
return;
if (!!this.conditionRunner) {
this.perform(values, properties);
}
};
Trigger.prototype.check = function (value) {
var triggerResult = Trigger.operators[this.operator](value, this.value);
if (triggerResult) {
this.onSuccess({}, null);
}
else {
this.onFailure();
}
};
Trigger.prototype.perform = function (values, properties) {
var _this = this;
this.conditionRunner.onRunComplete = function (res) {
_this.triggerResult(res, values, properties);
};
this.conditionRunner.run(values, properties);
};
Trigger.prototype.triggerResult = function (res, values, properties) {
if (res) {
this.onSuccess(values, properties);
}
else {
this.onFailure();
}
};
Trigger.prototype.onSuccess = function (values, properties) { };
Trigger.prototype.onFailure = function () { };
Trigger.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.oldPropertiesChanged();
};
Trigger.prototype.oldPropertiesChanged = function () {
this.onExpressionChanged();
};
Trigger.prototype.onExpressionChanged = function () {
this.usedNames = [];
this.hasFunction = false;
this.conditionRunner = null;
};
Trigger.prototype.buildExpression = function () {
if (!this.name)
return "";
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.value) && this.isRequireValue)
return "";
return ("{" +
this.name +
"} " +
this.operator +
" " +
__WEBPACK_IMPORTED_MODULE_5__expressions_expressions__["h" /* OperandMaker */].toOperandString(this.value));
};
Trigger.prototype.isCheckRequired = function (keys) {
if (!keys)
return false;
this.buildUsedNames();
if (this.hasFunction === true)
return true;
for (var i = 0; i < this.usedNames.length; i++) {
if (keys.hasOwnProperty(this.usedNames[i]))
return true;
}
return false;
};
Trigger.prototype.buildUsedNames = function () {
if (!!this.conditionRunner)
return;
var expression = this.expression;
if (!expression) {
expression = this.buildExpression();
}
if (!expression)
return;
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](expression);
this.hasFunction = this.conditionRunner.hasFunction();
this.usedNames = this.conditionRunner.getVariables();
var processValue = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]();
for (var i = 0; i < this.usedNames.length; i++) {
this.usedNames[i] = processValue.getFirstName(this.usedNames[i]);
}
};
Object.defineProperty(Trigger.prototype, "isRequireValue", {
get: function () {
return this.operator !== "empty" && this.operator != "notempty";
},
enumerable: true,
configurable: true
});
Trigger.operatorsValue = null;
return Trigger;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
/**
* It extends the Trigger base class and add properties required for SurveyJS classes.
*/
var SurveyTrigger = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTrigger, _super);
function SurveyTrigger() {
var _this = _super.call(this) || this;
_this.owner = null;
return _this;
}
SurveyTrigger.prototype.setOwner = function (owner) {
this.owner = owner;
};
Object.defineProperty(SurveyTrigger.prototype, "isOnNextPage", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
return SurveyTrigger;
}(Trigger));
/**
* If expression returns true, it makes questions/pages visible.
* Ohterwise it makes them invisible.
*/
var SurveyTriggerVisible = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerVisible, _super);
function SurveyTriggerVisible() {
var _this = _super.call(this) || this;
_this.pages = [];
_this.questions = [];
return _this;
}
SurveyTriggerVisible.prototype.getType = function () {
return "visibletrigger";
};
SurveyTriggerVisible.prototype.onSuccess = function (values, properties) {
this.onTrigger(this.onItemSuccess);
};
SurveyTriggerVisible.prototype.onFailure = function () {
this.onTrigger(this.onItemFailure);
};
SurveyTriggerVisible.prototype.onTrigger = function (func) {
if (!this.owner)
return;
var objects = this.owner.getObjects(this.pages, this.questions);
for (var i = 0; i < objects.length; i++) {
func(objects[i]);
}
};
SurveyTriggerVisible.prototype.onItemSuccess = function (item) {
item.visible = true;
};
SurveyTriggerVisible.prototype.onItemFailure = function (item) {
item.visible = false;
};
return SurveyTriggerVisible;
}(SurveyTrigger));
/**
* If expression returns true, it completes the survey.
*/
var SurveyTriggerComplete = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerComplete, _super);
function SurveyTriggerComplete() {
return _super.call(this) || this;
}
SurveyTriggerComplete.prototype.getType = function () {
return "completetrigger";
};
Object.defineProperty(SurveyTriggerComplete.prototype, "isOnNextPage", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
SurveyTriggerComplete.prototype.onSuccess = function (values, properties) {
if (this.owner)
this.owner.setCompleted();
};
return SurveyTriggerComplete;
}(SurveyTrigger));
/**
* If expression returns true, the value from property **setValue** will be set to **setToName**
*/
var SurveyTriggerSetValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerSetValue, _super);
function SurveyTriggerSetValue() {
return _super.call(this) || this;
}
SurveyTriggerSetValue.prototype.getType = function () {
return "setvaluetrigger";
};
SurveyTriggerSetValue.prototype.onSuccess = function (values, properties) {
if (!this.setToName || !this.owner)
return;
this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable);
};
return SurveyTriggerSetValue;
}(SurveyTrigger));
/**
* If expression returns true, the survey go to question **gotoName** and focus it.
*/
var SurveyTriggerSkip = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerSkip, _super);
function SurveyTriggerSkip() {
return _super.call(this) || this;
}
SurveyTriggerSkip.prototype.getType = function () {
return "skiptrigger";
};
SurveyTriggerSkip.prototype.onSuccess = function (values, properties) {
if (!this.gotoName || !this.owner)
return;
this.owner.focusQuestion(this.gotoName);
};
return SurveyTriggerSkip;
}(SurveyTrigger));
/**
* If expression returns true, the **runExpression** will be run. If **setToName** property is not empty then the result of **runExpression** will be set to it.
*/
var SurveyTriggerRunExpression = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerRunExpression, _super);
function SurveyTriggerRunExpression() {
return _super.call(this) || this;
}
SurveyTriggerRunExpression.prototype.getType = function () {
return "runexpressiontrigger";
};
SurveyTriggerRunExpression.prototype.onSuccess = function (values, properties) {
var _this = this;
if (!this.owner || !this.runExpression)
return;
var expression = new __WEBPACK_IMPORTED_MODULE_4__conditions__["a" /* ExpressionRunner */](this.runExpression);
if (expression.canRun) {
expression.onRunComplete = function (res) {
_this.onCompleteRunExpression(res);
};
expression.run(values, properties);
}
};
SurveyTriggerRunExpression.prototype.onCompleteRunExpression = function (newValue) {
if (!this.setToName || newValue !== undefined) {
this.owner.setTriggerValue(this.setToName, newValue, false);
}
};
return SurveyTriggerRunExpression;
}(SurveyTrigger));
/**
* If expression returns true, the value from question **fromName** will be set into **setToName**.
*/
var SurveyTriggerCopyValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerCopyValue, _super);
function SurveyTriggerCopyValue() {
return _super.call(this) || this;
}
SurveyTriggerCopyValue.prototype.getType = function () {
return "copyvaluetrigger";
};
SurveyTriggerCopyValue.prototype.onSuccess = function (values, properties) {
if (!this.setToName || !this.owner)
return;
this.owner.copyTriggerValue(this.setToName, this.fromName);
};
return SurveyTriggerCopyValue;
}(SurveyTrigger));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("trigger", [
{ name: "operator", default: "equal", visible: false },
{ name: "value", visible: false },
"expression:condition"
]);
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("surveytrigger", [{ name: "name", visible: false }], null, "trigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("visibletrigger", ["pages:pages", "questions:questions"], function () {
return new SurveyTriggerVisible();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("completetrigger", [], function () {
return new SurveyTriggerComplete();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("setvaluetrigger", [
{ name: "!setToName:question" },
{
name: "!setValue:triggervalue",
dependsOn: "setToName",
visibleIf: function (obj) {
return !!obj && !!obj["setToName"];
}
},
{ name: "isVariable:boolean", visible: false }
], function () {
return new SurveyTriggerSetValue();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("copyvaluetrigger", [{ name: "!setToName:question" }, { name: "!fromName:question" }], function () {
return new SurveyTriggerCopyValue();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("skiptrigger", [{ name: "!gotoName:question" }], function () {
return new SurveyTriggerSkip();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* Serializer */].addClass("runexpressiontrigger", [{ name: "setToName:question" }, "runExpression:expression"], function () {
return new SurveyTriggerRunExpression();
}, "surveytrigger");
/***/ }),
/* 130 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* unused harmony export compareVersions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return confirmAction; });
/* unused harmony export isMobile */
function compareVersions(a, b) {
var i, diff;
var regExStrip0 = /(\.0+)+$/;
var segmentsA = a.replace(regExStrip0, "").split(".");
var segmentsB = b.replace(regExStrip0, "").split(".");
var l = Math.min(segmentsA.length, segmentsB.length);
for (i = 0; i < l; i++) {
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
if (diff) {
return diff;
}
}
return segmentsA.length - segmentsB.length;
}
function confirmAction(message) {
return confirm(message);
}
function isMobile() {
return typeof window.orientation !== "undefined";
}
/***/ }),
/* 131 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__chunks_model__ = __webpack_require__(57);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Version", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Helpers", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["d"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["e"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["f"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["g"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["h"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["i"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["j"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExpressionValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["k"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["l"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ItemValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["m"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["n"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["o"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["p"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyElement", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CalculatedValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["r"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["s"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["t"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "OneAnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["u"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RequreNumericError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["v"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExceedSizeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["w"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["x"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "HtmlConditionItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "UrlConditionItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ChoicesRestfull", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["A"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["B"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "registerFunction", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["C"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["D"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExpressionRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["E"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Operand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["F"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Const", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["G"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "BinaryOperand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["H"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Variable", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["I"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionOperand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["J"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ArrayOperand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["K"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionsParser", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["L"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ProcessValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["M"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["N"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonIncorrectTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["O"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadata", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["P"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadataClass", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["R"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeErrorBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["S"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObject", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["T"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObjectProperty", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["U"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonRequiredPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["V"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonUnknownPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["W"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Serializer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["X"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "matrixDropdownColumnTypes", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_0"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_1"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_2"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_3"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_4"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_5"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_6"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_7"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MartrixCells", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_8"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_9"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_10"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_11"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_12"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_13"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_14"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FlowPanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_15"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_16"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_17"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionNonValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_18"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_19"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_20"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_21"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_22"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_23"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_24"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_25"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_26"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_27"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_28"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_29"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_30"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_31"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_32"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_33"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePickerModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_34"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_35"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_36"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_37"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_38"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_39"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_40"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_41"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_42"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerCopyValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_43"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerRunExpression", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_44"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_45"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_46"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_47"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "dxSurveyService", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_48"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "englishStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_49"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_50"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_51"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_52"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_53"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "StylesManager", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_54"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__chunks_localization__ = __webpack_require__(56);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__ = __webpack_require__(0);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__spreadArrays", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defaultStandardCss", function() { return __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__ = __webpack_require__(53);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapCss", function() { return __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__ = __webpack_require__(54);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapMaterialCss", function() { return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssmodern__ = __webpack_require__(55);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "modernCss", function() { return __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssmodern__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__react_reactSurvey__ = __webpack_require__(34);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Survey", function() { return __WEBPACK_IMPORTED_MODULE_7__react_reactSurvey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__ = __webpack_require__(20);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReactSurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReactWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Model", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "WindowModel", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__react_reactSurveyNavigationBase__ = __webpack_require__(25);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyNavigationBase", function() { return __WEBPACK_IMPORTED_MODULE_9__react_reactSurveyNavigationBase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__react_reacttimerpanel__ = __webpack_require__(37);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTimerPanel", function() { return __WEBPACK_IMPORTED_MODULE_10__react_reacttimerpanel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__react_reactSurveyNavigation__ = __webpack_require__(35);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyNavigation", function() { return __WEBPACK_IMPORTED_MODULE_11__react_reactSurveyNavigation__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__react_page__ = __webpack_require__(33);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyPage", function() { return __WEBPACK_IMPORTED_MODULE_12__react_page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__react_row__ = __webpack_require__(38);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyRow", function() { return __WEBPACK_IMPORTED_MODULE_13__react_row__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__react_panel__ = __webpack_require__(24);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyPanel", function() { return __WEBPACK_IMPORTED_MODULE_14__react_panel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__react_flow_panel__ = __webpack_require__(58);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyFlowPanel", function() { return __WEBPACK_IMPORTED_MODULE_15__react_flow_panel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__ = __webpack_require__(19);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestion", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyElementErrors", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionAndErrorsCell", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__react_reactquestionelement__ = __webpack_require__(5);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyElementBase", function() { return __WEBPACK_IMPORTED_MODULE_17__react_reactquestionelement__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionElementBase", function() { return __WEBPACK_IMPORTED_MODULE_17__react_reactquestionelement__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__react_reactquestioncomment__ = __webpack_require__(17);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCommentItem", function() { return __WEBPACK_IMPORTED_MODULE_18__react_reactquestioncomment__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionComment", function() { return __WEBPACK_IMPORTED_MODULE_18__react_reactquestioncomment__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__react_reactquestioncheckbox__ = __webpack_require__(62);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_19__react_reactquestioncheckbox__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCheckboxItem", function() { return __WEBPACK_IMPORTED_MODULE_19__react_reactquestioncheckbox__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__react_reactquestiondropdown__ = __webpack_require__(63);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionDropdown", function() { return __WEBPACK_IMPORTED_MODULE_20__react_reactquestiondropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmatrix__ = __webpack_require__(68);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrix", function() { return __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmatrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixRow", function() { return __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmatrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__react_reactquestionhtml__ = __webpack_require__(67);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionHtml", function() { return __WEBPACK_IMPORTED_MODULE_22__react_reactquestionhtml__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__react_reactquestionfile__ = __webpack_require__(66);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionFile", function() { return __WEBPACK_IMPORTED_MODULE_23__react_reactquestionfile__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__react_reactquestionmultipletext__ = __webpack_require__(71);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_24__react_reactquestionmultipletext__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__react_reactquestionradiogroup__ = __webpack_require__(73);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_25__react_reactquestionradiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__react_reactquestiontext__ = __webpack_require__(75);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionText", function() { return __WEBPACK_IMPORTED_MODULE_26__react_reactquestiontext__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__react_reactquestionboolean__ = __webpack_require__(61);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionBoolean", function() { return __WEBPACK_IMPORTED_MODULE_27__react_reactquestionboolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__react_reactquestionempty__ = __webpack_require__(64);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionEmpty", function() { return __WEBPACK_IMPORTED_MODULE_28__react_reactquestionempty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__react_reactquestionmatrixdropdownbase__ = __webpack_require__(26);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_29__react_reactquestionmatrixdropdownbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__react_reactquestionmatrixdropdown__ = __webpack_require__(69);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDropdown", function() { return __WEBPACK_IMPORTED_MODULE_30__react_reactquestionmatrixdropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__react_reactquestionmatrixdynamic__ = __webpack_require__(70);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_31__react_reactquestionmatrixdynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__react_reactquestionpaneldynamic__ = __webpack_require__(72);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_32__react_reactquestionpaneldynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__react_reactSurveyProgress__ = __webpack_require__(36);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyProgress", function() { return __WEBPACK_IMPORTED_MODULE_33__react_reactSurveyProgress__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__react_reactquestionrating__ = __webpack_require__(74);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionRating", function() { return __WEBPACK_IMPORTED_MODULE_34__react_reactquestionrating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__react_reactquestionexpression__ = __webpack_require__(65);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionExpression", function() { return __WEBPACK_IMPORTED_MODULE_35__react_reactquestionexpression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__react_reactSurveyWindow__ = __webpack_require__(60);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyWindow", function() { return __WEBPACK_IMPORTED_MODULE_36__react_reactSurveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__react_reactquestionfactory__ = __webpack_require__(6);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReactQuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_37__react_reactquestionfactory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__react_element_factory__ = __webpack_require__(18);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReactElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_38__react_element_factory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__react_imagepicker__ = __webpack_require__(59);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionImagePicker", function() { return __WEBPACK_IMPORTED_MODULE_39__react_imagepicker__["a"]; });
// model
// localization
// helpers
// css standard
// css bootstrap
// css bootstrap + material
// react
//Uncomment to include the "date" question type.
//export {default as SurveyQuestionDate} from "../plugins/react/reactquestiondate";
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBiMWI5YTY0Y2FmZTI2NmMxNmQ2MSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiUmVhY3RcIixcImNvbW1vbmpzMlwiOlwicmVhY3RcIixcImNvbW1vbmpzXCI6XCJyZWFjdFwiLFwiYW1kXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9zcmMvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmVsZW1lbnQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZmFjdG9yeS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2Jhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy9lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaXRlbXZhbHVlLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25Qcm9jZXNzVmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphYmxlc3RyaW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uY29tbWVudC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L2VsZW1lbnQtZmFjdG9yeS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb24udHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHN1cnZleW1vZGVsLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdGV4dFByZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3BhbmVsLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bmJhc2UudHN4Iiwid2VicGFjazovLy8uL3NyYy9leHByZXNzaW9ucy9leHByZXNzaW9ucy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZnVuY3Rpb25zZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9zdHlsZXNtYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3ZhbGlkYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcGFnZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0U3VydmV5LnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlQcm9ncmVzcy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0dGltZXJwYW5lbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3Jvdy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2Nob2ljZXNSZXN0ZnVsbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZW5nbGlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFydGl4QmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25DdXN0b21XaWRnZXRzLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25ub252YWx1ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcGFuZWwtYmFzZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleVdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5dGltZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc21vZGVybi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvZmxvdy1wYW5lbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L2ltYWdlcGlja2VyLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlXaW5kb3cudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uYm9vbGVhbi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25jaGVja2JveC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25kcm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbXB0eS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25leHByZXNzaW9uLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGUudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXgudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd24udHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHluYW1pYy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucGFuZWxkeW5hbWljLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnJhZGlvZ3JvdXAudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucmF0aW5nLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnRleHQudHN4Iiwid2VicGFjazovLy8uL3NyYy9tYWluLnNjc3MiLCJ3ZWJwYWNrOi8vLy4vc3JjL21vZGVybi5zY3NzIiwid2VicGFjazovLy8uL3NyYy9jYWxjdWxhdGVkVmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V4cHJlc3Npb25JdGVtcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZXhwcmVzc2lvbnMvZXhwcmVzc2lvblBhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxvd3BhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vYXJhYmljLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vY2F0YWxhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZGFuaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9maW5uaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ2VvcmdpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ncmVlay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2hlYnJldy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2luZG9uZXNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vamFwYW5lc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9sYXR2aWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3BlcnNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb2xpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcm9tYW5pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3N3ZWRpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi90cmFkaXRpb25hbC1jaGluZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vdHVya2lzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3VrcmFpbmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9wYW5lbGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX3JhZGlvZ3JvdXAudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX3JhdGluZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvY3VzdG9tLXdpZGdldC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyaWdnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL3V0aWxzLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL3JlYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRU8sSUFBSSxRQUFRLEdBQ1gsTUFBTyxDQUFDLFFBQVEsQ0FBQztJQUN2QixVQUFTLE1BQVc7UUFDbEIsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFT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UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7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QU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUNyQixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLElBQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFNLFFBQVEsR0FBRyxVQUFTLEtBQVUsSUFBUyxPQUFPLElBQUksOERBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRSxJQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sUUFBUSxHQUFHLFVBQVMsS0FBVSxJQUFTLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQztJQUN0QixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLElBQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sUUFBUSxHQUFHLFVBQVMsUUFBYSxJQUFTLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLElBQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUNyQixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxRQUFRLEdBQUcsVUFBUyxJQUFTLEVBQUUsSUFBUztRQUMxQyxJQUFJLElBQUksSUFBSSxJQUFJ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QUFDLENBQUM7QUFDMUIsQ0FBQztBQUNELFNBQVMsUUFBUTtJQUNmLE9BQU8sT0FBTyxNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQztBQUNuRCxDQUFDO0FBRW1EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJwRDtBQUFBLFFBQVE7QUFDdUI7QUFFL0IsZUFBZTtBQUNnQjtBQUUvQixVQUFVO0FBQ3VCO0FBRWpDLGVBQWU7QUFDZ0Q7QUFDL0QsZ0JBQWdCO0FBQ2lEO0FBQ2pFLDJCQUEyQjtBQUdpQjtBQUNRO0FBRXBELFFBQVE7QUFDc0M7QUFDaUM7QUFJNUM7QUFDdUM7QUFDZDtBQUNNO0FBQ3ZCO0FBQ0Y7QUFDSTtBQUNTO0FBS3RCO0FBSU87QUFJQTtBQUlDO0FBQ2dDO0FBSWxDO0FBQzBCO0FBQ0E7QUFDZ0I7QUFDSjtBQUNaO0FBQ007QUFDSjtBQUdoQjtBQUdKO0FBR0Q7QUFDbUM7QUFDbEI7QUFDTTtBQUNRO0FBQ2xCO0FBQ1c7QUFDTjtBQUNFO0FBRWpFLGdEQUFnRDtBQUNoRCxtRkFBbUYiLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktcmVhY3Qvc3VydmV5LnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlcIiwgW1wicmVhY3RcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5XCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleVwiXSA9IGZhY3Rvcnkocm9vdFtcIlJlYWN0XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfM19fKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEzMSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYjFiOWE2NGNhZmUyNjZjMTZkNjEiLCJleHBvcnQgdmFyIF9fYXNzaWduID1cbiAgKDxhbnk+T2JqZWN0KVtcImFzc2lnblwiXSB8fFxuICBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIHAgaW4gcylcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdGFyZ2V0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyh0aGlzQ2xhc3M6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgZm9yICh2YXIgcCBpbiBiYXNlQ2xhc3MpXG4gICAgaWYgKGJhc2VDbGFzcy5oYXNPd25Qcm9wZXJ0eShwKSkgdGhpc0NsYXNzW3BdID0gYmFzZUNsYXNzW3BdO1xuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gdGhpc0NsYXNzO1xuICB9XG4gIHRoaXNDbGFzcy5wcm90b3R5cGUgPVxuICAgIGJhc2VDbGFzcyA9PT0gbnVsbFxuICAgICAgPyBPYmplY3QuY3JlYXRlKGJhc2VDbGFzcylcbiAgICAgIDogKChfXy5wcm90b3R5cGUgPSBiYXNlQ2xhc3MucHJvdG90eXBlKSwgbmV3ICg8YW55Pl9fKSgpKTtcbn1cblxuZGVjbGFyZSB2YXIgUmVmbGVjdDphbnk7XG5cbmV4cG9ydCB2YXIgX19kZWNvcmF0ZSA9IGZ1bmN0aW9uKFxuICBkZWNvcmF0b3JzOiBhbnksXG4gIHRhcmdldDogYW55LFxuICBrZXk6IGFueSxcbiAgZGVzYzogYW55XG4pIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgIHIgPVxuICAgICAgYyA8IDNcbiAgICAgICAgPyB0YXJnZXRcbiAgICAgICAgOiBkZXNjID09PSBudWxsXG4gICAgICAgICAgPyAoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpKVxuICAgICAgICAgIDogZGVzYyxcbiAgICBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIilcbiAgICByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2VcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIGlmICgoZCA9IGRlY29yYXRvcnNbaV0pKVxuICAgICAgICByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG5cbmV4cG9ydCB2YXIgX19zcHJlYWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59O1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi9sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIHN1cnZleUxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHtbaW5kZXg6IHN0cmluZ106IGFueX0+e30sXG4gIGxvY2FsZU5hbWVzOiA8e1tpbmRleDogc3RyaW5nXTogYW55fT57fSxcbiAgc3VwcG9ydGVkTG9jYWxlczogPEFycmF5PGFueT4+W10sXG4gIGdldCBjdXJyZW50TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9PT0gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWVcbiAgICAgID8gXCJcIlxuICAgICAgOiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGN1cnJlbnRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGVcbiAgICAgID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV1cbiAgICAgIDogdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgaWYgKCFsb2MgfHwgIWxvY1tzdHJOYW1lXSkgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgdmFyIHJlc3VsdCA9IGxvY1tzdHJOYW1lXTtcbiAgICBpZihyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGdldExvY2FsZXM6IGZ1bmN0aW9uKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLnN1cHBvcnRlZExvY2FsZXNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+c3VydmV5TG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsImltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJT2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdFByb3BlcnR5IGltcGxlbWVudHMgSU9iamVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0SXRlbVZhbHVlc0RlZmF1bHRWYWx1ZTogKHZhbDogYW55KSA9PiBhbnk7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgcHJpdmF0ZSBzdGF0aWMgbWVyZ2FibGVWYWx1ZXMgPSBbXG4gICAgXCJ0eXBlVmFsdWVcIixcbiAgICBcImNob2ljZXNWYWx1ZVwiLFxuICAgIFwiYmFzZVZhbHVlXCIsXG4gICAgXCJyZWFkT25seVZhbHVlXCIsXG4gICAgXCJ2aXNpYmxlVmFsdWVcIixcbiAgICBcImlzU2VyaWFsaXphYmxlXCIsXG4gICAgXCJpc0xpZ2h0U2VyaWFsaXphYmxlXCIsXG4gICAgXCJpc0N1c3RvbVwiLFxuICAgIFwiaXNEeW5hbWljQ2hvaWNlc1wiLFxuICAgIFwiaXNMb2NhbGl6YWJsZVZhbHVlXCIsXG4gICAgXCJjbGFzc05hbWVcIixcbiAgICBcImFsdGVybmF0aXZlTmFtZVwiLFxuICAgIFwibGF5b3V0XCIsXG4gICAgXCJjbGFzc05hbWVQYXJ0XCIsXG4gICAgXCJiYXNlQ2xhc3NOYW1lXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVcIixcbiAgICBcInNlcmlhbGl6YXRpb25Qcm9wZXJ0eVwiLFxuICAgIFwib25HZXRWYWx1ZVwiLFxuICAgIFwib25TZXRWYWx1ZVwiLFxuICAgIFwiY2F0ZWdvcnlcIixcbiAgICBcImNhdGVnb3J5SW5kZXhcIixcbiAgICBcImRlcGVuZGVkUHJvcGVydGllc1wiLFxuICAgIFwidmlzaWJsZUlmXCIsXG4gICAgXCJtYXhMZW5ndGhcIixcbiAgICBcIm1heFZhbHVlXCIsXG4gICAgXCJtaW5WYWx1ZVwiXG4gIF07XG4gIHByaXZhdGUgdHlwZVZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNob2ljZXNWYWx1ZTogQXJyYXk8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgYmFzZVZhbHVlOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIGlzUmVxdWlyZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRPbmx5VmFsdWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2aXNpYmxlVmFsdWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0xvY2FsaXphYmxlVmFsdWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjaG9pY2VzZnVuYzogKG9iajogYW55LCBjaG9pY2VzQ2FsbGJhY2s6IGFueSkgPT4gQXJyYXk8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgZGVwZW5kZWRQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+ID0gbnVsbDtcbiAgcHVibGljIGlzU2VyaWFsaXphYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGlzTGlnaHRTZXJpYWxpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaXNDdXN0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzRHluYW1pY0Nob2ljZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy9UT0RPIG9ic29sZXRlLCB1c2UgZGVwZW5kc09uIGF0dHJpYnV0ZVxuICBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgYWx0ZXJuYXRpdmVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgY2xhc3NOYW1lUGFydDogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBkZWZhdWx0VmFsdWVWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHVibGljIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGNhdGVnb3J5OiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgY2FnZXRvcnlJbmRleDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgbWF4VmFsdWU6IGFueTtcbiAgcHVibGljIG1pblZhbHVlOiBhbnk7XG4gIHB1YmxpYyBsYXlvdXQ6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBvbkdldFZhbHVlOiAob2JqOiBhbnkpID0+IGFueSA9IG51bGw7XG4gIHB1YmxpYyBvblNldFZhbHVlOiAob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSA9PiBhbnkgPSBudWxsO1xuICBwdWJsaWMgdmlzaWJsZUlmOiAob2JqOiBhbnkpID0+IGJvb2xlYW4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIGlzUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuaXNSZXF1aXJlZFZhbHVlID0gaXNSZXF1aXJlZDtcbiAgfVxuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50eXBlVmFsdWUgPyB0aGlzLnR5cGVWYWx1ZSA6IFwic3RyaW5nXCI7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiaXRlbXZhbHVlc1wiKSB2YWx1ZSA9IFwiaXRlbXZhbHVlW11cIjtcbiAgICB0aGlzLnR5cGVWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnR5cGVWYWx1ZS5pbmRleE9mKFwiW11cIikgPT09IHRoaXMudHlwZVZhbHVlLmxlbmd0aCAtIDIpIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMudHlwZVZhbHVlLnN1YnN0cigwLCB0aGlzLnR5cGVWYWx1ZS5sZW5ndGggLSAyKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGlzQXJyYXkgPSBmYWxzZTtcbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1JlcXVpcmVkVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb1VzZUdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLm9uR2V0VmFsdWUgfHwgdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gIH1cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKSB7XG4gICAgdmFyIHJlc3VsdDogYW55ID0gdGhpcy5kZWZhdWx0VmFsdWVWYWx1ZTtcbiAgICBpZiAoXG4gICAgICAhIUpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlICYmXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKHRoaXMuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKVxuICAgICkge1xuICAgICAgcmVzdWx0ID0gSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUoXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlVmFsdWUgfHwgW11cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUobmV3VmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZVZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIGlzRGVmYXVsdFZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSlcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZSA9PSB2YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgKHZhbHVlID09PSBmYWxzZSAmJiB0aGlzLnR5cGUgPT0gXCJib29sZWFuXCIpIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJcIiB8fFxuICAgICAgSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUob2JqOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLm9uR2V0VmFsdWUpIHJldHVybiB0aGlzLm9uR2V0VmFsdWUob2JqKTtcbiAgICBpZiAodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiYgISFvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldKVxuICAgICAgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uZ2V0SnNvbigpO1xuICAgIHJldHVybiBvYmpbdGhpcy5uYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2NhbGl6YWJsZSkgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0udGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShvYmopO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG9Vc2VTZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vblNldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnY6IEpzb25PYmplY3QpIHtcbiAgICBpZiAodGhpcy5vblNldFZhbHVlKSB7XG4gICAgICB0aGlzLm9uU2V0VmFsdWUob2JqLCB2YWx1ZSwganNvbkNvbnYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiYgISFvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldKVxuICAgICAgICBvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldLnNldEpzb24odmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvYmpbdGhpcy5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0T2JqVHlwZShvYmpUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NOYW1lUGFydCkgcmV0dXJuIG9ialR5cGU7XG4gICAgcmV0dXJuIG9ialR5cGUucmVwbGFjZSh0aGlzLmNsYXNzTmFtZVBhcnQsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjbGFzc05hbWUpIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmNsYXNzTmFtZVBhcnQgJiYgY2xhc3NOYW1lLmluZGV4T2YodGhpcy5jbGFzc05hbWVQYXJ0KSA8IDBcbiAgICAgID8gY2xhc3NOYW1lICsgdGhpcy5jbGFzc05hbWVQYXJ0XG4gICAgICA6IGNsYXNzTmFtZTtcbiAgfVxuICAvKipcbiAgICogRGVwcmljYXRlZCwgcGxlYXNlIHVzZSBnZXRDaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hvaWNlcyhudWxsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0Nob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jaG9pY2VzVmFsdWUgfHwgISF0aGlzLmNob2ljZXNmdW5jO1xuICB9XG4gIHB1YmxpYyBnZXRDaG9pY2VzKG9iajogYW55LCBjaG9pY2VzQ2FsbGJhY2s6IGFueSA9IG51bGwpOiBBcnJheTxhbnk+IHtcbiAgICBpZiAodGhpcy5jaG9pY2VzVmFsdWUgIT0gbnVsbCkgcmV0dXJuIHRoaXMuY2hvaWNlc1ZhbHVlO1xuICAgIGlmICh0aGlzLmNob2ljZXNmdW5jICE9IG51bGwpIHJldHVybiB0aGlzLmNob2ljZXNmdW5jKG9iaiwgY2hvaWNlc0NhbGxiYWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0Q2hvaWNlcyh2YWx1ZTogQXJyYXk8YW55PiwgdmFsdWVGdW5jOiAoKSA9PiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5jaG9pY2VzVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNob2ljZXNmdW5jID0gdmFsdWVGdW5jO1xuICB9XG4gIHB1YmxpYyBnZXRCYXNlVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYmFzZVZhbHVlKSByZXR1cm4gXCJcIjtcbiAgICBpZiAodHlwZW9mIHRoaXMuYmFzZVZhbHVlID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRoaXMuYmFzZVZhbHVlKCk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRCYXNlVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLmJhc2VWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5VmFsdWUgIT0gbnVsbCA/IHRoaXMucmVhZE9ubHlWYWx1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5yZWFkT25seVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBpc1Zpc2libGUobGF5b3V0OiBzdHJpbmcsIG9iajogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIGxldCBpc0xheW91dCA9ICF0aGlzLmxheW91dCB8fCB0aGlzLmxheW91dCA9PSBsYXlvdXQ7XG4gICAgaWYgKCF0aGlzLnZpc2libGUgfHwgIWlzTGF5b3V0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCEhdGhpcy52aXNpYmxlSWYgJiYgISFvYmopIHJldHVybiB0aGlzLnZpc2libGVJZihvYmopO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlVmFsdWUgIT0gbnVsbCA/IHRoaXMudmlzaWJsZVZhbHVlIDogdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy52aXNpYmxlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc0xvY2FsaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSAhPSBudWxsID8gdGhpcy5pc0xvY2FsaXphYmxlVmFsdWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzTG9jYWxpemFibGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvY2FsaXphYmxlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIG1lcmdlV2l0aChwcm9wOiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICB2YXIgdmFsdWVzTmFtZXMgPSBKc29uT2JqZWN0UHJvcGVydHkubWVyZ2FibGVWYWx1ZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXNOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5tZXJnZVZhbHVlKHByb3AsIHZhbHVlc05hbWVzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZERlcGVuZGVkUHJvcGVydHkobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmRlcGVuZGVkUHJvcGVydGllcykge1xuICAgICAgdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMgPSBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzLmluZGV4T2YobmFtZSkgPCAwKSB7XG4gICAgICB0aGlzLmRlcGVuZGVkUHJvcGVydGllcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGVwZW5kZWRQcm9wZXJ0aWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiAhIXRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzID8gdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMgOiBbXTtcbiAgfVxuICBwcml2YXRlIG1lcmdlVmFsdWUocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCB2YWx1ZU5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzW3ZhbHVlTmFtZV0gPT0gbnVsbCAmJiBwcm9wW3ZhbHVlTmFtZV0gIT0gbnVsbCkge1xuICAgICAgdGhpc1t2YWx1ZU5hbWVdID0gcHJvcFt2YWx1ZU5hbWVdO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcHJvcGVydGllczogSU9iamVjdCA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBwYXJlbnRDbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHB1YmxpYyBzdGF0aWMgYWRkUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5OiBhbnkpIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIGlmICghcHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgcHJvcHNbY2xhc3NOYW1lXSA9IFtdO1xuICAgIH1cbiAgICBwcm9wc1tjbGFzc05hbWVdLnB1c2gocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgcmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAoIXByb3BzW2NsYXNzTmFtZV0pIHJldHVybjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BzW2NsYXNzTmFtZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5uYW1lID09IHByb3BlcnR5TmFtZSkge1xuICAgICAgICBwcm9wc1tjbGFzc05hbWVdLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHBhcmVudENsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHBhcmVudENsYXNzTmFtZSkge1xuICAgICAgcGFyZW50Q2xhc3NOYW1lID0gcGFyZW50Q2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXSA9IHBhcmVudENsYXNzTmFtZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICB3aGlsZSAoY2xhc3NOYW1lKSB7XG4gICAgICB2YXIgcHJvcGVydGllcyA9IHByb3BzW2NsYXNzTmFtZV07XG4gICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3NOYW1lID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhvYmo6IGFueSkge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuO1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iaiwgb2JqLmdldFR5cGUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0NvcmUob2JqOiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAocHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0luT2JqKG9iaiwgcHJvcHNbY2xhc3NOYW1lXSk7XG4gICAgfVxuICAgIHZhciBwYXJlbnRDbGFzcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXTtcbiAgICBpZiAocGFyZW50Q2xhc3MpIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iaiwgcGFyZW50Q2xhc3MpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzSW5PYmoob2JqOiBhbnksIHByb3BlcnRpZXM6IGFueVtdKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0eUluT2JqKG9iaiwgcHJvcGVydGllc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnR5SW5PYmoob2JqOiBhbnksIHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIGlmIChvYmpbcHJvcC5uYW1lXSB8fCBvYmouaGFzT3duUHJvcGVydHkocHJvcC5uYW1lKSkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIHByb3AuaXNMb2NhbGl6YWJsZSAmJlxuICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiZcbiAgICAgICFvYmpbcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHldICYmXG4gICAgICBvYmouY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmpcbiAgICApIHtcbiAgICAgIG9iai5jcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9iaihwcm9wLm5hbWUpO1xuICAgICAgdmFyIGxvY0Rlc2MgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5nZXRMb2NhbGl6YWJsZVN0cmluZyhwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHksIGxvY0Rlc2MpO1xuICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQocHJvcC5uYW1lLCBwcm9wLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odjogYW55KSB7XG4gICAgICAgICAgb2JqLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChwcm9wLm5hbWUsIHYpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3AuZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKFxuICAgICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKHByb3AuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKSAmJlxuICAgICAgICB0eXBlb2Ygb2JqLmNyZWF0ZU5ld0FycmF5ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICkge1xuICAgICAgICBvYmouY3JlYXRlTmV3QXJyYXkocHJvcC5uYW1lLCBmdW5jdGlvbihpdGVtOiBhbnkpIHtcbiAgICAgICAgICBpdGVtLmxvY093bmVyID0gb2JqO1xuICAgICAgICB9KTtcbiAgICAgICAgb2JqLnNldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCEhb2JqLmdldFByb3BlcnR5VmFsdWUgJiYgISFvYmouc2V0UHJvcGVydHlWYWx1ZSkge1xuICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvYmouZ2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHY6IGFueSkge1xuICAgICAgICAgICAgaWYgKCEhcHJvcC5vblNldFZhbHVlKSB7XG4gICAgICAgICAgICAgIHByb3Aub25TZXRWYWx1ZShvYmosIHYsIG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2JqLnNldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AubmFtZSwgZGVzYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGFDbGFzcyB7XG4gIHN0YXRpYyByZXF1aXJlZFN5bWJvbCA9IFwiIVwiO1xuICBzdGF0aWMgdHlwZVN5bWJvbCA9IFwiOlwiO1xuICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+LFxuICAgIHB1YmxpYyBjcmVhdG9yOiAoanNvbj86IGFueSkgPT4gYW55ID0gbnVsbCxcbiAgICBwdWJsaWMgcGFyZW50TmFtZTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0aGlzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMucGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uYWRkQ2xhc3MobmFtZSwgdGhpcy5wYXJlbnROYW1lKTtcbiAgICB9XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5jcmVhdGVQcm9wZXJ0eShwcm9wZXJ0aWVzW2ldKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZmluZChuYW1lOiBzdHJpbmcpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMucHJvcGVydGllc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVByb3BlcnR5KHByb3BJbmZvOiBhbnkpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIHZhciBwcm9wZXJ0eU5hbWUgPSB0eXBlb2YgcHJvcEluZm8gPT09IFwic3RyaW5nXCIgPyBwcm9wSW5mbyA6IHByb3BJbmZvLm5hbWU7XG4gICAgaWYgKCFwcm9wZXJ0eU5hbWUpIHJldHVybjtcbiAgICB2YXIgcHJvcGVydHlUeXBlID0gbnVsbDtcbiAgICB2YXIgdHlwZUluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoSnNvbk1ldGFkYXRhQ2xhc3MudHlwZVN5bWJvbCk7XG4gICAgaWYgKHR5cGVJbmRleCA+IC0xKSB7XG4gICAgICBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKHR5cGVJbmRleCArIDEpO1xuICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCB0eXBlSW5kZXgpO1xuICAgIH1cbiAgICB2YXIgaXNSZXF1aXJlZCA9XG4gICAgICB0aGlzLmdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lKSB8fCAhIXByb3BJbmZvLmlzUmVxdWlyZWQ7XG4gICAgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTtcbiAgICB2YXIgcHJvcCA9IG5ldyBKc29uT2JqZWN0UHJvcGVydHkocHJvcGVydHlOYW1lLCBpc1JlcXVpcmVkKTtcbiAgICBpZiAocHJvcGVydHlUeXBlKSB7XG4gICAgICBwcm9wLnR5cGUgPSBwcm9wZXJ0eVR5cGU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcEluZm8gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChwcm9wSW5mby50eXBlKSB7XG4gICAgICAgIHByb3AudHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmRlZmF1bHQpKSB7XG4gICAgICAgIHByb3AuZGVmYXVsdFZhbHVlID0gcHJvcEluZm8uZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNTZXJpYWxpemFibGUpKSB7XG4gICAgICAgIHByb3AuaXNTZXJpYWxpemFibGUgPSBwcm9wSW5mby5pc1NlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNMaWdodFNlcmlhbGl6YWJsZSkpIHtcbiAgICAgICAgcHJvcC5pc0xpZ2h0U2VyaWFsaXphYmxlID0gcHJvcEluZm8uaXNMaWdodFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubWF4TGVuZ3RoKSkge1xuICAgICAgICBwcm9wLm1heExlbmd0aCA9IHByb3BJbmZvLm1heExlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uY2F0ZWdvcnkpKSB7XG4gICAgICAgIHByb3AuY2F0ZWdvcnkgPSBwcm9wSW5mby5jYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uY2F0ZWdvcnlJbmRleCkpIHtcbiAgICAgICAgcHJvcC5jYXRlZ29yeUluZGV4ID0gcHJvcEluZm8uY2F0ZWdvcnlJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubWF4VmFsdWUpKSB7XG4gICAgICAgIHByb3AubWF4VmFsdWUgPSBwcm9wSW5mby5tYXhWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubWluVmFsdWUpKSB7XG4gICAgICAgIHByb3AubWluVmFsdWUgPSBwcm9wSW5mby5taW5WYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNEeW5hbWljQ2hvaWNlcykpIHtcbiAgICAgICAgcHJvcC5pc0R5bmFtaWNDaG9pY2VzID0gcHJvcEluZm8uaXNEeW5hbWljQ2hvaWNlcztcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICBwcm9wLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLnZpc2libGVJZikge1xuICAgICAgICBwcm9wLnZpc2libGVJZiA9IHByb3BJbmZvLnZpc2libGVJZjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jaG9pY2VzKSB7XG4gICAgICAgIHZhciBjaG9pY2VzRnVuYyA9XG4gICAgICAgICAgdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgPT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xuICAgICAgICB2YXIgY2hvaWNlc1ZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyAhPT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgIHByb3Auc2V0Q2hvaWNlcyhjaG9pY2VzVmFsdWUsIGNob2ljZXNGdW5jKTtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLmJhc2VWYWx1ZSkge1xuICAgICAgICBwcm9wLnNldEJhc2VWYWx1ZShwcm9wSW5mby5iYXNlVmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLm9uR2V0VmFsdWUpIHtcbiAgICAgICAgcHJvcC5vbkdldFZhbHVlID0gcHJvcEluZm8ub25HZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5vblNldFZhbHVlKSB7XG4gICAgICAgIHByb3Aub25TZXRWYWx1ZSA9IHByb3BJbmZvLm9uU2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBcImxvY1wiICsgcHJvcEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkpIHtcbiAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gICAgICAgIHZhciBzOiBzdHJpbmc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJlxuICAgICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LmluZGV4T2YoXCJsb2NcIikgPT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSBwcm9wSW5mby5pc0xvY2FsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNsYXNzTmFtZSkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZSA9IHByb3BJbmZvLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3AuYmFzZUNsYXNzTmFtZSA9IHByb3BJbmZvLmJhc2VDbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uY2xhc3NOYW1lUGFydCkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZVBhcnQgPSBwcm9wSW5mby5jbGFzc05hbWVQYXJ0O1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZSkge1xuICAgICAgICBwcm9wLmFsdGVybmF0aXZlTmFtZSA9IHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5sYXlvdXQpIHtcbiAgICAgICAgcHJvcC5sYXlvdXQgPSBwcm9wSW5mby5sYXlvdXQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uZGVwZW5kc09uKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydGllcyhwcm9wLCBwcm9wSW5mby5kZXBlbmRzT24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuICBwcml2YXRlIGFkZERlcGVuZHNPblByb3BlcnRpZXMocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCBkZXBlbmRzT246IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZHNPbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kc09uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydHkocHJvcCwgZGVwZW5kc09uW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGREZXBlbmRzT25Qcm9wZXJ0eShwcm9wLCBkZXBlbmRzT24pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZERlcGVuZHNPblByb3BlcnR5KHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgZGVwZW5kc09uOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmZpbmQoZGVwZW5kc09uKTtcbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICBwcm9wZXJ0eSA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMucGFyZW50TmFtZSwgZGVwZW5kc09uKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0eSkgcmV0dXJuO1xuICAgIHByb3BlcnR5LmFkZERlcGVuZGVkUHJvcGVydHkocHJvcC5uYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcGVydHlOYW1lLmxlbmd0aCA+IDAgJiZcbiAgICAgIHByb3BlcnR5TmFtZVswXSA9PSBKc29uTWV0YWRhdGFDbGFzcy5yZXF1aXJlZFN5bWJvbFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSkpIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnNsaWNlKDEpO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGEge1xuICBwcml2YXRlIGNsYXNzZXM6IEhhc2hUYWJsZTxKc29uTWV0YWRhdGFDbGFzcz4gPSB7fTtcbiAgcHJpdmF0ZSBhbHRlcm5hdGl2ZU5hbWVzOiBIYXNoVGFibGU8c3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIGNoaWxkcmVuQ2xhc3NlczogSGFzaFRhYmxlPEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPj4gPSB7fTtcbiAgcHJpdmF0ZSBjbGFzc1Byb3BlcnRpZXM6IEhhc2hUYWJsZTxBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+PiA9IHt9O1xuICBwcml2YXRlIGNsYXNzSGFzaFByb3BlcnRpZXM6IEhhc2hUYWJsZTxIYXNoVGFibGU8SnNvbk9iamVjdFByb3BlcnR5Pj4gPSB7fTtcbiAgcHVibGljIGFkZENsYXNzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+LFxuICAgIGNyZWF0b3I6IChqc29uPzogYW55KSA9PiBhbnkgPSBudWxsLFxuICAgIHBhcmVudE5hbWU6IHN0cmluZyA9IG51bGxcbiAgKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSBuZXcgSnNvbk1ldGFkYXRhQ2xhc3MoXG4gICAgICBuYW1lLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwYXJlbnROYW1lXG4gICAgKTtcbiAgICB0aGlzLmNsYXNzZXNbbmFtZV0gPSBtZXRhRGF0YUNsYXNzO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV07XG4gICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXS5wdXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YURhdGFDbGFzcztcbiAgfVxuICBwdWJsaWMgcmVtb3ZlQ2xhc3MobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIG1ldGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YUNsYXNzKSByZXR1cm47XG4gICAgZGVsZXRlIHRoaXMuY2xhc3Nlc1ttZXRhQ2xhc3MubmFtZV07XG4gICAgaWYgKCEhbWV0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW21ldGFDbGFzcy5wYXJlbnROYW1lXS5pbmRleE9mKG1ldGFDbGFzcyk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1ttZXRhQ2xhc3MucGFyZW50TmFtZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlQ2xhc3NDcmVhdG9yZShuYW1lOiBzdHJpbmcsIGNyZWF0b3I6ICgpID0+IGFueSkge1xuICAgIHRoaXMub3ZlcnJpZGVDbGFzc0NyZWF0b3IobmFtZSwgY3JlYXRvcik7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlQ2xhc3NDcmVhdG9yKG5hbWU6IHN0cmluZywgY3JlYXRvcjogKCkgPT4gYW55KSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzKSB7XG4gICAgICBtZXRhRGF0YUNsYXNzLmNyZWF0b3IgPSBjcmVhdG9yO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllcyhjbGFzc05hbWU6IHN0cmluZyk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBtZXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghbWV0YUNsYXNzKSByZXR1cm4gW107XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmNsYXNzUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV07XG4gICAgaWYgKCEhcHJvcGVydGllcykgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgdGhpcy5maWxsUHJvcGVydGllc0ZvckNsYXNzKG1ldGFDbGFzcy5uYW1lKTtcbiAgICByZXR1cm4gdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdO1xuICB9XG4gIHByaXZhdGUgZ2V0SGFzaFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBIYXNoVGFibGU8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIG1ldGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFtZXRhQ2xhc3MpIHJldHVybiB7fTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuY2xhc3NIYXNoUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV07XG4gICAgaWYgKCEhcHJvcGVydGllcykgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgdGhpcy5maWxsUHJvcGVydGllc0ZvckNsYXNzKG1ldGFDbGFzcy5uYW1lKTtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW21ldGFDbGFzcy5uYW1lXTtcbiAgfVxuICBwcml2YXRlIGZpbGxQcm9wZXJ0aWVzRm9yQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgdmFyIGhhc2hQcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5maWxsUHJvcGVydGllcyhjbGFzc05hbWUsIHByb3BlcnRpZXMsIGhhc2hQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLmNsYXNzUHJvcGVydGllc1tjbGFzc05hbWVdID0gcHJvcGVydGllcztcbiAgICB0aGlzLmNsYXNzSGFzaFByb3BlcnRpZXNbY2xhc3NOYW1lXSA9IGhhc2hQcm9wZXJ0aWVzO1xuICB9XG4gIHByaXZhdGUgZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqOiBhbnkpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAob2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzICYmIG9iai5nZXREeW5hbWljVHlwZSkge1xuICAgICAgdmFyIG5hbWVzID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzKCk7XG4gICAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YS5maW5kUHJvcGVydGllcyhvYmouZ2V0RHluYW1pY1R5cGUoKSwgbmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXNCeU9iaihvYmo6IGFueSk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2gocHJvcHNbaV0pO1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1Byb3BzID0gdGhpcy5nZXREeW5hbWljUHJvcGVydGllcyhvYmopO1xuICAgIGlmIChkeW5hbWljUHJvcHMgJiYgZHluYW1pY1Byb3BzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKGR5bmFtaWNQcm9wc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwdWJsaWMgZmluZFByb3BlcnR5KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXG4gICk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIGhhc2ggPSB0aGlzLmdldEhhc2hQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlcyA9IGhhc2hbcHJvcGVydHlOYW1lXTtcbiAgICByZXR1cm4gISFyZXMgPyByZXMgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBmaW5kUHJvcGVydGllcyhcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWVzOiBBcnJheTxzdHJpbmc+XG4gICk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaGFzaCA9IHRoaXMuZ2V0SGFzaFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gaGFzaFtwcm9wZXJ0eU5hbWVzW2ldXTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBjcmVhdGVDbGFzcyhuYW1lOiBzdHJpbmcsIGpzb246IGFueSA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcikgcmV0dXJuIG1ldGFEYXRhQ2xhc3MuY3JlYXRvcihqc29uKTtcbiAgICB2YXIgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICB3aGlsZSAocGFyZW50TmFtZSkge1xuICAgICAgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKHBhcmVudE5hbWUpO1xuICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICAgIHBhcmVudE5hbWUgPSBtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWU7XG4gICAgICBpZiAobWV0YURhdGFDbGFzcy5jcmVhdG9yKVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDdXN0b21UeXBlKG5hbWUsIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciwganNvbik7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ3VzdG9tVHlwZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlYXRvcjogYW55LFxuICAgIGpzb246IGFueSA9IHVuZGVmaW5lZFxuICApOiBhbnkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IGNyZWF0b3IoanNvbik7XG4gICAgdmFyIGN1c3RvbVR5cGVOYW1lID0gbmFtZTtcbiAgICB2YXIgY3VzdG9tVGVtcGxhdGVOYW1lID0gcmVzLmdldFRlbXBsYXRlXG4gICAgICA/IHJlcy5nZXRUZW1wbGF0ZSgpXG4gICAgICA6IHJlcy5nZXRUeXBlKCk7XG4gICAgcmVzLmdldFR5cGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjdXN0b21UeXBlTmFtZTtcbiAgICB9O1xuICAgIHJlcy5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGN1c3RvbVRlbXBsYXRlTmFtZTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRDaGlsZHJlbkNsYXNzZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhbkJlQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPiB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzdWx0OiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4gPSBbXTtcbiAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMobmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldFJlcXVpcmVkUHJvcGVydGllcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhuYW1lKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGFkZFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnRpZXNJbmZvczogQXJyYXk8YW55Pikge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXNJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hZGRDdXN0b21Qcm9wZXJ0eUNvcmUobWV0YURhdGFDbGFzcywgcHJvcGVydGllc0luZm9zW2ldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eUluZm86IGFueSkge1xuICAgIHRoaXMuYWRkQ3VzdG9tUHJvcGVydHlDb3JlKHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSksIHByb3BlcnR5SW5mbyk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRDdXN0b21Qcm9wZXJ0eUNvcmUoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHlJbmZvOiBhbnlcbiAgKSB7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnR5ID0gbWV0YURhdGFDbGFzcy5jcmVhdGVQcm9wZXJ0eShwcm9wZXJ0eUluZm8pO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgcHJvcGVydHkuaXNDdXN0b20gPSB0cnVlO1xuICAgICAgdGhpcy5hZGRQcm9wZXJ0eVRvQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5hZGRQcm9wZXJ0eShtZXRhRGF0YUNsYXNzLm5hbWUsIHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHJlbW92ZVByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHlOYW1lKTtcbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5yZW1vdmVQcm9wZXJ0eShcbiAgICAgICAgbWV0YURhdGFDbGFzcy5uYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydHlUb0NsYXNzKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuZmluZChwcm9wZXJ0eS5uYW1lKSAhPSBudWxsKSByZXR1cm47XG4gICAgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eVxuICApIHtcbiAgICB2YXIgaW5kZXggPSBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByaXZhdGUgZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzKSB7XG4gICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YURhdGFDbGFzcy5uYW1lXSA9IG51bGw7XG4gICAgdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW21ldGFEYXRhQ2xhc3MubmFtZV0gPSBudWxsO1xuICAgIHZhciBjaGlsZENsYXNzZXMgPSB0aGlzLmdldENoaWxkcmVuQ2xhc3NlcyhtZXRhRGF0YUNsYXNzLm5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1tjaGlsZENsYXNzZXNbaV0ubmFtZV0gPSBudWxsO1xuICAgICAgdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW2NoaWxkQ2xhc3Nlc1tpXS5uYW1lXSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmlsbENoaWxkcmVuQ2xhc3NlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FuQmVDcmVhdGVkOiBib29sZWFuLFxuICAgIHJlc3VsdDogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+XG4gICkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW25hbWVdO1xuICAgIGlmICghY2hpbGRyZW4pIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWNhbkJlQ3JlYXRlZCB8fCBjaGlsZHJlbltpXS5jcmVhdG9yKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhjaGlsZHJlbltpXS5uYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kQ2xhc3MobmFtZTogc3RyaW5nKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMuY2xhc3Nlc1tuYW1lXTtcbiAgICBpZiAoIXJlcykge1xuICAgICAgdmFyIG5ld05hbWUgPSB0aGlzLmFsdGVybmF0aXZlTmFtZXNbbmFtZV07XG4gICAgICBpZiAoISFuZXdOYW1lICYmIG5ld05hbWUgIT0gbmFtZSkgcmV0dXJuIHRoaXMuZmluZENsYXNzKG5ld05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBpc0Rlc2NlbmRhbnRPZihjbGFzc05hbWU6IHN0cmluZywgYW5jZXN0b3JDbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICghY2xhc3NOYW1lIHx8ICFhbmNlc3RvckNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBhbmNlc3RvckNsYXNzTmFtZSA9IGFuY2VzdG9yQ2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNsYXNzXyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFjbGFzc18pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHBhcmVudENsYXNzID0gY2xhc3NfO1xuICAgIGRvIHtcbiAgICAgIGlmIChwYXJlbnRDbGFzcy5uYW1lID09PSBhbmNlc3RvckNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudENsYXNzID0gdGhpcy5jbGFzc2VzW3BhcmVudENsYXNzLnBhcmVudE5hbWVdO1xuICAgIH0gd2hpbGUgKCEhcGFyZW50Q2xhc3MpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQWx0ZXJOYXRpdmVDbGFzc05hbWUobmFtZTogc3RyaW5nLCBhbHRlcm5hdGl2ZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuYWx0ZXJuYXRpdmVOYW1lc1thbHRlcm5hdGl2ZU5hbWUudG9Mb3dlckNhc2UoKV0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGlzdDogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBoYXNoOiBIYXNoVGFibGU8SnNvbk9iamVjdFByb3BlcnR5PlxuICApIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lLCBsaXN0LCBoYXNoKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzW2ldO1xuICAgICAgdGhpcy5hZGRQcm9wZXJ0eUNvcmUocHJvcCwgbGlzdCwgaGFzaCk7XG4gICAgICBoYXNoW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5Q29yZShcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAgaGFzaDogSGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKSB7XG4gICAgaWYgKCFoYXNoW3Byb3BlcnR5Lm5hbWVdKSB7XG4gICAgICBsaXN0LnB1c2gocHJvcGVydHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gcHJvcGVydHkubmFtZSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wZXJ0eS5tZXJnZVdpdGgobGlzdFtpbmRleF0pO1xuICAgIGxpc3RbaW5kZXhdID0gcHJvcGVydHk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uRXJyb3Ige1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBhdDogTnVtYmVyID0gLTE7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0eXBlOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHt9XG4gIHB1YmxpYyBnZXRGdWxsRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlICsgKHRoaXMuZGVzY3JpcHRpb24gPyBcIlxcblwiICsgdGhpcy5kZXNjcmlwdGlvbiA6IFwiXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblVua25vd25Qcm9wZXJ0eUVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIFwidW5rbm93bnByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicgaW4gY2xhc3MgJ1wiICtcbiAgICAgICAgY2xhc3NOYW1lICtcbiAgICAgICAgXCInIGlzIHVua25vd24uXCJcbiAgICApO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIlRoZSBsaXN0IG9mIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIGFyZTogXCI7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBwcm9wZXJ0aWVzW2ldLm5hbWU7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLlwiO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UpO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIlRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGF2YWlsYWJsZTogXCI7XG4gICAgdmFyIHR5cGVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRDaGlsZHJlbkNsYXNzZXMoYmFzZUNsYXNzTmFtZSwgdHJ1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCInXCIgKyB0eXBlc1tpXS5uYW1lICsgXCInXCI7XG4gICAgfVxuICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWlzc2luZ1R5cGVFcnJvciBleHRlbmRzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYmFzZUNsYXNzTmFtZSxcbiAgICAgIFwibWlzc2luZ3R5cGVwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgdHlwZSBpcyBtaXNzaW5nIGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25JbmNvcnJlY3RUeXBlRXJyb3IgZXh0ZW5kcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBcImluY29ycmVjdHR5cGVwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgdHlwZSBpcyBpbmNvcnJlY3QgaW4gdGhlIG9iamVjdC4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHByb3BlcnR5OiAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInJlcXVpcmVkcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJyBpcyByZXF1aXJlZCBpbiBjbGFzcyAnXCIgK1xuICAgICAgICBjbGFzc05hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0IHtcbiAgcHJpdmF0ZSBzdGF0aWMgdHlwZVByb3BlcnR5TmFtZSA9IFwidHlwZVwiO1xuICBwcml2YXRlIHN0YXRpYyBwb3NpdGlvblByb3BlcnR5TmFtZSA9IFwicG9zXCI7XG4gIHByaXZhdGUgc3RhdGljIG1ldGFEYXRhVmFsdWUgPSBuZXcgSnNvbk1ldGFkYXRhKCk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG1ldGFEYXRhKCkge1xuICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhVmFsdWU7XG4gIH1cbiAgcHVibGljIGVycm9ycyA9IG5ldyBBcnJheTxKc29uRXJyb3I+KCk7XG4gIHB1YmxpYyBsaWdodFNlcmlhbGl6aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB0b0pzb25PYmplY3Qob2JqOiBhbnksIHN0b3JlRGVmYXVsdHMgPSBmYWxzZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudG9Kc29uT2JqZWN0Q29yZShvYmosIG51bGwsIHN0b3JlRGVmYXVsdHMpO1xuICB9XG4gIHB1YmxpYyB0b09iamVjdChqc29uT2JqOiBhbnksIG9iajogYW55KSB7XG4gICAgdGhpcy50b09iamVjdENvcmUoanNvbk9iaiwgb2JqKTtcbiAgICBpZiAoISFvYmouZ2V0VHlwZSkge1xuICAgICAgdmFyIGVycm9yID0gdGhpcy5nZXRSZXF1aXJlZEVycm9yKGpzb25PYmosIG9iai5nZXRUeXBlKCkpO1xuICAgICAgaWYgKCEhZXJyb3IpIHtcbiAgICAgICAgdGhpcy5hZGROZXdFcnJvcihlcnJvciwganNvbk9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyB0b09iamVjdENvcmUoanNvbk9iajogYW55LCBvYmo6IGFueSkge1xuICAgIGlmICghanNvbk9iaikgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gbnVsbDtcbiAgICB2YXIgb2JqVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgbmVlZEFkZEVycm9ycyA9IHRydWU7XG4gICAgaWYgKG9iai5nZXRUeXBlKSB7XG4gICAgICBvYmpUeXBlID0gb2JqLmdldFR5cGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqVHlwZSk7XG4gICAgICBuZWVkQWRkRXJyb3JzID1cbiAgICAgICAgISFvYmpUeXBlICYmICFKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKG9ialR5cGUsIFwiaXRlbXZhbHVlXCIpO1xuICAgIH1cbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcbiAgICBpZiAob2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICBvYmouc3RhcnRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB9XG4gICAgcHJvcGVydGllcyA9IHRoaXMuYWRkRHluYW1pY1Byb3BlcnRpZXMob2JqLCBqc29uT2JqLCBwcm9wZXJ0aWVzKTtcbiAgICBmb3IgKHZhciBrZXkgaW4ganNvbk9iaikge1xuICAgICAgaWYgKGtleSA9PT0gSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT09IEpzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgb2JqW2tleV0gPSBqc29uT2JqW2tleV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5maW5kUHJvcGVydHkocHJvcGVydGllcywga2V5KTtcbiAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgaWYgKG5lZWRBZGRFcnJvcnMpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKFxuICAgICAgICAgICAgbmV3IEpzb25Vbmtub3duUHJvcGVydHlFcnJvcihrZXkudG9TdHJpbmcoKSwgb2JqVHlwZSksXG4gICAgICAgICAgICBqc29uT2JqXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsdWVUb09iaihqc29uT2JqW2tleV0sIG9iaiwgcHJvcGVydHkpO1xuICAgIH1cbiAgICBpZiAob2JqLmVuZExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdG9Kc29uT2JqZWN0Q29yZShcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHN0b3JlRGVmYXVsdHMgPSBmYWxzZVxuICApOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuIG9iajtcbiAgICBpZiAodHlwZW9mIG9iai5nZXREYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBvYmouZ2V0RGF0YSgpO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiAhcHJvcGVydHkuY2xhc3NOYW1lKSB7XG4gICAgICAoPGFueT5yZXN1bHQpW0pzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5nZXRPYmpUeXBlKFxuICAgICAgICBvYmouZ2V0VHlwZSgpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSksXG4gICAgICByZXN1bHQsXG4gICAgICBzdG9yZURlZmF1bHRzXG4gICAgKTtcbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaiksXG4gICAgICByZXN1bHQsXG4gICAgICBzdG9yZURlZmF1bHRzXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqOiBhbnkpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAob2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzICYmIG9iai5nZXREeW5hbWljVHlwZSkge1xuICAgICAgdmFyIG5hbWVzID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzKCk7XG4gICAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YS5maW5kUHJvcGVydGllcyhvYmouZ2V0RHluYW1pY1R5cGUoKSwgbmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljUHJvcGVydGllcyhcbiAgICBvYmo6IGFueSxcbiAgICBqc29uT2JqOiBhbnksXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PlxuICApOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAoIW9iai5nZXREeW5hbWljUHJvcGVydHlOYW1lKSByZXR1cm4gcHJvcGVydGllcztcbiAgICB2YXIgZHluYW1pY1Byb3BOYW1lID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAoIWR5bmFtaWNQcm9wTmFtZSkgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgaWYgKGpzb25PYmpbZHluYW1pY1Byb3BOYW1lXSkge1xuICAgICAgb2JqW2R5bmFtaWNQcm9wTmFtZV0gPSBqc29uT2JqW2R5bmFtaWNQcm9wTmFtZV07XG4gICAgfVxuICAgIHZhciBkeW5hbWljUHJvcGVydGllcyA9IHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goZHluYW1pY1Byb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJvcGVydGllc1RvSnNvbihcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIGpzb246IGFueSxcbiAgICBzdG9yZURlZmF1bHRzID0gZmFsc2VcbiAgKSB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudmFsdWVUb0pzb24ob2JqLCBqc29uLCBwcm9wZXJ0aWVzW2ldLCBzdG9yZURlZmF1bHRzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHZhbHVlVG9Kc29uKFxuICAgIG9iajogYW55LFxuICAgIHJlc3VsdDogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgc3RvcmVEZWZhdWx0cyA9IGZhbHNlXG4gICkge1xuICAgIGlmIChcbiAgICAgIHByb3BlcnR5LmlzU2VyaWFsaXphYmxlID09PSBmYWxzZSB8fFxuICAgICAgKHByb3BlcnR5LmlzTGlnaHRTZXJpYWxpemFibGUgPT09IGZhbHNlICYmIHRoaXMubGlnaHRTZXJpYWxpemluZylcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdmFyIHZhbHVlID0gcHJvcGVydHkuZ2V0VmFsdWUob2JqKTtcbiAgICBpZiAoIXN0b3JlRGVmYXVsdHMgJiYgcHJvcGVydHkuaXNEZWZhdWx0VmFsdWUodmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUFycmF5KHZhbHVlKSkge1xuICAgICAgdmFyIGFyclZhbHVlID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyclZhbHVlLnB1c2godGhpcy50b0pzb25PYmplY3RDb3JlKHZhbHVlW2ldLCBwcm9wZXJ0eSwgc3RvcmVEZWZhdWx0cykpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBhcnJWYWx1ZS5sZW5ndGggPiAwID8gYXJyVmFsdWUgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZSwgcHJvcGVydHksIHN0b3JlRGVmYXVsdHMpO1xuICAgIH1cbiAgICB2YXIgaGFzVmFsdWUgPVxuICAgICAgdHlwZW9mIG9ialtcImdldFByb3BlcnR5VmFsdWVcIl0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgb2JqW1wiZ2V0UHJvcGVydHlWYWx1ZVwiXShwcm9wZXJ0eS5uYW1lLCBudWxsKSAhPT0gbnVsbDtcbiAgICBpZiAoKHN0b3JlRGVmYXVsdHMgJiYgaGFzVmFsdWUpIHx8ICFwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtwcm9wZXJ0eS5uYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb09iaih2YWx1ZTogYW55LCBvYmo6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5yZW1vdmVQb3MocHJvcGVydHksIHZhbHVlKTtcbiAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5oYXNUb1VzZVNldFZhbHVlKSB7XG4gICAgICBwcm9wZXJ0eS5zZXRWYWx1ZShvYmosIHZhbHVlLCB0aGlzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUFycmF5KHZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZVRvQXJyYXkodmFsdWUsIG9iaiwgcHJvcGVydHkubmFtZSwgcHJvcGVydHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmV3T2JqID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWUsIHByb3BlcnR5KTtcbiAgICBpZiAobmV3T2JqLm5ld09iaikge1xuICAgICAgdGhpcy50b09iamVjdENvcmUodmFsdWUsIG5ld09iai5uZXdPYmopO1xuICAgICAgdmFsdWUgPSBuZXdPYmoubmV3T2JqO1xuICAgIH1cbiAgICBpZiAoIW5ld09iai5lcnJvcikge1xuICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsdWUob2JqLCB2YWx1ZSwgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbcHJvcGVydHkubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQb3MocHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSwgdmFsdWU6IGFueSkge1xuICAgIGlmICghcHJvcGVydHkgfHwgIXByb3BlcnR5LnR5cGUgfHwgcHJvcGVydHkudHlwZS5pbmRleE9mKFwidmFsdWVcIikgPCAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMucmVtb3ZlUG9zRnJvbU9iaih2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQb3NGcm9tT2JqKG9iajogYW55KSB7XG4gICAgaWYgKCFvYmopIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlbW92ZVBvc0Zyb21PYmoob2JqW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhb2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBkZWxldGUgb2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzVmFsdWVBcnJheSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTmV3T2JqKHZhbHVlOiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHsgbmV3T2JqOiBudWxsLCBlcnJvcjogbnVsbCB9O1xuICAgIHZhciBjbGFzc05hbWUgPSB2YWx1ZVtKc29uT2JqZWN0LnR5cGVQcm9wZXJ0eU5hbWVdO1xuICAgIGlmICghY2xhc3NOYW1lICYmIHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5jbGFzc05hbWU7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IHByb3BlcnR5LmdldENsYXNzTmFtZShjbGFzc05hbWUpO1xuICAgIHJlc3VsdC5uZXdPYmogPSBjbGFzc05hbWVcbiAgICAgID8gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyhjbGFzc05hbWUsIHZhbHVlKVxuICAgICAgOiBudWxsO1xuICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY2hlY2tOZXdPYmplY3RPbkVycm9ycyhcbiAgICAgIHJlc3VsdC5uZXdPYmosXG4gICAgICB2YWx1ZSxcbiAgICAgIHByb3BlcnR5LFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgY2hlY2tOZXdPYmplY3RPbkVycm9ycyhcbiAgICBuZXdPYmo6IGFueSxcbiAgICB2YWx1ZTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgY2xhc3NOYW1lOiBzdHJpbmdcbiAgKTogSnNvbkVycm9yIHtcbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGVycm9yID0gdGhpcy5nZXRSZXF1aXJlZEVycm9yKHZhbHVlLCBjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcGVydHkuYmFzZUNsYXNzTmFtZSkge1xuICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICAgIGVycm9yID0gbmV3IEpzb25NaXNzaW5nVHlwZUVycm9yKFxuICAgICAgICAgICAgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5LmJhc2VDbGFzc05hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yID0gbmV3IEpzb25JbmNvcnJlY3RUeXBlRXJyb3IoXG4gICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHkuYmFzZUNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aGlzLmFkZE5ld0Vycm9yKGVycm9yLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICBwcml2YXRlIGdldFJlcXVpcmVkRXJyb3IodmFsdWU6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBKc29uRXJyb3Ige1xuICAgIHZhciByZXF1aXJlZFByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFJlcXVpcmVkUHJvcGVydGllcyhcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gICAgaWYgKCFyZXF1aXJlZFByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yKHJlcXVpcmVkUHJvcGVydGllc1tpXSwgY2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBhZGROZXdFcnJvcihlcnJvcjogSnNvbkVycm9yLCBqc29uT2JqOiBhbnkpIHtcbiAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG4gIHByaXZhdGUgdmFsdWVUb0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIG9iajogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG9ialtrZXldICYmIHZhbHVlLmxlbmd0aCA+IDApIG9ialtrZXldLnNwbGljZSgwLCBvYmpba2V5XS5sZW5ndGgpO1xuICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWVbaV0sIHByb3BlcnR5KTtcbiAgICAgIGlmIChuZXdWYWx1ZS5uZXdPYmopIHtcbiAgICAgICAgaWYgKCEhdmFsdWVbaV0ubmFtZSkge1xuICAgICAgICAgIG5ld1ZhbHVlLm5ld09iai5uYW1lID0gdmFsdWVbaV0ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpba2V5XS5wdXNoKG5ld1ZhbHVlLm5ld09iaik7XG4gICAgICAgIHRoaXMudG9PYmplY3RDb3JlKHZhbHVlW2ldLCBuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcnJvcikge1xuICAgICAgICAgIG9ialtrZXldLnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBTZXJpYWxpemVyID0gSnNvbk9iamVjdC5tZXRhRGF0YTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc29ub2JqZWN0LnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzNfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJSZWFjdFwiLFwiY29tbW9uanMyXCI6XCJyZWFjdFwiLFwiY29tbW9uanNcIjpcInJlYWN0XCIsXCJhbWRcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBpbnRlcmZhY2UgSGFzaFRhYmxlPFQ+IHtcbiAgW2tleTogc3RyaW5nXTogVDtcbn1cblxuZXhwb3J0IGNsYXNzIEhlbHBlcnMge1xuICAvKipcbiAgICogQSBzdGF0aWMgbWV0aG9kcyB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIHVuZGVyZmluZWQsIG51bGwsIGVtcHR5IHN0cmluZyBvciBlbXB0eSBhcnJheS5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCEhdmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXlDb250YWluc0VxdWFsKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGogPSAwO1xuICAgICAgZm9yICg7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeFtpXSwgeVtqXSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheXNFcXVhbChcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGlnbm9yZU9yZGVyOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpZ25vcmVPcmRlcikge1xuICAgICAgdmFyIHhTb3J0ZWQgPSBbXTtcbiAgICAgIHZhciB5U29ydGVkID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeFNvcnRlZC5wdXNoKHhbaV0pO1xuICAgICAgICB5U29ydGVkLnB1c2goeVtpXSk7XG4gICAgICB9XG4gICAgICB4U29ydGVkLnNvcnQoKTtcbiAgICAgIHlTb3J0ZWQuc29ydCgpO1xuICAgICAgeCA9IHhTb3J0ZWQ7XG4gICAgICB5ID0geVNvcnRlZDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4W2ldLCB5W2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzVHdvVmFsdWVFcXVhbHMoXG4gICAgeDogYW55LFxuICAgIHk6IGFueSxcbiAgICBpZ25vcmVPcmRlcjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHgubGVuZ3RoID09PSAwICYmIHR5cGVvZiB5ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeSkgJiYgeS5sZW5ndGggPT09IDAgJiYgdHlwZW9mIHggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSAmJiB5ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHkgPT09IHVuZGVmaW5lZCB8fCB5ID09PSBudWxsKSAmJiB4ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChIZWxwZXJzLmlzQ29udmVydGlibGVUb051bWJlcih4KSAmJiBIZWxwZXJzLmlzQ29udmVydGlibGVUb051bWJlcih5KSkge1xuICAgICAgaWYgKHBhcnNlSW50KHgpID09PSBwYXJzZUludCh5KSAmJiBwYXJzZUZsb2F0KHgpID09PSBwYXJzZUZsb2F0KHkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICghSGVscGVycy5pc1ZhbHVlRW1wdHkoeCkgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkoeSkpIHx8XG4gICAgICAoSGVscGVycy5pc1ZhbHVlRW1wdHkoeCkgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHkpKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoKHggPT09IHRydWUgfHwgeCA9PT0gZmFsc2UpICYmIHR5cGVvZiB5ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKCkgPT09IHkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKCh5ID09PSB0cnVlIHx8IHkgPT09IGZhbHNlKSAmJiB0eXBlb2YgeCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4geS50b1N0cmluZygpID09PSB4LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QpICYmICEoeSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiB4ID09IHk7XG4gICAgaWYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgfHwgISh5IGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh4W1wiZXF1YWxzXCJdKSByZXR1cm4geC5lcXVhbHMoeSk7XG4gICAgaWYgKCEheC50b0pTT04gJiYgISF5LnRvSlNPTikge1xuICAgICAgcmV0dXJuIHRoaXMuaXNUd29WYWx1ZUVxdWFscyh4LnRvSlNPTigpLCB5LnRvSlNPTigpKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkgJiYgQXJyYXkuaXNBcnJheSh5KSlcbiAgICAgIHJldHVybiBIZWxwZXJzLmlzQXJyYXlzRXF1YWwoeCwgeSwgaWdub3JlT3JkZXIpO1xuXG4gICAgZm9yICh2YXIgcCBpbiB4KSB7XG4gICAgICBpZiAoIXguaGFzT3duUHJvcGVydHkocCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKCF5Lmhhc093blByb3BlcnR5KHApKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoeFtwXSA9PT0geVtwXSkgY29udGludWU7XG4gICAgICBpZiAodHlwZW9mIHhbcF0gIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHhbcF0sIHlbcF0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAocCBpbiB5KSB7XG4gICAgICBpZiAoeS5oYXNPd25Qcm9wZXJ0eShwKSAmJiAheC5oYXNPd25Qcm9wZXJ0eShwKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmFuZG9taXplQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+KTogQXJyYXk8VD4ge1xuICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XG4gICAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFVuYmluZFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghIXZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAvL2RvIG5vdCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlISEhXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVDb3B5KG9iajogYW55KSB7XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgaWYgKCFvYmopIHJldHVybiByZXM7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ29udmVydGlibGVUb051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICFpc05hTih2YWx1ZSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAhIXZhbHVlICYmXG4gICAgICB2YWx1ZS5pbmRleE9mKFwiMHhcIikgPT0gMCAmJlxuICAgICAgdmFsdWUubGVuZ3RoID4gMzJcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyLCBzdXJ2ZXlMZW5ndGg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKG1heExlbmd0aCA8IDApIHtcbiAgICAgIG1heExlbmd0aCA9IHN1cnZleUxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIG1heExlbmd0aCA+IDAgPyBtYXhMZW5ndGggOiBudWxsO1xuICB9XG59XG5pZiAoISg8YW55PlN0cmluZy5wcm90b3R5cGUpW1wiZm9ybWF0XCJdKSB7XG4gICg8YW55PlN0cmluZy5wcm90b3R5cGUpW1wiZm9ybWF0XCJdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24obWF0Y2g6IGFueSwgbnVtYmVyOiBhbnkpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9IFwidW5kZWZpbmVkXCIgPyBhcmdzW251bWJlcl0gOiBtYXRjaDtcbiAgICB9KTtcbiAgfTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJzLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSVN1cnZleUNyZWF0b3IgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUxvY1N0cmluZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGNoYW5nZWQ6IDAgfTtcbiAgfVxuICBwcml2YXRlIGdldCBsb2NTdHIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmxvY1N0cjtcbiAgfVxuICBwcml2YXRlIGdldCBzdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnN0eWxlO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICghdGhpcy5sb2NTdHIpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5sb2NTdHIub25DaGFuZ2VkID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLnNldFN0YXRlKHsgY2hhbmdlZDogc2VsZi5zdGF0ZS5jaGFuZ2VkICsgMSB9KTtcbiAgICB9O1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmxvY1N0cikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubG9jU3RyLmhhc0h0bWwpIHtcbiAgICAgIGxldCBodG1sVmFsdWUgPSB7IF9faHRtbDogdGhpcy5sb2NTdHIucmVuZGVyZWRIdG1sIH07XG4gICAgICByZXR1cm4gPHNwYW4gc3R5bGU9e3RoaXMuc3R5bGV9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9IC8+O1xuICAgIH1cbiAgICByZXR1cm4gPHNwYW4gc3R5bGU9e3RoaXMuc3R5bGV9Pnt0aGlzLmxvY1N0ci5yZW5kZXJlZEh0bWx9PC9zcGFuPjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5RWxlbWVudEJhc2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBhbnk+IHtcbiAgcHVibGljIHN0YXRpYyByZW5kZXJMb2NTdHJpbmcoXG4gICAgbG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZyxcbiAgICBzdHlsZTogYW55ID0gbnVsbFxuICApOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxTdXJ2ZXlMb2NTdHJpbmcgbG9jU3RyPXtsb2NTdHJ9IHN0eWxlPXtzdHlsZX0gLz47XG4gIH1cbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLm1ha2VCYXNlRWxlbWVudFJlYWN0KCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy51bk1ha2VCYXNlRWxlbWVudFJlYWN0KCk7XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogYW55LCBwcmV2U3RhdGU6IGFueSkge1xuICAgIHRoaXMubWFrZUJhc2VFbGVtZW50UmVhY3QoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNEaXNwbGF5TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc0Rpc3BsYXlNb2RlIHx8IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJMb2NTdHJpbmcoXG4gICAgbG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZyxcbiAgICBzdHlsZTogYW55ID0gbnVsbFxuICApOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyhsb2NTdHIsIHN0eWxlKTtcbiAgfVxuICBwcm90ZWN0ZWQgbWFrZUJhc2VFbGVtZW50UmVhY3QoKSB7XG4gICAgdmFyIHN0YXRlRWxlbWVudCA9IHRoaXMuZ2V0U3RhdGVFbGVtZW50KCk7XG4gICAgaWYgKCFzdGF0ZUVsZW1lbnQpIHJldHVybjtcbiAgICBzdGF0ZUVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIHZhciB2YWw6IGFueSA9IGhhc2hba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIHZhbDogYW55ID0gdmFsO1xuICAgICAgICB2YWxbXCJvbkFycmF5Q2hhbmdlZFwiXSA9ICgpID0+XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdmFyIG5ld1N0YXRlOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgICAgICAgIG5ld1N0YXRlW2tleV0gPSB2YWw7XG4gICAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc3RhdGVFbGVtZW50LnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlciA9IChcbiAgICAgIGhhc2g6IGFueSxcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgdmFsOiBhbnlcbiAgICApID0+IHtcbiAgICAgIGlmIChoYXNoW2tleV0gIT09IHZhbCkge1xuICAgICAgICBoYXNoW2tleV0gPSB2YWw7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlOiBhbnkpID0+IHtcbiAgICAgICAgICB2YXIgbmV3U3RhdGU6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgICAgIG5ld1N0YXRlW2tleV0gPSB2YWw7XG4gICAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCB1bk1ha2VCYXNlRWxlbWVudFJlYWN0KCkge1xuICAgIHZhciBzdGF0ZUVsZW1lbnQgPSB0aGlzLmdldFN0YXRlRWxlbWVudCgpO1xuICAgIGlmICghc3RhdGVFbGVtZW50KSByZXR1cm47XG4gICAgc3RhdGVFbGVtZW50LnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICBzdGF0ZUVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIHZhciB2YWw6IGFueSA9IGhhc2hba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIHZhbDogYW55ID0gdmFsO1xuICAgICAgICB2YWxbXCJvbkFycmF5Q2hhbmdlZFwiXSA9ICgpID0+IHt9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFjdFN1cnZleUVsZW1lbnQgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3NzQ2xhc3NlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uQmFzZSgpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjcmVhdG9yKCk6IElTdXJ2ZXlDcmVhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jcmVhdG9yO1xuICB9XG4gIHB1YmxpYyBzaG91bGRDb21wb25lbnRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0RGF0YS5pc05lZWRSZW5kZXIgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldC53aWRnZXRKc29uLnJlbmRlclxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uVW5jb250cm9sbGVkRWxlbWVudDxcbiAgVCBleHRlbmRzIFF1ZXN0aW9uXG4+IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnRyb2w6IGFueTtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudCA9IHRoaXMudXBkYXRlVmFsdWVPbkV2ZW50LmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgVDtcbiAgfVxuICBjb21wb25lbnRXaWxsVXBkYXRlKCkge1xuICAgIGlmICghIXRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0aGlzLnF1ZXN0aW9uQmFzZS52YWx1ZSk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICghIXRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0aGlzLnF1ZXN0aW9uQmFzZS52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVZhbHVlT25FdmVudCA9IChldmVudDogYW55KSA9PiB7XG4gICAgdGhpcy5xdWVzdGlvbkJhc2UudmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH07XG4gIHByaXZhdGUgZ2V0VmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmVsZW1lbnQudHN4IiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlYWN0UXVlc3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUmVhY3RRdWVzdGlvbkZhY3RvcnkgPSBuZXcgUmVhY3RRdWVzdGlvbkZhY3RvcnkoKTtcbiAgcHJpdmF0ZSBjcmVhdG9ySGFzaDogSGFzaFRhYmxlPChuYW1lOiBzdHJpbmcpID0+IEpTWC5FbGVtZW50PiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlclF1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uQ3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gSlNYLkVsZW1lbnRcbiAgKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdID0gcXVlc3Rpb25DcmVhdG9yO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBwYXJhbXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXTtcbiAgICBpZiAoY3JlYXRvciA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gY3JlYXRvcihwYXJhbXMpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZhY3RvcnkudHN4IiwiaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLFxuICBKc29uT2JqZWN0LFxuICBTZXJpYWxpemVyXG59IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RGF0YSB7XG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55LCBsb2NOb3RpZmljYXRpb246IGFueSk6IGFueTtcbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55O1xuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiB2b2lkO1xuICBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcsIGxvY05vdGlmaWNhdGlvbjogYW55KTogYW55O1xuICBnZXRBbGxWYWx1ZXMoKTogYW55O1xuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnk7XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElUZXh0UHJvY2Vzc29yIHtcbiAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmc7XG4gIHByb2Nlc3NUZXh0RXgoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbixcbiAgICBkb0VuY29kaW5nOiBib29sZWFuXG4gICk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUVycm9yT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvcik6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5IGV4dGVuZHMgSVRleHRQcm9jZXNzb3IsIElTdXJ2ZXlFcnJvck93bmVyIHtcbiAgY3VycmVudFBhZ2U6IElQYWdlO1xuICBwYWdlczogQXJyYXk8SVBhZ2U+O1xuICBnZXRDc3MoKTogYW55O1xuICBpc1BhZ2VTdGFydGVkKHBhZ2U6IElQYWdlKTogYm9vbGVhbjtcbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbik6IGFueTtcbiAgcGFuZWxWaXNpYmlsaXR5Q2hhbmdlZChwYW5lbDogSVBhbmVsLCBuZXdWYWx1ZTogYm9vbGVhbik6IGFueTtcbiAgcXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBuZXdWYWx1ZTogYm9vbGVhbik6IGFueTtcbiAgcXVlc3Rpb25zT3JkZXI6IHN0cmluZztcbiAgcXVlc3Rpb25BZGRlZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyZW50UGFuZWw6IGFueSxcbiAgICByb290UGFuZWw6IGFueVxuICApOiBhbnk7XG4gIHBhbmVsQWRkZWQoXG4gICAgcGFuZWw6IElFbGVtZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyZW50UGFuZWw6IGFueSxcbiAgICByb290UGFuZWw6IGFueVxuICApOiBhbnk7XG4gIHF1ZXN0aW9uUmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYW55O1xuICBwYW5lbFJlbW92ZWQocGFuZWw6IElFbGVtZW50KTogYW55O1xuICBxdWVzdGlvblJlbmFtZWQoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBvbGROYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWVOYW1lOiBzdHJpbmdcbiAgKTogYW55O1xuICB2YWxpZGF0ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBTdXJ2ZXlFcnJvcjtcbiAgdmFsaWRhdGVQYW5lbChwYW5lbDogSVBhbmVsKTogU3VydmV5RXJyb3I7XG4gIGhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgcXVlc3Rpb25Db3VudEJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICBwcm9jZXNzSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFN1cnZleU1hcmtkb3duSHRtbChlbGVtZW50OiBCYXNlLCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGlzRGlzcGxheU1vZGU6IGJvb2xlYW47XG4gIGlzRGVzaWduTW9kZTogYm9vbGVhbjtcbiAgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nOiBib29sZWFuO1xuICBpc0xvYWRpbmdGcm9tSnNvbjogYm9vbGVhbjtcbiAgaXNVcGRhdGVWYWx1ZVRleHRPblR5cGluZzogYm9vbGVhbjtcblxuICByZXF1aXJlZFRleHQ6IHN0cmluZztcbiAgYmVmb3JlU2V0dGluZ1F1ZXN0aW9uRXJyb3JzKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj5cbiAgKTogdm9pZDtcbiAgZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IHN0cmluZztcbiAgZ2V0VXBkYXRlZFF1ZXN0aW9uVGl0bGUocXVlc3Rpb246IElRdWVzdGlvbiwgdGl0bGU6IHN0cmluZyk6IHN0cmluZztcblxuICBxdWVzdGlvblN0YXJ0SW5kZXg6IHN0cmluZztcbiAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBzdHJpbmc7XG4gIHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbjogc3RyaW5nO1xuICBxdWVzdGlvbkVycm9yTG9jYXRpb246IHN0cmluZztcbiAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IGJvb2xlYW47XG5cbiAgbWF4VGV4dExlbmd0aDogbnVtYmVyO1xuICBtYXhPdGhlcnNMZW5ndGg6IG51bWJlcjtcbiAgY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zOiBib29sZWFuO1xuXG4gIHVwbG9hZEZpbGVzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmaWxlczogRmlsZVtdLFxuICAgIHVwbG9hZGluZ0NhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICk6IGFueTtcbiAgZG93bmxvYWRGaWxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKTogYW55O1xuICBjbGVhckZpbGVzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgY2xlYXJDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApOiBhbnk7XG4gIHVwZGF0ZUNob2ljZXNGcm9tU2VydmVyKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgY2hvaWNlczogQXJyYXk8YW55PixcbiAgICBzZXJ2ZXJSZXN1bHQ6IGFueVxuICApOiBBcnJheTxhbnk+O1xuICB1cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMocXVlc3Rpb246IElRdWVzdGlvbiwgY3NzQ2xhc3NlczogYW55KTogYW55O1xuICB1cGRhdGVQYW5lbENzc0NsYXNzZXMocGFuZWw6IElQYW5lbCwgY3NzQ2xhc3NlczogYW55KTogYW55O1xuICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBhbnkpOiBhbnk7XG4gIGFmdGVyUmVuZGVyUGFuZWwocGFuZWw6IElFbGVtZW50LCBodG1sRWxlbWVudDogYW55KTogYW55O1xuICBhZnRlclJlbmRlclBhZ2UoaHRtbEVsZW1lbnQ6IGFueSk6IGFueTtcblxuICBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lRnJvbUFycmF5KFxuICAgIHZhbHVlTmFtZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IElRdWVzdGlvbjtcbiAgbWF0cml4Um93QWRkZWQocXVlc3Rpb246IElRdWVzdGlvbik6IGFueTtcbiAgbWF0cml4QmVmb3JlUm93QWRkZWQob3B0aW9uczoge1xuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb247XG4gICAgY2FuQWRkUm93OiBib29sZWFuO1xuICB9KTogYW55O1xuICBtYXRyaXhSb3dSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvd0luZGV4OiBudW1iZXIsIHJvdzogYW55KTogYW55O1xuICBtYXRyaXhBbGxvd1JlbW92ZVJvdyhcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgcm93OiBhbnlcbiAgKTogYm9vbGVhbjtcbiAgbWF0cml4Q2VsbENyZWF0ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IGFueTtcbiAgbWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmcocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhDZWxsVmFsaWRhdGUocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogU3VydmV5RXJyb3I7XG4gIGR5bmFtaWNQYW5lbEFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIGR5bmFtaWNQYW5lbFJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcGFuZWxJbmRleDogbnVtYmVyKTogYW55O1xuICBkeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IGFueTtcblxuICBkcmFnQW5kRHJvcEFsbG93KG9wdGlvbnM6IGFueSk6IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlJbXBsIHtcbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhO1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3Nvcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmRpdGlvblJ1bm5lciB7XG4gIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pik6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUVsZW1lbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgaXNSZWFkT25seTogYm9vbGVhbjtcbiAgaXNQYWdlOiBib29sZWFuO1xuICBpc1BhbmVsOiBib29sZWFuO1xuICBjb250YWluc0Vycm9yczogYm9vbGVhbjtcbiAgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpOiBhbnk7XG4gIG9uU3VydmV5TG9hZCgpOiBhbnk7XG4gIG9uRmlyc3RSZW5kZXJpbmcoKTogYW55O1xuICBnZXRUeXBlKCk6IHN0cmluZztcbiAgc2V0VmlzaWJsZUluZGV4KHZhbHVlOiBudW1iZXIpOiBudW1iZXI7XG4gIGxvY1N0cnNDaGFuZ2VkKCk6IGFueTtcbiAgZGVsZXRlKCk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnQgZXh0ZW5kcyBJQ29uZGl0aW9uUnVubmVyLCBJU3VydmV5RWxlbWVudCB7XG4gIHZpc2libGU6IGJvb2xlYW47XG4gIHBhcmVudDogSVBhbmVsO1xuICByZW5kZXJXaWR0aDogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xuICByaWdodEluZGVudDogbnVtYmVyO1xuICBzdGFydFdpdGhOZXdMaW5lOiBib29sZWFuO1xuICBnZXRQYW5lbCgpOiBJUGFuZWw7XG4gIGdldExheW91dFR5cGUoKTogc3RyaW5nO1xuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgcmVtb3ZlRWxlbWVudChlbDogSUVsZW1lbnQpOiBib29sZWFuO1xuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIHVwZGF0ZUN1c3RvbVdpZGdldHMoKTogYW55O1xuICBjbGVhckluY29ycmVjdFZhbHVlcygpOiBhbnk7XG4gIGNsZWFyRXJyb3JzKCk6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUXVlc3Rpb24gZXh0ZW5kcyBJRWxlbWVudCwgSVN1cnZleUVycm9yT3duZXIge1xuICBoYXNUaXRsZTogYm9vbGVhbjtcbiAgaXNFbXB0eSgpOiBib29sZWFuO1xuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KTogYW55O1xuICB1cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSk6IGFueTtcbiAgdXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSk6IGFueTtcbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbjtcbiAgY2xlYXJVbnVzZWRWYWx1ZXMoKTogYW55O1xuICBnZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueTtcbiAgZ2V0VmFsdWVOYW1lKCk6IHN0cmluZztcbiAgY2xlYXJWYWx1ZSgpOiBhbnk7XG4gIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpOiBhbnk7XG4gIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuO1xuICB1cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpOiBhbnk7XG4gIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbjtcbiAgdmFsdWU6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcmVudEVsZW1lbnQge1xuICBhZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKTogYW55O1xuICByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbjtcbiAgaXNSZWFkT25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFuZWwgZXh0ZW5kcyBJU3VydmV5RWxlbWVudCwgSVBhcmVudEVsZW1lbnQge1xuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nO1xuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nO1xuICBwYXJlbnQ6IElQYW5lbDtcbiAgZWxlbWVudFdpZHRoQ2hhbmdlZChlbDogSUVsZW1lbnQpOiBhbnk7XG4gIGluZGV4T2YoZWw6IElFbGVtZW50KTogbnVtYmVyO1xuICBlbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+O1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFnZSBleHRlbmRzIElQYW5lbCwgSUNvbmRpdGlvblJ1bm5lciB7XG4gIGlzU3RhcnRlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIFN1cnZleUpTIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgY29tbWVudFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXR0aW5ncy5jb21tZW50UHJlZml4O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IGNvbW1lbnRQcmVmaXgodmFsOiBzdHJpbmcpIHtcbiAgICBzZXR0aW5ncy5jb21tZW50UHJlZml4ID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSXRlbVZhbHVlOiAoaXRlbTogYW55LCB0eXBlPzogc3RyaW5nKSA9PiBhbnk7XG4gIHB1YmxpYyBzdGF0aWMgaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZDogKGFycjogQXJyYXk8YW55PikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEEgc3RhdGljIG1ldGhvZHMgdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSB1bmRlcmZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgb3IgZW1wdHkgYXJyYXkuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgSXNQcm9wZXJ0eUVtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IFwiXCIgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9wZXJ0eUhhc2g6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIGxvY2FsaXphYmxlU3RyaW5nczogeyBbaW5kZXg6IHN0cmluZ106IExvY2FsaXphYmxlU3RyaW5nIH07XG4gIHByaXZhdGUgYXJyYXlzSW5mbzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9O1xuICBwcml2YXRlIG9uUHJvcENoYW5nZUZ1bmN0aW9uczogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmdW5jOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gICAga2V5OiBzdHJpbmc7XG4gIH0+O1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgb25Qcm9wZXJ0eUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG5cbiAgZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyOiAocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyOiAoXG4gICAgcHJvcGVydGllc0hhc2g6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsOiBhbnlcbiAgKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYXMgYSBzdHJpbmcgYXMgaXQgcmVwcmVzZW50cyBpbiB0aGUganNvbi4gSXQgc2hvdWxkIGJlIGluIGxvd2Nhc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJhc2VcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZWxlbWVudCB0ZW1wbGF0ZSBuYW1lIHdpdGhvdXQgcHJlZml4LiBUeXBpY2FsbHkgaXQgZXF1YWxzIHRvIGdldFR5cGUoKS5cbiAgICogQHNlZSBnZXRUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxvYWRpbmcgZnJvbSBKc29uIGF0IHRoZSBjdXJyZW50IG1vbWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTtcbiAgfVxuICBzdGFydExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUgPSB0cnVlO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogRGVzZXJpYWxpemVkIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIEpTT05cbiAgICogQHNlZSBmcm9tSlNPTlxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiBhbnkge1xuICAgIHJldHVybiBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzKTtcbiAgfVxuICAvKipcbiAgICogTG9hZCBvYmplY3QgcHJvcGVydGllcyBhbmQgZWxlbWVudHMuIEl0IGRvZXNuJ3QgcmVzZXQgcHJvcGVydGllcyB0aGF0IHdhcyBjaGFuZ2VkIGJlZm9yZSBhbmQgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gdGhlIGpzb24gcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0ganNvbiB0aGUgb2JqZWN0IEpTT04gZGVmaW5pdGlvblxuICAgKiBAc2VlIHRvSlNPTlxuICAgKi9cbiAgcHVibGljIGZyb21KU09OKGpzb246IGFueSkge1xuICAgIHJldHVybiBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBNYWtlIGEgY2xvbmUgb2YgdGhlIGV4aXN0aW5nIG9iamVjdC4gQ3JlYXRlIGEgbmV3IG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlIGFuZCBsb2FkIGFsbCBwcm9wZXJ0aWVzIGludG8gaXQuXG4gICAqL1xuICBwdWJsaWMgY2xvbmUoKTogQmFzZSB7XG4gICAgdmFyIGNsb25lZE9iaiA9IDxCYXNlPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3ModGhpcy5nZXRUeXBlKCkpO1xuICAgIGNsb25lZE9iai5mcm9tSlNPTih0aGlzLnRvSlNPTigpKTtcbiAgICByZXR1cm4gY2xvbmVkT2JqO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBpZiAoISF0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmFycmF5c0luZm9ba2V5XTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0l0ZW1WYWx1ZXMpIHtcbiAgICAgICAgICB2YXIgYXJyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgICAgaWYgKGFyciAmJiAhIUJhc2UuaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZClcbiAgICAgICAgICAgIEJhc2UuaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZChhcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKGtleSk7XG4gICAgICAgIGlmIChpdGVtKSBpdGVtLnN0ckNoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGJ5IG5hbWVcbiAgICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFByb3BlcnR5VmFsdWUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGwpOiBhbnkge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWVDb3JlKHRoaXMucHJvcGVydHlIYXNoLCBuYW1lKTtcbiAgICBpZiAodGhpcy5Jc1Byb3BlcnR5RW1wdHkocmVzKSkge1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgdmFyIHByb3AgPSBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLmdldFR5cGUoKSwgbmFtZSk7XG4gICAgICB2YXIgc2VyVmFsdWUgPSAhIXByb3AgJiYgIXByb3AuaXNDdXN0b20gPyBwcm9wLmRlZmF1bHRWYWx1ZSA6IG51bGw7XG4gICAgICBpZiAoIXRoaXMuSXNQcm9wZXJ0eUVtcHR5KHNlclZhbHVlKSkgcmV0dXJuIHNlclZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9wZXJ0eVZhbHVlQ29yZShwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIocHJvcGVydGllc0hhc2gsIG5hbWUpO1xuICAgIGVsc2UgcmV0dXJuIHByb3BlcnRpZXNIYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBnZVZhbHVlRnJvbUhhc2goKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUhhc2hbXCJ2YWx1ZVwiXTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcilcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lLCB2YWwpO1xuICAgIGVsc2UgcHJvcGVydGllc0hhc2hbbmFtZV0gPSB2YWw7XG4gIH1cbiAgcHVibGljIGl0ZXJhdGVQcm9wZXJ0aWVzSGFzaChmdW5jOiAoaGFzaDogYW55LCBrZXk6IGFueSkgPT4gdm9pZCkge1xuICAgIHZhciBrZXlzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnByb3BlcnR5SGFzaCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4gZnVuYyh0aGlzLnByb3BlcnR5SGFzaCwga2V5KSk7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB2YWwgbmV3IHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgIGlmIChvbGRWYWx1ZSAmJiBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSkge1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkgcmV0dXJuO1xuICAgICAgdmFyIGFycmF5SW5mbyA9IHRoaXMuYXJyYXlzSW5mb1tuYW1lXTtcbiAgICAgIHRoaXMuc2V0QXJyYXkoXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICB2YWwsXG4gICAgICAgIGFycmF5SW5mbyA/IGFycmF5SW5mby5pc0l0ZW1WYWx1ZXMgOiBmYWxzZSxcbiAgICAgICAgYXJyYXlJbmZvID8gYXJyYXlJbmZvLm9uUHVzaCA6IG51bGxcbiAgICAgICk7XG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIHZhbCk7XG4gICAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkge1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgc2VuZGVyOiBCYXNlLFxuICAgIGFycmF5Q2hhbmdlczogQXJyYXlDaGFuZ2VzXG4gICkge31cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge31cbiAgcHJvdGVjdGVkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgYXJyYXlDaGFuZ2VzPzogQXJyYXlDaGFuZ2VzLFxuICAgIHRhcmdldD86IEJhc2VcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5kb1Byb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICBuYW1lLFxuICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgIGFycmF5Q2hhbmdlcyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV0ubmFtZSA9PSBuYW1lKVxuICAgICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5mdW5jKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvUHJvcGVydHlWYWx1ZUNoYW5nZWRDYWxsYmFjayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIGFycmF5Q2hhbmdlcz86IEFycmF5Q2hhbmdlcyxcbiAgICB0YXJnZXQ/OiBCYXNlXG4gICkge1xuICAgIGlmICghdGFyZ2V0KSB0YXJnZXQgPSB0aGlzO1xuICAgIGxldCBwYXJlbnRCYXNlOiBCYXNlID0gdGhpcztcblxuICAgIGlmICgoPGFueT50aGlzKVtcImxvY093bmVyXCJdKSB7XG4gICAgICBwYXJlbnRCYXNlID0gKDxhbnk+dGhpcylbXCJsb2NPd25lclwiXTtcbiAgICAgIHBhcmVudEJhc2UuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICAgIHBhcmVudEJhc2UuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgYXJyYXlDaGFuZ2VzLFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoKDxhbnk+dGhpcylbXCJzdXJ2ZXlcIl0pIHtcbiAgICAgIHBhcmVudEJhc2UgPSAoPGFueT50aGlzKVtcInN1cnZleVwiXTtcbiAgICAgIHBhcmVudEJhc2UuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrICYmXG4gICAgICAgIHBhcmVudEJhc2UuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgYXJyYXlDaGFuZ2VzLFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGFycmF5Q2hhbmdlc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlZC5cbiAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHdpdGggbm8gcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHByb3BlcnR5IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBrZXkgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSB3aXRodCB0aGUgc2FtZSBrZXksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZ1bmM6IGFueSxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKGtleSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgICBpZiAoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgICAgaXRlbS5mdW5jID0gZnVuYztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMucHVzaCh7IG5hbWU6IG5hbWUsIGZ1bmM6IGZ1bmMsIGtleToga2V5IH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkIGZyb20gdGhlIG5hbWVzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzXG4gICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ga2V5IGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gZm9yIHRoaXMgcHJvcGVydHkgd2l0aHQgdGhlIHNhbWUga2V5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZnVuYzogYW55LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWVzW2ldLCBmdW5jLCBrZXkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZFxuICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgd2l0aCB3aGljaCB5b3UgaGF2ZSByZWdpc3RlcmVkIHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgcHJvcGVydHkuIEl0IGNhbiBiZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpdGVtLm5hbWUgPT0gbmFtZSAmJiBpdGVtLmtleSA9PSBrZXkpIHtcbiAgICAgICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIG5vdGlmaWNhdGlvbiBvbiBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkIGZvciBhbGwgcHJvcGVydGllcyBpbiB0aGUgbmFtZXMgbGlzdC5cbiAgICogQHBhcmFtIG5hbWVzIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgbmFtZXNcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHdpdGggd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCB0aGUgbm90aWZpY2F0aW9uIGZvciB0aGlzIHByb3BlcnR5LiBJdCBjYW4gYmUgbnVsbC5cbiAgICovXG4gIHB1YmxpYyB1blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lc1tpXSwga2V5KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNyZWF0ZUN1c3RvbUxvY2FsaXphYmxlT2JqKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmIChsb2NTdHIgfHwgISg8YW55PnRoaXMpLmdldExvY2FsZSkgcmV0dXJuO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcobmFtZSwgPElMb2NhbGl6YWJsZU93bmVyPig8YW55PnRoaXMpKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG93bmVyOiBJTG9jYWxpemFibGVPd25lcixcbiAgICB1c2VNYXJrRG93bjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgbG9jU3RyID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKG93bmVyLCB1c2VNYXJrRG93bik7XG4gICAgaWYgKCF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3NbbmFtZV0gPSBsb2NTdHI7XG4gICAgcmV0dXJuIGxvY1N0cjtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZTogc3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jYWxpemFibGVTdHJpbmdzID8gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3NbbmFtZV0gOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRTdHI6IHN0cmluZyA9IFwiXCJcbiAgKTogc3RyaW5nIHtcbiAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICBpZiAoIWxvY1N0cikgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHJlcyA9IGxvY1N0ci50ZXh0O1xuICAgIHJldHVybiByZXMgPyByZXMgOiBkZWZhdWx0U3RyO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKCFsb2NTdHIpIHJldHVybjtcbiAgICB2YXIgb2xkVmFsdWUgPSBsb2NTdHIudGV4dDtcbiAgICBpZiAob2xkVmFsdWUgPT09IHZhbHVlKSByZXR1cm47XG4gICAgbG9jU3RyLnRleHQgPSB2YWx1ZTtcbiAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGFkZFVzZWRMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAoISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICAgICAgICBpZiAoaXRlbSkgdGhpcy5BZGRMb2NTdHJpbmdUb1VzZWRMb2NhbGVzKGl0ZW0sIGxvY2FsZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uYWRkVXNlZExvY2FsZXMpIHtcbiAgICAgICAgICAgIGl0ZW0uYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBBZGRMb2NTdHJpbmdUb1VzZWRMb2NhbGVzKFxuICAgIGxvY1N0cjogTG9jYWxpemFibGVTdHJpbmcsXG4gICAgbG9jYWxlczogQXJyYXk8c3RyaW5nPlxuICApIHtcbiAgICB2YXIgbG9jcyA9IGxvY1N0ci5nZXRMb2NhbGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobG9jYWxlcy5pbmRleE9mKGxvY3NbaV0pIDwgMCkge1xuICAgICAgICBsb2NhbGVzLnB1c2gobG9jc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtVmFsdWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PGFueT4ge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5jcmVhdGVOZXdBcnJheShuYW1lLCBmdW5jdGlvbihpdGVtOiBhbnkpIHtcbiAgICAgIGl0ZW0ubG9jT3duZXIgPSBzZWxmO1xuICAgIH0pO1xuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXS5pc0l0ZW1WYWx1ZXMgPSB0cnVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBcnJheUNoYW5nZWQoYXI6IGFueSkge1xuICAgICEhYXIub25BcnJheUNoYW5nZWQgJiYgYXIub25BcnJheUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3QXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uUHVzaDogYW55ID0gbnVsbCxcbiAgICBvblJlbW92ZTogYW55ID0gbnVsbFxuICApOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgbmV3QXJyYXkgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIG5ld0FycmF5KTtcbiAgICBpZiAoIXRoaXMuYXJyYXlzSW5mbykge1xuICAgICAgdGhpcy5hcnJheXNJbmZvID0ge307XG4gICAgfVxuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXSA9IHsgb25QdXNoOiBvblB1c2gsIGlzSXRlbVZhbHVlczogZmFsc2UgfTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbmV3QXJyYXkucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnB1c2guY2FsbChuZXdBcnJheSwgdmFsdWUpO1xuICAgICAgaWYgKG9uUHVzaCkgb25QdXNoKHZhbHVlLCBuZXdBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMoXG4gICAgICAgIG5ld0FycmF5Lmxlbmd0aCAtIDEsXG4gICAgICAgIDAsXG4gICAgICAgIFt2YWx1ZV0sXG4gICAgICAgIFtdXG4gICAgICApO1xuICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICBzZWxmLm5vdGlmeUFycmF5Q2hhbmdlZChuZXdBcnJheSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbmV3QXJyYXkudW5zaGlmdCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnVuc2hpZnQuY2FsbChcbiAgICAgICAgbmV3QXJyYXksXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG9uUHVzaCkgb25QdXNoKHZhbHVlLCBuZXdBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMoMCwgMCwgW3ZhbHVlXSwgW10pO1xuICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICBzZWxmLm5vdGlmeUFycmF5Q2hhbmdlZChuZXdBcnJheSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbmV3QXJyYXkucG9wID0gZnVuY3Rpb24oKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnBvcC5jYWxsKG5ld0FycmF5KTtcbiAgICAgIGlmIChvblJlbW92ZSkgb25SZW1vdmUocmVzdWx0KTtcbiAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMobmV3QXJyYXkubGVuZ3RoIC0gMSwgMSwgW10sIFtdKTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnNwbGljZSA9IGZ1bmN0aW9uKFxuICAgICAgc3RhcnQ/OiBudW1iZXIsXG4gICAgICBkZWxldGVDb3VudD86IG51bWJlcixcbiAgICAgIC4uLml0ZW1zOiBhbnlbXVxuICAgICk6IGFueVtdIHtcbiAgICAgIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgICAgIGlmICghZGVsZXRlQ291bnQpIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnNwbGljZS5jYWxsKFxuICAgICAgICBuZXdBcnJheSxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBpZiAob25SZW1vdmUgJiYgcmVzdWx0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb25SZW1vdmUocmVzdWx0W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9uUHVzaCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb25QdXNoKGl0ZW1zW2ldLCBzdGFydCArIGkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMoc3RhcnQsIGRlbGV0ZUNvdW50LCBpdGVtcywgcmVzdWx0KTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG4gIHByb3RlY3RlZCBnZXRJdGVtVmFsdWVUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0QXJyYXkoXG4gICAgc3JjOiBhbnlbXSxcbiAgICBkZXN0OiBhbnlbXSxcbiAgICBpc0l0ZW1WYWx1ZXM6IGJvb2xlYW4sXG4gICAgb25QdXNoOiBhbnlcbiAgKSB7XG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNyYykuc3BsaWNlLmNhbGwoc3JjLCAwLCBzcmMubGVuZ3RoKTtcbiAgICAvL3NyYy5zcGxpY2UoMCwgc3JjLmxlbmd0aCk7XG4gICAgLy8gICAgc3JjLmxlbmd0aCA9IDA7XG4gICAgaWYgKCFkZXN0KSB7XG4gICAgICB0aGlzLm5vdGlmeUFycmF5Q2hhbmdlZChzcmMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gZGVzdFtpXTtcbiAgICAgIGlmIChpc0l0ZW1WYWx1ZXMpIHtcbiAgICAgICAgaWYgKCEhQmFzZS5jcmVhdGVJdGVtVmFsdWUpIHtcbiAgICAgICAgICBpdGVtID0gQmFzZS5jcmVhdGVJdGVtVmFsdWUoaXRlbSwgdGhpcy5nZXRJdGVtVmFsdWVUeXBlKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3JjKS5wdXNoLmNhbGwoc3JjLCBpdGVtKTtcbiAgICAgIC8vc3JjW1wib3JpZ2lvbmFsUHVzaFwiXS5hcHBseShzcmMsIFtpdGVtXSk7XG4gICAgICBpZiAob25QdXNoKSBvblB1c2goc3JjW2ldKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlBcnJheUNoYW5nZWQoc3JjKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNUd29WYWx1ZUVxdWFscyhcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGNhc2VJblNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChjYXNlSW5TZW5zaXRpdmUpIHtcbiAgICAgIHggPSB0aGlzLmdldFZhbHVlSW5Mb3dDYXNlKHgpO1xuICAgICAgeSA9IHRoaXMuZ2V0VmFsdWVJbkxvd0Nhc2UoeSk7XG4gICAgfVxuICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeCwgeSk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY29weU9iamVjdChkc3Q6IGFueSwgc3JjOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICB2YXIgc291cmNlID0gc3JjW2tleV07XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBzb3VyY2UgPSB7fTtcbiAgICAgICAgdGhpcy5jb3B5T2JqZWN0KHNvdXJjZSwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgZHN0W2tleV0gPSBzb3VyY2U7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjb3B5Q3NzQ2xhc3NlcyhkZXN0OiBhbnksIHNvdXJjZTogYW55KSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGRlc3RbXCJyb290XCJdID0gc291cmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBTdXJ2ZXlFbGVtZW50LmNvcHlPYmplY3QoZGVzdCwgc291cmNlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUluTG93Q2FzZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCEhdmFsICYmIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFycmF5Q2hhbmdlcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpbmRleDogbnVtYmVyLFxuICAgIHB1YmxpYyBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIHB1YmxpYyBpdGVtc1RvQWRkOiBhbnlbXSxcbiAgICBwdWJsaWMgZGVsZXRlZEl0ZW1zOiBhbnlbXVxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFcnJvciB7XG4gIHByaXZhdGUgbG9jVGV4dFZhbHVlOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgcHVibGljIHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdGV4dDogc3RyaW5nID0gbnVsbCxcbiAgICBwcm90ZWN0ZWQgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge31cbiAgcHVibGljIGdldCBsb2NUZXh0KCkge1xuICAgIGlmICghdGhpcy5sb2NUZXh0VmFsdWUpIHtcbiAgICAgIHRoaXMubG9jVGV4dFZhbHVlID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMuZXJyb3JPd25lciwgdHJ1ZSk7XG4gICAgICB0aGlzLmxvY1RleHRWYWx1ZS50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvY1RleHRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLnRleHQ7XG4gICAgaWYgKCFyZXMpIHJlcyA9IHRoaXMuZ2V0RGVmYXVsdFRleHQoKTtcbiAgICBpZiAoISF0aGlzLmVycm9yT3duZXIpIHtcbiAgICAgIHJlcyA9IHRoaXMuZXJyb3JPd25lci5nZXRFcnJvckN1c3RvbVRleHQocmVzLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYmFzZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50IGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElTdXJ2ZXlFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdXJ2ZXlJbXBsVmFsdWU6IElTdXJ2ZXlJbXBsO1xuICBwcml2YXRlIHN1cnZleURhdGFWYWx1ZTogSVN1cnZleURhdGE7XG4gIHByaXZhdGUgc3VydmV5VmFsdWU6IElTdXJ2ZXk7XG4gIHByaXZhdGUgdGV4dFByb2Nlc3NvclZhbHVlOiBJVGV4dFByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlOiBTdXJ2ZXlFbGVtZW50ID0gdGhpcztcbiAgcHVibGljIHJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBzdGF0aWMgU2Nyb2xsRWxlbWVudFRvVG9wKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmICghZWwgfHwgIWVsLnNjcm9sbEludG9WaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgaWYgKGVsZW1Ub3AgPCAwKSBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBlbGVtVG9wIDwgMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHM6IGFueSkge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiN0ZXh0XCIgJiYgZWxlbWVudHNbaV0ubm9kZU5hbWUgIT0gXCIjY29tbWVudFwiKVxuICAgICAgICByZXR1cm4gZWxlbWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgRm9jdXNFbGVtZW50KGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlcnJvcnNcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1JlYWRPbmx5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHRoaXMuc3VydmV5SW1wbFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLnN1cnZleUltcGxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5RGF0YVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2VTdXJ2ZXlEYXRhKCk7XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHRoaXMuc3VydmV5SW1wbFZhbHVlLmdldFN1cnZleSgpO1xuICAgIHRoaXMudGV4dFByb2Nlc3NvclZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0VGV4dFByb2Nlc3NvcigpO1xuICAgIHRoaXMub25TZXREYXRhKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlJbXBsKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleUltcGxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzLnN1cnZleURhdGFWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIGlmICghIXRoaXMuc3VydmV5VmFsdWUpIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICAgIGlmICghIXRoaXMuc3VydmV5SW1wbFZhbHVlKSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc7XG4gIH1cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSBhbiBlbGVtZW50IHF1ZXN0aW9uL3BhbmVsL3BhZ2UgcmVhZG9ubHkuXG4gICAqIEBzZWUgZW5hYmxlSWZcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZWFkT25seVwiLCB0aGlzLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgaWYgKCEhdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaykge1xuICAgICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmlzTG9hZGluZ0Zyb21Kc29uIDogZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgYSBzdXJ2ZXkgZWxlbWVudCAtIHF1ZXN0aW9uIG9yIHBhbmVsLlxuICAgKiBAc2VlIHZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgISFvbGRWYWx1ZSkge1xuICAgICAgdGhpcy5vbk5hbWVDaGFuZ2VkKG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge31cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVycm9ycy4gSXQgaXMgY3JlYXRlZCBieSBjYWxsaWcgaGFzRXJyb3JzIGZ1bmN0aW9uc1xuICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGdldCBlcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXJyb3JzKHZhbDogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHF1ZXN0aW9uIG9yIGEgY29udGFpbmVyIChwYW5lbC9wYWdlKSBvciB0aGVpciBjaGlkcmVuIGhhdmUgYW4gZXJyb3IuXG4gICAqIFRoZSB2YWx1ZSBjYW4gYmUgb3V0IG9mIGRhdGUuIGhhc0Vycm9ycyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29udGFpbnNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ29udGFpbnNFcnJvcnMoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGFpbnNFcnJvcnNcIiwgdGhpcy5nZXRDb250YWluc0Vycm9ycygpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29udGFpbnNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDA7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnbigpOiBTdXJ2ZXlFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24odmFsOiBTdXJ2ZXlFbGVtZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge31cblxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge31cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBmYWxzZSBpZiBpdCBpcyBub3QgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkZWxldGUoKSB7fVxuICBwcm90ZWN0ZWQgcmVtb3ZlU2VsZkZyb21MaXN0KGxpc3Q6IEFycmF5PGFueT4pIHtcbiAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSBsaXN0LmluZGV4T2YodGhpcyk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwgfHwgIXRoaXMudGV4dFByb2Nlc3NvcikgcmV0dXJuIGh0bWw7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dChodG1sLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge31cbiAgcHJvdGVjdGVkIGdldFBhZ2UocGFyZW50OiBJUGFuZWwpOiBJUGFnZSB7XG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmdldFR5cGUoKSA9PSBcInBhZ2VcIikgcmV0dXJuIDxJUGFnZT4oPGFueT5wYXJlbnQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBtb3ZlVG9CYXNlKFxuICAgIHBhcmVudDogSVBhbmVsLFxuICAgIGNvbnRhaW5lcjogSVBhbmVsLFxuICAgIGluc2VydEJlZm9yZTogYW55ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuICAgIHBhcmVudC5yZW1vdmVFbGVtZW50KDxJRWxlbWVudD4oPGFueT50aGlzKSk7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgaWYgKEhlbHBlcnMuaXNOdW1iZXIoaW5zZXJ0QmVmb3JlKSkge1xuICAgICAgaW5kZXggPSBwYXJzZUludChpbnNlcnRCZWZvcmUpO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPT0gLTEgJiYgISFpbnNlcnRCZWZvcmUgJiYgISFpbnNlcnRCZWZvcmUuZ2V0VHlwZSkge1xuICAgICAgaW5kZXggPSBjb250YWluZXIuaW5kZXhPZihpbnNlcnRCZWZvcmUpO1xuICAgIH1cbiAgICBjb250YWluZXIuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRQYWdlKHBhcmVudDogSVBhbmVsLCB2YWw6IElQYWdlKSB7XG4gICAgdmFyIG9sZFBhZ2UgPSB0aGlzLmdldFBhZ2UocGFyZW50KTtcbiAgICBpZiAob2xkUGFnZSA9PT0gdmFsKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpKTtcbiAgICBpZiAodmFsKSB7XG4gICAgICB2YWwuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIC0xKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4ge1xuICBwcm90ZWN0ZWQgY2FsbGJhY2tzOiBBcnJheTxUPjtcbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcyA9PSBudWxsIHx8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBmaXJlKHNlbmRlcjogYW55LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FsbFJlc3VsdCA9IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBhZGQoZnVuYzogVCkge1xuICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHJldHVybjtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8VD4oKTtcbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApO1xuICAgICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Z1bmMoZnVuYzogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoZnVuYywgMCkgPiAtMTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Jhc2UudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBJRWxlbWVudCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5cbi8vVE9ETyByZXBsYWNlIGNvbXBsZXRlbHkgd2l0aCBFbGVtZW50RmFjdG9yeVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFF1ZXN0aW9uRmFjdG9yeSA9IG5ldyBRdWVzdGlvbkZhY3RvcnkoKTtcbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENob2ljZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIxXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIyXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIzXCJcbiAgICBdO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IERlZmF1bHRDb2x1bXMoKTogc3RyaW5nW10ge1xuICAgIHZhciBjb2xOYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9jb2x1bW5cIikgKyBcIiBcIjtcbiAgICByZXR1cm4gW2NvbE5hbWUgKyBcIjFcIiwgY29sTmFtZSArIFwiMlwiLCBjb2xOYW1lICsgXCIzXCJdO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IERlZmF1bHRSb3dzKCk6IHN0cmluZ1tdIHtcbiAgICB2YXIgcm93TmFtZSA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfcm93XCIpICsgXCIgXCI7XG4gICAgcmV0dXJuIFtyb3dOYW1lICsgXCIxXCIsIHJvd05hbWUgKyBcIjJcIl07XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdG9ySGFzaDogSGFzaFRhYmxlPChuYW1lOiBzdHJpbmcpID0+IFF1ZXN0aW9uPiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlclF1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uQ3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb25cbiAgKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdID0gcXVlc3Rpb25DcmVhdG9yO1xuICB9XG4gIHB1YmxpYyB1bnJlZ2lzdGVyRWxlbWVudChlbGVtZW50VHlwZTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoID0ge307XG4gIH1cbiAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNyZWF0b3JIYXNoKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcbiAgfVxuICBwdWJsaWMgY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXTtcbiAgICBpZiAoY3JlYXRvciA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gY3JlYXRvcihuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudEZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBFbGVtZW50RmFjdG9yeSA9IG5ldyBFbGVtZW50RmFjdG9yeSgpO1xuICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gSUVsZW1lbnQ+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyRWxlbWVudChcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nLFxuICAgIGVsZW1lbnRDcmVhdG9yOiAobmFtZTogc3RyaW5nKSA9PiBJRWxlbWVudFxuICApIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXSA9IGVsZW1lbnRDcmVhdG9yO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoID0ge307XG4gIH1cbiAgcHVibGljIHVucmVnaXN0ZXJFbGVtZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgcmVtb3ZlRnJvbVNlcmlhbGl6ZXI6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBkZWxldGUgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV07XG4gICAgUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnVucmVnaXN0ZXJFbGVtZW50KGVsZW1lbnRUeXBlKTtcbiAgICBpZiAocmVtb3ZlRnJvbVNlcmlhbGl6ZXIpIHtcbiAgICAgIFNlcmlhbGl6ZXIucmVtb3ZlQ2xhc3MoZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5nZXRBbGxUeXBlcygpO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNyZWF0b3JIYXNoKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcbiAgfVxuICBwdWJsaWMgY3JlYXRlRWxlbWVudChlbGVtZW50VHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBJRWxlbWVudCB7XG4gICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgICBpZiAoY3JlYXRvciA9PSBudWxsKVxuICAgICAgcmV0dXJuIFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihlbGVtZW50VHlwZSwgbmFtZSk7XG4gICAgcmV0dXJuIGNyZWF0b3IobmFtZSk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbmZhY3RvcnkudHMiLCIvKipcbiAqIEdsb2JhbCBzdXJ2ZXkgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IHZhciBzZXR0aW5ncyA9IHtcbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdGhhdCB1c2VzIHRvIHN0b3JlIHRoZSBxdWVzdGlvbiBjb21tZW50LCBhcyB7cXVlc3Rpb25OYW1lfSArIHtjb21tZW50UHJlZml4fS5cbiAgICogVGhlIGRlZmF1bHRcbiAgICovXG4gIGNvbW1lbnRQcmVmaXg6IFwiLUNvbW1lbnRcIixcbiAgLyoqXG4gICAqIEVuY29kZSBwYXJhbWV0ZXIgb24gY2FsbGluZyByZXN0ZnVsbCB3ZWIgQVBJXG4gICAqL1xuICB3ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVyczogdHJ1ZSxcbiAgLyoqXG4gICAqIFN1cnZleUpTIHdlYiBzZXJ2aWNlIEFQSSB1cmxcbiAgICovXG4gIHN1cnZleVNlcnZpY2VVcmw6IFwiaHR0cHM6Ly9keHN1cnZleWFwaS5henVyZXdlYnNpdGVzLm5ldC9hcGkvU3VydmV5XCIsXG4gIC8qKlxuICAgKiBzZXBhcmF0b3IgdGhhdCBjYW4gYWxsb3cgdG8gc2V0IHZhbHVlIGFuZCB0ZXh0IG9mIEl0ZW1WYWx1ZSBvYmplY3QgaW4gb25lIHN0cmluZyBhczogXCJ2YWx1ZXx0ZXh0XCJcbiAgICovXG4gIGl0ZW1WYWx1ZVNlcGFyYXRvcjogXCJ8XCIsXG4gIC8qKlxuICAgKiBkZWZhdWx0IGxvY2FsZSBuYW1lIGZvciBsb2NhbGl6YWJsZSBzdHJpbmdzIHRoYXQgdXNlcyBkdXJpbmcgc2VyaWFsaXphdGlvbiwge1wiZGVmYXVsdFwiOiBcIk15IHRleHRcIiwgXCJkZVwiOiBcIk1laW4gVGV4dFwifVxuICAgKi9cbiAgZGVmYXVsdExvY2FsZU5hbWU6IFwiZGVmYXVsdFwiLFxuICAvKipcbiAgICogRGVmYXVsdCByb3cgbmFtZSBmb3IgbWF0cml4IChzaW5nbGUgY2hvaWNlKVxuICAgKi9cbiAgbWF0cml4RGVmYXVsdFJvd05hbWU6IFwiZGVmYXVsdFwiLFxuICAvKipcbiAgICogRGVmYXVsdCBjZWxsIHR5cGUgZm9yIGRyb3Bkb3duIGFuZCBkeW5hbWljIG1hdHJpY2VzXG4gICAqL1xuICBtYXRyaXhEZWZhdWx0Q2VsbFR5cGU6IFwiZHJvcGRvd25cIixcbiAgLyoqXG4gICAqIFRvdGFsIHZhbHVlIHBvc3RmaXggZm9yIGRyb3Bkb3duIGFuZCBkeW5hbWljIG1hdHJpY2VzLiBUaGUgdG90YWwgdmFsdWUgc3RvcmVzIGFzOiB7bWF0cml4TmFtZX0gKyB7cG9zdGZpeH1cbiAgICovXG4gIG1hdHJpeFRvdGFsVmFsdWVQb3N0Rml4OiBcIi10b3RhbFwiLFxuICAvKipcbiAgICogTWF4aW11bSByb3cgY291bnQgaW4gZHluYW1pYyBtYXRyaXhcbiAgICovXG4gIG1hdHJpeE1heGltdW1Sb3dDb3VudDogMTAwMCxcbiAgLyoqXG4gICAqIE1heGltdW0gcGFuZWwgY291bnQgaW4gZHluYW1pYyBwYW5lbFxuICAgKi9cbiAgcGFuZWxNYXhpbXVtUGFuZWxDb3VudDogMTAwLFxuICAvKipcbiAgICogTWF4aW11bSByYXRlIHZhbHVlIGNvdW50IGluIHJhdGluZyBxdWVzdGlvblxuICAgKi9cbiAgcmF0aW5nTWF4aW11bVJhdGVWYWx1ZUNvdW50OiAyMCxcbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIHF1ZXN0aW9uIHdoaWxlIGNob2ljZXMgYXJlIGdldHRpbmcgZnJvbSB0aGUgd2ViIHNlcnZpY2VcbiAgICovXG4gIGRpc2FibGVPbkdldHRpbmdDaG9pY2VzRnJvbVdlYjogZmFsc2Vcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtcbiAgU3VydmV5RXJyb3IsXG4gIFN1cnZleUVsZW1lbnQsXG4gIElFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIElQYW5lbCxcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlLFxuICBFdmVudFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBBbnN3ZXJSZXF1aXJlZEVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IFN1cnZleVZhbGlkYXRvciwgSVZhbGlkYXRvck93bmVyLCBWYWxpZGF0b3JSdW5uZXIgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCB7IFRleHRQcmVQcm9jZXNzb3IsIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkN1c3RvbVdpZGdldCB9IGZyb20gXCIuL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuaW1wb3J0IHsgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb25kaXRpb25PYmplY3Qge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgcXVlc3Rpb246IFF1ZXN0aW9uO1xufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uIGV4dGVuZHMgU3VydmV5RWxlbWVudFxuICBpbXBsZW1lbnRzIElRdWVzdGlvbiwgSUNvbmRpdGlvblJ1bm5lciwgSUxvY2FsaXphYmxlT3duZXIsIElWYWxpZGF0b3JPd25lciB7XG4gIFtpbmRleDogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBUZXh0UHJlcHJvY2Vzc29yVmFsdWVzTWFwID0ge1xuICAgIHRpdGxlOiBcInByb2Nlc3NlZFRpdGxlXCIsXG4gICAgcmVxdWlyZTogXCJyZXF1aXJlZFRleHRcIlxuICB9O1xuICBwcml2YXRlIHN0YXRpYyBxdWVzdGlvbkNvdW50ZXIgPSAxMDA7XG4gIHByaXZhdGUgc3RhdGljIGdldFF1ZXN0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcV9cIiArIFF1ZXN0aW9uLnF1ZXN0aW9uQ291bnRlcisrO1xuICB9XG4gIHByaXZhdGUgY29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXIgPSBudWxsO1xuICBwcml2YXRlIGlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgY3VzdG9tV2lkZ2V0VmFsdWU6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0O1xuICBjdXN0b21XaWRnZXREYXRhID0geyBpc05lZWRSZW5kZXI6IHRydWUgfTtcbiAgZm9jdXNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgc3VydmV5TG9hZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25FbmFiZWxSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25SZXF1aXJlZFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29tbWVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdmFsaWRhdGVWYWx1ZUNhbGxiYWNrOiAoKSA9PiBTdXJ2ZXlFcnJvcjtcbiAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2s6ICgpID0+IHN0cmluZztcbiAgcHJpdmF0ZSBsb2NQcm9jZXNzZWRUaXRsZTogTG9jYWxpemFibGVTdHJpbmc7XG4gIHByb3RlY3RlZCBpc1JlYWR5VmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBpc1JlYWR5IHByb3BlcnR5IG9mIHF1ZXN0aW9uIGlzIGNoYW5nZWQuXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5pc1JlYWR5IC0gY3VycmVudCB2YWx1ZSBvZiBpc1JlYWR5XG4gICAqIDxici8+IG9wdGlvbnMub2xkSXNSZWFkeSAtIG9sZCB2YWx1ZSBvZiBpc1JlYWR5XG4gICAqL1xuICBwdWJsaWMgb25SZWFkeUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5pZCA9IFF1ZXN0aW9uLmdldFF1ZXN0aW9uSWQoKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbGlkYXRvcnNcIiwgZnVuY3Rpb24odmFsaWRhdG9yOiBhbnkpIHtcbiAgICAgIHZhbGlkYXRvci5lcnJvck93bmVyID0gc2VsZjtcbiAgICB9KTtcbiAgICB2YXIgbG9jVGl0bGVWYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICBsb2NUaXRsZVZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgdmFyIHJlcyA9IHNlbGYuY2FsY0Z1bGxUaXRsZSh0ZXh0KTtcbiAgICAgIGlmICghc2VsZi5zdXJ2ZXkpIHJldHVybiByZXM7XG4gICAgICByZXR1cm4gc2VsZi5zdXJ2ZXkuZ2V0VXBkYXRlZFF1ZXN0aW9uVGl0bGUodGhpcywgcmVzKTtcbiAgICB9O1xuICAgIHRoaXMubG9jUHJvY2Vzc2VkVGl0bGUgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5sb2NQcm9jZXNzZWRUaXRsZS5zaGFyZWREYXRhID0gbG9jVGl0bGVWYWx1ZTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIiwgdGhpcywgdHJ1ZSk7XG4gICAgdmFyIGxvY0NvbW1lbnRUZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsb2NDb21tZW50VGV4dC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIik7XG4gICAgfTtcblxuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwid2lkdGhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoISFzZWxmLnBhcmVudCkge1xuICAgICAgICBzZWxmLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHNlbGYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImluZGVudFwiLCBcInJpZ2h0SW5kZW50XCJdLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25JbmRlbnRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImhhc0NvbW1lbnRcIiwgXCJoYXNPdGhlclwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmluaXRDb21tZW50RnJvbVN1cnZleSgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gdGhpcy52YWx1ZU5hbWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSBpZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgcXVlc3Rpb24gcmVzdWx0IGluIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKiBRdWVzdGlvbiBuYW1lIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHN1cnZleSBhbmQgdmFsdWVOYW1lIGNvdWxkIGJlIG5vdCB1bmlxdWUuIEl0IGFsbG93cyB0byBzaGFyZSBkYXRhIGJldHdlZW4gc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSB2YWx1ZU5hbWUuXG4gICAqIFRoZSBsaWJyYXJ5IHNldCB0aGUgdmFsdWUgYXV0b21hdGljYWxseSBpZiB0aGUgcXVlc3Rpb24ubmFtZSBwcm9wZXJ0eSBpcyBub3QgdmFsaWQuIEZvciBleGFtcGxlLCBpZiBpdCBjb250YWlucyB0aGUgcGVyaW9kICcuJyBzeW1ib2wuXG4gICAqIEluIHRoaXMgY2FzZSBpZiB5b3Ugc2V0IHRoZSBxdWVzdGlvbi5uYW1lIHByb3BlcnR5IHRvICd4LnknIHRoZW4gdGhlIHZhbHVlTmFtZSBiZWNvbWVzICd4IHknLlxuICAgKiBAc2VlIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHZhciBvbGRWYWx1ZU5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZSgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICAgIHRoaXMub25WYWx1ZU5hbWVDaGFuZ2VkKG9sZFZhbHVlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVOYW1lQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVuYW1lZChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICAhIW9sZFZhbHVlID8gb2xkVmFsdWUgOiB0aGlzLm5hbWVcbiAgICApO1xuICAgIHRoaXMuaW5pdERhdGFGcm9tU3VydmV5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5xdWVzdGlvblJlbmFtZWQoXG4gICAgICB0aGlzLFxuICAgICAgb2xkVmFsdWUsXG4gICAgICB0aGlzLnZhbHVlTmFtZSA/IHRoaXMudmFsdWVOYW1lIDogb2xkVmFsdWVcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlYWR5VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBpcyBxdWVzdGlvbiByZWFkeSB0byB1c2VcbiAgICovXG4gIHB1YmxpYyBjaG9pY2VzTG9hZGVkKCk6IHZvaWQge31cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhZ2Ugd2hlcmUgdGhlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2UoKTogSVBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UodGhpcy5wYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZSh2YWw6IElQYWdlKSB7XG4gICAgdGhpcy5zZXRQYWdlKHRoaXMucGFyZW50LCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgaWYgKCEhdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZkZyb21MaXN0KHRoaXMucGFyZW50LmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpc0Zsb3dMYXlvdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF5b3V0VHlwZSgpID09PSBcImZsb3dcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TGF5b3V0VHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk7XG4gICAgcmV0dXJuIFwicm93XCI7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsYXlvdXRUeXBlICE9PSBcImZsb3dcIjtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGdldC9zZXQgdGhlIHF1ZXN0aW9uIHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwgPT0gdGhpcy52aXNpYmxlKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCg8SVF1ZXN0aW9uPnRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmVycm9ycyAmJiB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGNob29zZSBob3cgb3RoZXIgcXVlc3Rpb24gdmFsdWVzIHdpbGwgYmUgcmVuZGVyZWQgaW4gdGl0bGUgaWYgcmVmZXJlbmNlZCBpbiB7fS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdXNlRGlzcGxheVZhbHVlc0luVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlRGlzcGxheVZhbHVlc0luVGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHZpc2libGUgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UgdGhlIFF1ZXN0aW9uIGJlY29tZXMgaW52aXNpYmxlLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gdmlzaWJsZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHZpc2libGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGlzIHZpc2libGUgb3Igc3VydmV5IGlzIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGUgfHwgdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZpc2libGUgaW5kZXggb2YgdGhlIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuIEl0IGNhbiBiZSBmcm9tIDAgdG8gYWxsIHZpc2libGUgcXVlc3Rpb25zIGNvdW50IC0gMVxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIC0xKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBtYXkgaGF2ZSBhIHRpdGxlIGxvY2F0ZWQgb24gdGhlIGxlZnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nIGFzIGl0IHJlcHJlc2VudHMgaW4gdGhlIGpzb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgLyoqXG4gICAqIE1vdmUgcXVlc3Rpb24gdG8gYSBuZXcgY29udGFpbmVyIFBhZ2UvUGFuZWwuIEFkZCBhcyBhIGxhc3QgZWxlbWVudCBpZiBpbnNlcnRCZWZvcmUgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIG9yIGluc2VydGVkIGludG8gdGhlIGdpdmVuIGluZGV4LFxuICAgKiBpZiBpbnNlcnQgcGFyYW1ldGVyIGlzIG51bWJlciwgb3IgYmVmb3JlIHRoZSBnaXZlbiBlbGVtZW50LCBpZiB0aGUgaW5zZXJ0QmVmb3JlIHBhcmFtZXRlciBpcyBhIHF1ZXN0aW9uIG9yIHBhbmVsXG4gICAqIEBwYXJhbSBjb250YWluZXIgUGFnZSBvciBQYW5lbCB0byB3aGVyZSBhIHF1ZXN0aW9uIGlzIHJlbG9jYXRlZC5cbiAgICogQHBhcmFtIGluc2VydEJlZm9yZSBVc2UgaXQgaWYgeW91IHdhbnQgdG8gc2V0IHRoZSBxdWVzdGlvbiB0byBhIHNwZWNpZmljIHBvc2l0aW9uLiBZb3UgbWF5IHVzZSBhIG51bWJlciAodXNlIDAgdG8gaW5zZXJ0IGludCB0aGUgYmVnaW5uaW5nKSBvciBlbGVtZW50LCBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYmVmb3JlIHRoaXMgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBtb3ZlVG8oY29udGFpbmVyOiBJUGFuZWwsIGluc2VydEJlZm9yZTogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vdmVUb0Jhc2UodGhpcy5wYXJlbnQsIGNvbnRhaW5lciwgaW5zZXJ0QmVmb3JlKTtcbiAgfVxuXG4gIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcbiAgICBpZiAodGhpcy5kYXRhICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmICF0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5ydW5Db25kaXRpb24oXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlICYmICF0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIHB1YmxpYyBnZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCkgOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBjYW4gYmUgcGFuZWwgb3IgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IElQYW5lbCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpO1xuICAgIHRoaXMub25QYXJlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUGFyZW50Q2hhbmdlZCgpIHt9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYSB0aXRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsLCBvciB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGVxdWFscyB0byBcImhpZGRlblwiXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgIT09IFwiaGlkZGVuXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoaXMgcGFuZWwvcGFnZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGlzVmlzaWJpbGl0eUNoYW5nZWQgPVxuICAgICAgdGhpcy50aXRsZUxvY2F0aW9uID09IFwiaGlkZGVuXCIgfHwgdmFsdWUgPT0gXCJoaWRkZW5cIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChpc1Zpc2liaWxpdHlDaGFuZ2VkICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRpdGxlIGxvY2F0aW9uIGJhc2VkIG9uIHF1ZXN0aW9uIHRpdGxlTG9jYXRpb24gcHJvcGVydHkgYW5kIFF1ZXN0aW9uVGl0bGVMb2NhdGlvbiBvZiBpdCdzIHBhcmVudHNcbiAgICogQHNlZSB0aXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgUGFuZWxNb2RlbEJhc2UuUXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuUXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0VGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRmxvd0xheW91dCkgcmV0dXJuIFwiaGlkZGVuXCI7XG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5nZXRUaXRsZUxvY2F0aW9uQ29yZSgpO1xuICAgIGlmIChsb2NhdGlvbiA9PT0gXCJsZWZ0XCIgJiYgIXRoaXMuaXNBbGxvd1RpdGxlTGVmdCkgbG9jYXRpb24gPSBcInRvcFwiO1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50aXRsZUxvY2F0aW9uICE9PSBcImRlZmF1bHRcIikgcmV0dXJuIHRoaXMudGl0bGVMb2NhdGlvbjtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgIHJldHVybiBcInRvcFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZSAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJsZWZ0XCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwidG9wXCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwiYm90dG9tXCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25MZWZ0VG9wKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNUaXRsZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiBsb2NhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgbG9jYXRpb24gPT09IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBlcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uIDogXCJ0b3BcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcXVlc3Rpb24gZG9lc24ndCBoYXZlIGFuIGlucHV0IGVsZW1lbnQsIGZvciBleGFtcGxlOiBRdWVzdGlvbkh0bWxNb2RlbFxuICAgKi9cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZCArIFwiaVwiO1xuICB9XG4gIC8qKlxuICAgKiBRdWVzdGlvbiB0aXRsZS4gVXNlIHN1cnZleSBxdWVzdGlvblRpdGxlVGVtcGxhdGUgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSB0aXRsZSBxdWVzdGlvbiBpcyByZW5kZXJlZC4gSWYgaXQgaXMgZW1wdHksIHRoZW4gcXVlc3Rpb24gbmFtZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHRoaXMubmFtZSk7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIGRlc2NyaXB0aW9uLiBJdCByZW5kZXJzIHVuZGVyIHF1ZXN0aW9uIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIGRlc2NyaXB0aW9uIGxvY2F0aW9uLiBCeSBkZWZhdWx0LCB2YWx1ZSBpcyBcImRlZmF1bHRcIiBhbmQgaXQgZGVwZW5kcyBvbiBzdXJ2ZXkgcXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uIHByb3BlcnR5XG4gICAqIFlvdSBtYXkgY2hhbmdlIGl0IHRvIFwidW5kZXJJbnB1dFwiIHRvIHJlbmRlciBpdCB1bmRlciBxdWVzdGlvbiBpbnB1dCBvciBcInVuZGVyVGl0bGVcIiB0byByZW5kZXJlZCBpdCB1bmRlciB0aXRsZS5cbiAgICogQHNlZSBkZXNjcmlwdGlvblxuICAgKiBAc2VlIFN1cnZleS5xdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb25Mb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZXNjcmlwdGlvbkxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb25Mb2NhdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlc2NyaXB0aW9uTG9jYXRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgaGFzRGVzY3JpcHRpb25VbmRlclRpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0aW9uTG9jYXRpb24oKSA9PSBcInVuZGVyVGl0bGVcIjtcbiAgfVxuICBnZXQgaGFzRGVzY3JpcHRpb25VbmRlcklucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0aW9uTG9jYXRpb24oKSA9PSBcInVuZGVySW5wdXRcIjtcbiAgfVxuICBwcml2YXRlIGdldERlc2NyaXB0aW9uTG9jYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb25Mb2NhdGlvbiAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uTG9jYXRpb247XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXlcbiAgICAgID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXG4gICAgICA6IFwidW5kZXJUaXRsZVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIG9uIHJlcXVpcmVkIGVycm9yLiBVc2UgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNob3cgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NSZXF1aXJlZEVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGdldCBvciBzZXQgdGhlIGNvbW1lbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb21tZW50VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbW1lbnRUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0NvbW1lbnRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbW1lbnRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29weSBvZiBxdWVzdGlvbiBlcnJvcnMgc3VydmV5LiBGb3Igc29tZSBxdWVzdGlvbnMgbGlrZSBtYXRyaXggYW5kIHBhbmVsIGR5bmFtaWMgaXQgaW5jbHVkZXMgdGhlIGVycm9ycyBvZiBuZXN0ZWQgcXVlc3Rpb25zLlxuICAgKi9cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5zbGljZSgpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGluayB0byB0aGUgY3VzdG9tIHdpZGdldC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VzdG9tV2lkZ2V0KCk6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IHtcbiAgICBpZiAoIXRoaXMuaXNDdXN0b21XaWRnZXRSZXF1ZXN0ZWQgJiYgIXRoaXMuY3VzdG9tV2lkZ2V0VmFsdWUpIHtcbiAgICAgIHRoaXMuaXNDdXN0b21XaWRnZXRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tV2lkZ2V0VmFsdWU7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUN1c3RvbVdpZGdldCgpIHtcbiAgICB0aGlzLmN1c3RvbVdpZGdldFZhbHVlID0gQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXN0b21XaWRnZXQoXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVuZHJlZCBxdWVzdGlvbiB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMubG9jUHJvY2Vzc2VkVGl0bGUudGV4dE9ySHRtbDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBhZnRlciBwcm9jZXNzaW5nIHRoZSBxdWVzdGlvbiB0ZW1wbGF0ZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlVGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZnVsbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICAgIC8qXG4gICAgdmFyIHJlcyA9IHRoaXMuY2FsY0Z1bGxUaXRsZSgpO1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiByZXM7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmdldFVwZGF0ZWRRdWVzdGlvblRpdGxlKHRoaXMsIHJlcyk7XG4gICAgKi9cbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhbGxiYWNrKVxuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2soKTtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmdldFF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIGNhbGNGdWxsVGl0bGUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgdGl0bGVUZW1wbGF0ZSA9IHRoaXMuZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk7XG4gICAgaWYgKHRpdGxlVGVtcGxhdGUpIHtcbiAgICAgIGlmICghdGhpcy50ZXh0UHJlUHJvY2Vzc29yKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgICAgIHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlXG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3MoXG4gICAgICAgIHRpdGxlVGVtcGxhdGUsXG4gICAgICAgIHRoaXMudXNlRGlzcGxheVZhbHVlc0luVGl0bGVcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGV4dCkge1xuICAgICAgdGV4dCA9IHRoaXMubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBRdWVzdGlvbiByZW5kZXJzIG9uIHRoZSBuZXcgbGluZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGZhbHNlLCB0aGUgcXVlc3Rpb24gdHJpZXMgdG8gcmVuZGVyIG9uIHRoZSBzYW1lIGxpbmUvcm93IHdpdGggYSBwcmV2aW91cyBxdWVzdGlvbi9wYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRXaXRoTmV3TGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0V2l0aE5ld0xpbmUodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc3RhcnRXaXRoTmV3TGluZSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNzcyBjbGFzc2VzIHRoYXQgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSBxdWVzdGlvbi4gWW91IG1heSB1c2Ugc3VydmV5LnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlcyBldmVudCB0byBvdmVycmlkZSBjc3MgY2xhc3NlcyBmb3IgYSBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3NlcygpOiBhbnkge1xuICAgIHZhciBjc3MgPSB0aGlzLmNzcztcbiAgICB2YXIgY2xhc3NlcyA9IHsgZXJyb3I6IHt9IH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLCBjc3MucXVlc3Rpb24pO1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5lcnJvciwgY3NzLmVycm9yKTtcbiAgICB0aGlzLnVwZGF0ZUNzc0NsYXNzZXMoY2xhc3NlcywgY3NzKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcyh0aGlzLCBjbGFzc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgcHVibGljIGdldCBjc3NNYWluUm9vdCgpOiBhbnkge1xuICAgIHZhciBjbGFzc2VzID0gdGhpcy5jc3NDbGFzc2VzO1xuICAgIGlmICghY2xhc3Nlcy5tYWluUm9vdCkgcmV0dXJuIHt9O1xuICAgIHZhciByZXMgPVxuICAgICAgdGhpcy5pc0Zsb3dMYXlvdXQgJiYgIXRoaXMuaXNEZXNpZ25Nb2RlXG4gICAgICAgID8gY2xhc3Nlcy5mbG93Um9vdFxuICAgICAgICA6IGNsYXNzZXMubWFpblJvb3Q7XG4gICAgaWYgKCF0aGlzLmlzRmxvd0xheW91dCAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PSBcImxlZnRcIikge1xuICAgICAgcmVzICs9IFwiIFwiICsgY2xhc3Nlcy50aXRsZUxlZnRSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY2xhc3Nlcy5oYXNFcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um9vdENzcyhjbGFzc2VzOiBhbnkpIHtcbiAgICByZXR1cm4gISFjbGFzc2VzLnF1ZXN0aW9uID8gY2xhc3Nlcy5xdWVzdGlvbi5yb290IDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3NzQ2xhc3NlcyhyZXM6IGFueSwgY3NzOiBhbnkpIHtcbiAgICBpZiAoIWNzcy5xdWVzdGlvbikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgIGlmICghIWNzcy5xdWVzdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICByZXMucm9vdCA9IChyZXMucm9vdCA/IHJlcy5yb290ICsgXCIgXCIgOiBcIlwiKSArIG9iakNzcztcbiAgICAgIH1cbiAgICAgIGlmIChjc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZCkge1xuICAgICAgICByZXMudGl0bGUgKz0gXCIgXCIgKyBjc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9iakNzcyA9IGNzc1t0aGlzLmdldFR5cGUoKV07XG4gICAgaWYgKG9iakNzcyA9PT0gdW5kZWZpbmVkIHx8IG9iakNzcyA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygb2JqQ3NzID09PSBcInN0cmluZ1wiIHx8IG9iakNzcyBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgcmVzLnJvb3QgPSAocmVzLnJvb3QgPyByZXMucm9vdCArIFwiIFwiIDogXCJcIikgKyBvYmpDc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmpDc3MpIHtcbiAgICAgICAgcmVzW2tleV0gPSBvYmpDc3Nba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3NzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5nZXRDc3MoKSA6IHt9O1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIHdpZHRoIG9mIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCByZW5kZXJXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCBkaWZmZXJlbnQgZnJvbSAwIHRvIGluY3JlYXNlIHRoZSBsZWZ0IHBhZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBpbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IGRpZmZlcmVudCBmcm9tIDAgdG8gaW5jcmVhc2UgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJpZ2h0SW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmlnaHRJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW50TGVmdFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW50TGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nUmlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nUmlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIG9uSW5kZW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnJpZ2h0SW5kZW50KTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogdGhpcy5jc3NDbGFzc2VzLmluZGVudCArIFwicHhcIjtcbiAgfVxuICAvKipcbiAgICogTW92ZSB0aGUgZm9jdXMgdG8gdGhlIGlucHV0IG9mIHRoaXMgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBvbkVycm9yIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlLCB0byBmb2N1cyB0aGUgaW5wdXQgd2l0aCB0aGUgZmlyc3QgZXJyb3IsIG90aGVyIHdpc2UgdGhlIGZpcnN0IGlucHV0IHdpbGwgYmUgZm9jdXNlZC5cbiAgICovXG4gIHB1YmxpYyBmb2N1cyhvbkVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLmlkKTtcbiAgICB2YXIgaWQgPSAhb25FcnJvclxuICAgICAgPyB0aGlzLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKVxuICAgICAgOiB0aGlzLmdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpO1xuICAgIGlmIChTdXJ2ZXlFbGVtZW50LkZvY3VzRWxlbWVudChpZCkpIHtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuZm9jdXNDYWxsYmFjayk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBmaXJlQ2FsbGJhY2soY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gIH1cbiAgcHVibGljIGdldE90aGVyc01heExlbmd0aCgpOiBhbnkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXhPdGhlcnNMZW5ndGggPiAwID8gdGhpcy5zdXJ2ZXkubWF4T3RoZXJzTGVuZ3RoIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICB2YXIgbmFtZSA9IHRleHRWYWx1ZS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID1cbiAgICAgIE9iamVjdC5rZXlzKFF1ZXN0aW9uLlRleHRQcmVwcm9jZXNzb3JWYWx1ZXNNYXApLmluZGV4T2YobmFtZSkgIT09IC0xIHx8XG4gICAgICAoPGFueT50aGlzKVt0ZXh0VmFsdWUubmFtZV0gIT09IHVuZGVmaW5lZDtcbiAgICB0ZXh0VmFsdWUudmFsdWUgPSAoPGFueT50aGlzKVtcbiAgICAgICg8YW55PlF1ZXN0aW9uLlRleHRQcmVwcm9jZXNzb3JWYWx1ZXNNYXApW25hbWVdIHx8IHRleHRWYWx1ZS5uYW1lXG4gICAgXTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBxdWVzdGlvbiBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlcXVpcmVkIGFuZCBhbiBlbmQtdXNlciBoYXMgdG8gYW5zd2VyIGl0LlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiB0aGVuIGFuIGVuZC11c2VyIG1heSBub3QgYW5zd2VyIGl0IHRoZSBRdWVzdGlvbiBtYXliZSBlbXB0eS5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSBpc1JlcXVpcmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBhZGQgYSBjb21tZW50IGZvciB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzQ29tbWVudCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydENvbW1lbnQoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5oYXNDb21tZW50KSB0aGlzLmhhc090aGVyID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmljYXRvci4gSXQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpZFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaGFzT3RoZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHt9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZVVwZGF0ZUNvbW1lbnRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNDb21tZW50IHx8IHRoaXMuaGFzT3RoZXI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVucyB0cnVlIGlmIHJlYWRPbmx5IHByb3BlcnR5IGlzIHRydWUgb3Igc3VydmV5IGlzIGluIGRpc3BsYXkgbW9kZSBvciBwYXJlbnQgcGFuZWwvcGFnZSBpcyByZWFkT25seS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tb2RlbFxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVhZE9ubHkoKSB7XG4gICAgdmFyIGlzUGFyZW50UmVhZE9ubHkgPSAhIXRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmlzUmVhZE9ubHk7XG4gICAgdmFyIGlzU3VydmV5UmVhZE9ubHkgPSAhIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGlzcGxheU1vZGU7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHkgfHwgaXNQYXJlbnRSZWFkT25seSB8fCBpc1N1cnZleVJlYWRPbmx5O1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlYWQgb25seSBhbmQgYW4gZW5kLXVzZXIgd2lsbCBub3QgYWJsZSB0byBhbnN3ZXIgb24gdGhlIHF1c3Rpb24uIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiByZWFkT25seSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogUnVuIHZpc2libGVJZiBhbmQgZW5hYmxlSWYgZXhwcmVzc2lvbnMuIElmIHZpc2libGVJZiBvci9hbmQgZW5hYmxlZElmIGFyZSBub3QgZW1wdHksIHRoZW4gdGhlIHJlc3VsdHMgb2YgcGVyZm9ybWluZyB0aGUgZXhwcmVzc2lvbiAodHJ1ZSBvciBmYWxzZSkgc2V0IHRvIHRoZSB2aXNpYmxlL3JlYWRPbmx5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB2YWx1ZXMgVHlwaWNhbGx5IHN1cnZleSByZXN1bHRzXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgZW5hYmxlSWZcbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcm9wZXJ0aWVzW1wicXVlc3Rpb25cIl0gPSB0aGlzO1xuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUlmQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIHRoaXMucnVuRW5hYmxlSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1blJlcXVpcmVkSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMudmlzaWJsZUlmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy52aXNpYmxlSWY7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIub25SdW5Db21wbGV0ZSA9IChyZXM6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRW5hYmxlSWZDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlSWYpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25FbmFiZWxSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gIXJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuUmVxdWlyZWRJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5yZXF1aXJlZElmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5yZXF1aXJlZElmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnJlcXVpcmVkSWY7XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gcmVzO1xuICAgIH07XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdGhlIHF1ZXN0aW9uIG51bWJlci4gSWYgcXVlc3Rpb24gaXMgaW52aXNpYmxlIHRoZW4gaXQgcmV0dXJucyBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHZpc2libGVJbmRleCBpcyAxLCB0aGVuIG5vIGlzIDIsIG9yICdCJyBpZiBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4IGlzICdBJy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52aXNpYmxlSW5kZXggPCAwKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgc3RhcnRJbmRleCA9IDE7XG4gICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCkge1xuICAgICAgc3RyID0gdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4O1xuICAgICAgaWYgKHBhcnNlSW50KHN0cikpIHN0YXJ0SW5kZXggPSBwYXJzZUludChzdHIpO1xuICAgICAgZWxzZSBpZiAoc3RyLmxlbmd0aCA9PSAxKSBpc051bWVyaWMgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpYykgcmV0dXJuICh0aGlzLnZpc2libGVJbmRleCArIHN0YXJ0SW5kZXgpLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoMCkgKyB0aGlzLnZpc2libGVJbmRleCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnN1cnZleUxvYWRDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICB0aGlzLmluaXREYXRhRnJvbVN1cnZleSgpO1xuICAgIHRoaXMub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIHByb3RlY3RlZCBpbml0RGF0YUZyb21TdXJ2ZXkoKSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLmRhdGEuZ2V0VmFsdWUodGhpcy5nZXRWYWx1ZU5hbWUoKSkpO1xuICAgICAgdGhpcy5pbml0Q29tbWVudEZyb21TdXJ2ZXkoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGluaXRDb21tZW50RnJvbVN1cnZleSgpIHtcbiAgICBpZiAoISF0aGlzLmRhdGEgJiYgdGhpcy5yZXF1aXJlVXBkYXRlQ29tbWVudFZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbW1lbnRGcm9tU3VydmV5KHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVDb21tZW50RnJvbVN1cnZleShcIlwiKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb25WYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiKTtcbiAgfVxuICBwcml2YXRlIHNldCBxdWVzdGlvblZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBxdWVzdGlvbkNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29tbWVudFwiKTtcbiAgfVxuICBwcml2YXRlIHNldCBxdWVzdGlvbkNvbW1lbnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21tZW50XCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb21tZW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogR2V0L1NldCB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAqIEBzZWUgU3VydmV5TW9kZS5zZXRWYWx1ZVxuICAgKiBAc2VlIFN1cnZleU1vZGUuZ2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZSgpIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVWYWx1ZUNvcHkoKTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNhbkNsZWFyVmFsdWVBc0ludmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5pc1BhcmVudFZpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLnBhZ2UgJiYgdGhpcy5wYWdlLmlzU3RhcnRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5Lmhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMudmFsdWVOYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1BhcmVudFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmICghcGFyZW50LmlzVmlzaWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBpZiAodGhpcy5jYW5DbGVhclZhbHVlQXNJbnZpc2libGUoKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2Rpc3BsYXlWYWx1ZSA9IFwiXCI7XG5cbiAgcHVibGljIGdldCBkaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZURpc3BsYXlWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5fZGlzcGxheVZhbHVlID0gdGhpcy5nZXREaXNwbGF5VmFsdWUodHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcXVlc3Rpb24gdmFsdWUgYXMgYSBkaXNwbGF5IHRleHQuIEZvciBleGFtcGxlLCBmb3IgZHJvcGRvd24sIGl0IHdvdWxkIHJldHVybiB0aGUgaXRlbSB0ZXh0IGluc3RlYWQgb2YgaXRlbSB2YWx1ZS5cbiAgICogQHBhcmFtIGtleXNBc1RleHQgU2V0IHRoaXMgdmFsdWUgdG8gdHJ1ZSwgdG8gcmV0dXJuIGtleSAoaW4gbWF0cmljZXMgcXVlc3Rpb25zKSBhcyBkaXNwbGF5IHRleHQgYXMgd2VsbC5cbiAgICogQHBhcmFtIHZhbHVlIHVzZSB0aGlzIHBhcmFtZXRlciwgaWYgeW91IHdhbnQgdG8gZ2V0IGRpc3BsYXkgdmFsdWUgZm9yIHRoaXMgdmFsdWUgYW5kIG5vdCBxdWVzdGlvbi52YWx1ZS4gSXQgaXMgdW5kZWZpbmVkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkgPSB1bmRlZmluZWQpOiBhbnkge1xuICAgIGlmICh0aGlzLmN1c3RvbVdpZGdldCkge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuY3VzdG9tV2lkZ2V0LmdldERpc3BsYXlWYWx1ZSh0aGlzLCB2YWx1ZSk7XG4gICAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlID09IHVuZGVmaW5lZCA/IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCkgOiB2YWx1ZTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBxdWVzdGlvbi4gSXQgd2lsbCBiZSBhc3NpZ24gdG8gdGhlIHF1ZXN0aW9uIG9uIGxvYWRpbmcgdGhlIHN1cnZleSBmcm9tIEpTT04gb3IgYWRkaW5nIGEgcXVlc3Rpb24gdG8gdGhlIHN1cnZleSBvciBvbiBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9uIGFuc3dlciBkYXRhIGFzIGEgcGxhaW4gb2JqZWN0OiB3aXRoIHF1ZXN0aW9uIHRpdGxlLCBuYW1lLCB2YWx1ZSBhbmQgZGlzcGxheVZhbHVlLlxuICAgKiBGb3IgY29tcGxleCBxdWVzdGlvbnMgKGxpa2UgbWF0cml4LCBldGMuKSBpc05vZGUgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBhbmQgZGF0YSBjb250YWlucyBhcnJheSBvZiBuZXN0ZWQgb2JqZWN0cyAocm93cylcbiAgICogc2V0IG9wdGlvbnMuaW5jbHVkZUVtcHR5IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIHNraXAgZW1wdHkgYW5zd2Vyc1xuICAgKi9cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVFbXB0eSB8fCAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IDxhbnk+e1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmRpc3BsYXlWYWx1ZSxcbiAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWxcbiAgICAgIH07XG4gICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goY2FsY3VsYXRpb24gPT4ge1xuICAgICAgICBxdWVzdGlvblBsYWluRGF0YVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gdGhpc1tcbiAgICAgICAgICBjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY29ycmVjdCBhbnN3ZXIgb24gdGhlIHF1ZXN0aW9uLiBTZXQgdGhpcyB2YWx1ZSBpZiB5b3UgYXJlIGRvaW5nIGEgcXVpei5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5jb3JyZWN0QW5zd2Vyc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLmluQ29ycmVjdEFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ycmVjdEFuc3dlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb3JyZWN0QW5zd2VyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29ycmVjdEFuc3dlcih2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvcnJlY3RBbnN3ZXJcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHF1aXpRdWVzdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1Zpc2libGUgJiZcbiAgICAgIHRoaXMuaGFzSW5wdXQgJiZcbiAgICAgICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLmNvcnJlY3RBbnN3ZXIpXG4gICAgKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVpelF1ZXN0aW9uQ291bnQoKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlcikpXG4gICAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0QW5zd2VyQ291bnQoKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVpelF1ZXN0aW9uQ291bnQoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5jb3JyZWN0QW5zd2VyLCB0cnVlKSA/IDEgOiAwO1xuICB9XG4gIHB1YmxpYyBpc0Fuc3dlckNvcnJlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ycmVjdEFuc3dlckNvdW50ID09IHRoaXMucXVpelF1ZXN0aW9uQ291bnQ7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgIXRoaXMuaXNFbXB0eSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpICYmIHRoaXMuaXNEZWZhdWx0VmFsdWVFbXB0eSgpKSByZXR1cm47XG4gICAgdGhpcy5zZXREZWZhdWx0VmFsdWUoKTtcbiAgfVxuICBnZXRRdWVzdGlvbkZyb21BcnJheShuYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBJUXVlc3Rpb24ge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcXVlc3Rpb24gY29tbWVudCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldENvbW1lbnQoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21tZW50ID09IG5ld1ZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5zZXRDb21tZW50KG5ld1ZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQ29tbWVudDtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXROZXdDb21tZW50KG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbnN3ZXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbnN3ZXJlZFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzQW5zd2VyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbnN3ZXJlZFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVJc0Fuc3dlcmVkKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQW5zd2VyZWRcIiwgdGhpcy5nZXRJc0Fuc3dlcmVkKCkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHF1ZXN0aW9uIHZhbGlkYXRvcnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbGlkYXRvcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWxpZGF0b3JzKHZhbDogQXJyYXk8U3VydmV5VmFsaWRhdG9yPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbGlkYXRvcnNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBnZXRTdXBwb3J0ZWRWYWxpZGF0b3JzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLmFkZFN1cHBvcnRlZFZhbGlkYXRvcnMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBhZGRTdXBwb3J0ZWRWYWxpZGF0b3JzKHN1cHBvcnRlZFZhbGlkYXRvcnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBzdXBwb3J0ZWRWYWxpZGF0b3JzLnB1c2goXCJleHByZXNzaW9uXCIpO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIG5hbWVzLnB1c2godGhpcy5uYW1lKTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUsXG4gICAgICBxdWVzdGlvbjogdGhpc1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gdGhpcy5nZXRUeXBlKCk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRpb24gZXJyb3IocykgaW4gdGhlIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlIHRvIHNob3cgYW4gZXJyb3IgaW4gVUkuXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvcnMgPSB0aGlzLmNoZWNrRm9yRXJyb3JzKCk7XG4gICAgaWYgKGZpcmVDYWxsYmFjaykge1xuICAgICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkuYmVmb3JlU2V0dGluZ1F1ZXN0aW9uRXJyb3JzKHRoaXMsIGVycm9ycyk7XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb250YWluc0Vycm9ycygpO1xuICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgY291bnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRFcnJvckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hhci9zdHJpbmcgZm9yIGEgcmVxdWlyZWQgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZFxuICAgICAgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHRcbiAgICAgIDogXCJcIjtcbiAgfVxuICAvKipcbiAgICogQWRkIGVycm9yIGludG8gdGhlIHF1ZXN0aW9uIGVycm9yIGxpc3QuXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKi9cbiAgcHVibGljIGFkZEVycm9yKGVycm9yOiBTdXJ2ZXlFcnJvcikge1xuICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYXJ0aWN1bGFyIGVycm9yIGZyb20gdGhlIHF1ZXN0aW9uIGVycm9yIGxpc3QuXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVycm9yKGVycm9yOiBTdXJ2ZXlFcnJvcikge1xuICAgIHZhciBlcnJvcnMgPSB0aGlzLmVycm9ycztcbiAgICB2YXIgaW5kZXggPSBlcnJvcnMuaW5kZXhPZihlcnJvcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgZXJyb3JzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja0ZvckVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciBxRXJyb3JzID0gbmV3IEFycmF5PFN1cnZleUVycm9yPigpO1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiAhdGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICB0aGlzLmNvbGxlY3RFcnJvcnMocUVycm9ycyk7XG4gICAgfVxuICAgIHJldHVybiBxRXJyb3JzO1xuICB9XG4gIHByaXZhdGUgY29sbGVjdEVycm9ycyhxRXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICB0aGlzLm9uQ2hlY2tGb3JFcnJvcnMocUVycm9ycyk7XG4gICAgaWYgKHFFcnJvcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHZhciBlcnJvcnMgPSB0aGlzLnJ1blZhbGlkYXRvcnMoKTtcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvL3ZhbGlkYXRvcnMgbWF5IGNoYW5nZSB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAgICAgIHFFcnJvcnMubGVuZ3RoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBxRXJyb3JzLnB1c2goZXJyb3JzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgcUVycm9ycy5sZW5ndGggPT0gMCkge1xuICAgICAgdmFyIGVycm9yID0gdGhpcy5maXJlU3VydmV5VmFsaWRhdGlvbigpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHFFcnJvcnMucHVzaChlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmlyZVN1cnZleVZhbGlkYXRpb24oKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICh0aGlzLnZhbGlkYXRlVmFsdWVDYWxsYmFjaykgcmV0dXJuIHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKCk7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkudmFsaWRhdGVRdWVzdGlvbih0aGlzKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBpZiAodGhpcy5oYXNSZXF1aXJlZEVycm9yKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBBbnN3ZXJSZXF1aXJlZEVycm9yKHRoaXMucmVxdWlyZWRFcnJvclRleHQsIHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1JlcXVpcmVkRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLmlzRW1wdHkoKTtcbiAgfVxuICBwcml2YXRlIHZhbGlkYXRvclJ1bm5lcjogVmFsaWRhdG9yUnVubmVyO1xuICBwcml2YXRlIGlzUnVubmluZ1ZhbGlkYXRvcnNWYWx1ZSA9IGZhbHNlO1xuICBwdWJsaWMgb25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnM6IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBydW5WYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgaWYgKCEhdGhpcy52YWxpZGF0b3JSdW5uZXIpIHtcbiAgICAgIHRoaXMudmFsaWRhdG9yUnVubmVyLm9uQXN5bmNDb21wbGV0ZWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRvclJ1bm5lciA9IG5ldyBWYWxpZGF0b3JSdW5uZXIoKTtcbiAgICB0aGlzLmlzUnVubmluZ1ZhbGlkYXRvcnNWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy52YWxpZGF0b3JSdW5uZXIub25Bc3luY0NvbXBsZXRlZCA9IChlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikgPT4ge1xuICAgICAgdGhpcy5kb09uQXN5bmNDb21wbGV0ZWQoZXJyb3JzKTtcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvclJ1bm5lci5ydW4odGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBkb09uQXN5bmNDb21wbGV0ZWQoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcnNbaV0pO1xuICAgIH1cbiAgICB0aGlzLmlzUnVubmluZ1ZhbGlkYXRvcnNWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMucmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpO1xuICB9XG4gIHByb3RlY3RlZCByYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCkge1xuICAgIGlmICghIXRoaXMub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgJiYgIXRoaXMuaXNSdW5uaW5nVmFsaWRhdG9ycykge1xuICAgICAgdGhpcy5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyh0aGlzLmdldEFsbEVycm9ycygpLmxlbmd0aCA+IDApO1xuICAgICAgdGhpcy5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWUpO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgbG9jTm90aWZpY2F0aW9uSW5EYXRhID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBpc1N1cnZleUlucHV0VGV4dFVwZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmlzVXBkYXRlVmFsdWVUZXh0T25UeXBpbmcgOiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldERhdGFMb2NOb3RpZmljYXRpb24oKTogYW55IHtcbiAgICBpZiAodGhpcy5sb2NOb3RpZmljYXRpb25JbkRhdGEpIHJldHVybiB0aGlzLmxvY05vdGlmaWNhdGlvbkluRGF0YTtcbiAgICByZXR1cm4gdGhpcy5pc0lucHV0VGV4dFVwZGF0ZSA/IFwidGV4dFwiIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBpc0lucHV0VGV4dFVwZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cnZleUlucHV0VGV4dFVwZGF0ZSAmJiB0aGlzLmlzVGV4dFZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlSW5EYXRhKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVUb0RhdGEobmV3VmFsdWUpO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlQ2hhbmdlZEluU3VydmV5KSB7XG4gICAgICB0aGlzLnNldFZhbHVlQ29yZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VmFsdWVDb3JlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUpO1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGhpcy5nZXREYXRhTG9jTm90aWZpY2F0aW9uKClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgc2V0TmV3Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVzdGlvbkNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRDb21tZW50KFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGhpcy5pc1N1cnZleUlucHV0VGV4dFVwZGF0ZSA/IFwidGV4dFwiIDogZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vSVF1ZXN0aW9uXG4gIHVwZGF0ZVZhbHVlRnJvbVN1cnZleShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUodGhpcy52YWx1ZUZyb21EYXRhKG5ld1ZhbHVlKSk7XG4gIH1cbiAgdXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgdGhpcy5xdWVzdGlvbkNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIGlmICh1cGRhdGVJc0Fuc3dlcmVkKSB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUgfHwgIXRoaXMuaGFzVGl0bGUpIHtcbiAgICAgIHZhbCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgICByZXR1cm4gdmFsIDwgMCA/IDAgOiAxO1xuICB9XG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcXVlc3Rpb24sIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge31cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjbGVhciBhbGwgZXJyb3JzIGluIHRoZSBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cbiAgcHVibGljIGNsZWFyVW51c2VkVmFsdWVzKCkge31cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7fVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1cnZleSBsb2NhbGVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5sb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXG4gICAgICA6IHRoaXMubG9jT3duZXJcbiAgICAgID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKVxuICAgICAgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gdGhpcy5zdXJ2ZXkuZ2V0U3VydmV5TWFya2Rvd25IdG1sKHRoaXMsIHRleHQpXG4gICAgICA6IHRoaXMubG9jT3duZXJcbiAgICAgID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRleHRQcm9jZXNzb3IpXG4gICAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHRleHQsIHRoaXMudXNlRGlzcGxheVZhbHVlc0luVGl0bGUpO1xuICAgIGlmICh0aGlzLmxvY093bmVyKSByZXR1cm4gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkgcmV0dXJuIHRoaXMuc3VydmV5LmdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0LCBlcnJvcik7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgLy9JVmFsaWRhdG9yT3duZXJcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgdmFsaWRhdGVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBzZXQgdmFsaWRhdGVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJxdWVzdGlvblwiLCBbXG4gIFwiIW5hbWVcIixcbiAgeyBuYW1lOiBcInZpc2libGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUsIGxheW91dDogXCJyb3dcIiB9LFxuICBcInZpc2libGVJZjpjb25kaXRpb25cIixcbiAgeyBuYW1lOiBcIndpZHRoXCIgfSxcbiAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgeyBuYW1lOiBcImluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAge1xuICAgIG5hbWU6IFwicGFnZVwiLFxuICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgcmV0dXJuIHN1cnZleVxuICAgICAgICA/IHN1cnZleS5wYWdlcy5tYXAoKHA6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHAubmFtZSwgdGV4dDogcC50aXRsZSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgfVxuICB9LFxuICB7IG5hbWU6IFwidGl0bGU6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiwgbGF5b3V0OiBcInJvd1wiIH0sXG4gIHtcbiAgICBuYW1lOiBcImRlc2NyaXB0aW9uOnRleHRcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIixcbiAgICBsYXlvdXQ6IFwicm93XCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiZGVzY3JpcHRpb25Mb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ1bmRlcklucHV0XCIsIFwidW5kZXJUaXRsZVwiXVxuICB9LFxuICBcInZhbHVlTmFtZVwiLFxuICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICBcImRlZmF1bHRWYWx1ZTp2YWx1ZVwiLFxuICBcImNvcnJlY3RBbnN3ZXI6dmFsdWVcIixcbiAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgXCJyZXF1aXJlZElmOmNvbmRpdGlvblwiLFxuICB7XG4gICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCJcbiAgfSxcbiAgXCJyZWFkT25seTpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgY2xhc3NOYW1lUGFydDogXCJ2YWxpZGF0b3JcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJ0aXRsZUxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl0sXG4gICAgbGF5b3V0OiBcInJvd1wiXG4gIH1cbl0pO1xuU2VyaWFsaXplci5hZGRBbHRlck5hdGl2ZUNsYXNzTmFtZShcInF1ZXN0aW9uXCIsIFwicXVlc3Rpb25iYXNlXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5cbmltcG9ydCB7IE9wZXJhbmQsIEZ1bmN0aW9uT3BlcmFuZCB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1BhcnNlclwiO1xuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIG9wZXJhbmQ6IE9wZXJhbmQ7XG4gIHByaXZhdGUgcHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICBwcml2YXRlIHBhcnNlciA9IG5ldyBDb25kaXRpb25zUGFyc2VyKCk7XG4gIHByaXZhdGUgaXNBc3luY1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgaGFzRnVuY3Rpb25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGFzeW5jRnVuY0xpc3Q6IEFycmF5PEZ1bmN0aW9uT3BlcmFuZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZykge1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5leHByZXNzaW9uVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wZXJhbmQgPSB0aGlzLnBhcnNlci5wYXJzZUV4cHJlc3Npb24odmFsdWUpO1xuICAgIHRoaXMuaGFzRnVuY3Rpb25WYWx1ZSA9IHRoaXMuY2FuUnVuKCkgPyB0aGlzLm9wZXJhbmQuaGFzRnVuY3Rpb24oKSA6IGZhbHNlO1xuICAgIHRoaXMuaXNBc3luY1ZhbHVlID0gdGhpcy5oYXNGdW5jdGlvbigpXG4gICAgICA/IHRoaXMub3BlcmFuZC5oYXNBc3luY0Z1bmN0aW9uKClcbiAgICAgIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFyaWFibGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5vcGVyYW5kKSByZXR1cm4gW107XG5cbiAgICB2YXIgdmFyaWFibGVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdGhpcy5vcGVyYW5kLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cblxuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRnVuY3Rpb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQXN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNBc3luY1ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGNhblJ1bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm9wZXJhbmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcnVuQ29yZShcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBhbnkge1xuICAgIGlmICghdGhpcy5vcGVyYW5kKSByZXR1cm4gbnVsbDtcblxuICAgIHRoaXMucHJvY2Vzc1ZhbHVlLnZhbHVlcyA9IHZhbHVlcztcbiAgICB0aGlzLnByb2Nlc3NWYWx1ZS5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICBpZiAoIXRoaXMuaXNBc3luYykgcmV0dXJuIHRoaXMucnVuVmFsdWVzKCk7XG4gICAgdGhpcy5hc3luY0Z1bmNMaXN0ID0gW107XG4gICAgdGhpcy5vcGVyYW5kLmFkZFRvQXN5bmNMaXN0KHRoaXMuYXN5bmNGdW5jTGlzdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYXN5bmNGdW5jTGlzdFtpXS5vbkFzeW5jUmVhZHkgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9Bc3luY0Z1bmN0aW9uUmVhZHkoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hc3luY0Z1bmNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFzeW5jRnVuY0xpc3RbaV0uZXZhbHVhdGVBc3luYyh0aGlzLnByb2Nlc3NWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGRvQXN5bmNGdW5jdGlvblJlYWR5KCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hc3luY0Z1bmNMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuYXN5bmNGdW5jTGlzdFtpXS5pc1JlYWR5KSByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucnVuVmFsdWVzKCk7XG4gIH1cbiAgcHJpdmF0ZSBydW5WYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5vcGVyYW5kLmV2YWx1YXRlKHRoaXMucHJvY2Vzc1ZhbHVlKTtcbiAgICB0aGlzLmRvT25Db21wbGV0ZShyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGRvT25Db21wbGV0ZShyZXM6IGFueSkge31cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvblJ1bm5lciBleHRlbmRzIEV4cHJlc3Npb25SdW5uZXJCYXNlIHtcbiAgcHVibGljIG9uUnVuQ29tcGxldGU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHB1YmxpYyBydW4oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQ29yZSh2YWx1ZXMsIHByb3BlcnRpZXMpID09IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGRvT25Db21wbGV0ZShyZXM6IGFueSkge1xuICAgIGlmICghIXRoaXMub25SdW5Db21wbGV0ZSkgdGhpcy5vblJ1bkNvbXBsZXRlKHJlcyA9PSB0cnVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblJ1bm5lciBleHRlbmRzIEV4cHJlc3Npb25SdW5uZXJCYXNlIHtcbiAgcHVibGljIG9uUnVuQ29tcGxldGU6IChyZXN1bHQ6IGFueSkgPT4gdm9pZDtcbiAgcHVibGljIHJ1bih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJ1bkNvcmUodmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5vblJ1bkNvbXBsZXRlKSB0aGlzLm9uUnVuQ29tcGxldGUocmVzKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnMudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIElTdXJ2ZXlFcnJvck93bmVyIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlZFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvclwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVxdWlyZW9uZWFuc3dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvckluUGFuZWxcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1cmVOdW1lcmljRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVxdWlyZW51bWVyaWNcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNFcnJvclwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEV4Y2VlZFNpemVFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXhTaXplOiBudW1iZXIsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICAgIHRoaXMubG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4Y2VlZHNpemVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwiZXhjZWVkTWF4U2l6ZVwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuZ2V0VGV4dFNpemUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZXh0U2l6ZSgpIHtcbiAgICB2YXIgc2l6ZXMgPSBbXCJCeXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCJdO1xuICAgIHZhciBmaXhlZCA9IFswLCAwLCAyLCAzLCAzXTtcbiAgICBpZiAodGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gXCIwIEJ5dGVcIjtcbiAgICB9XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKHRoaXMubWF4U2l6ZSkgLyBNYXRoLmxvZygxMDI0KSk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tYXhTaXplIC8gTWF0aC5wb3coMTAyNCwgaSk7XG4gICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoZml4ZWRbaV0pICsgXCIgXCIgKyBzaXplc1tpXTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFdlYlJlcXVlc3RFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXR1czogc3RyaW5nLFxuICAgIHB1YmxpYyByZXNwb25zZTogc3RyaW5nLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihudWxsLCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2VicmVxdWVzdFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ1cmxSZXF1ZXN0RXJyb3JcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLnN0YXR1cywgdGhpcy5yZXNwb25zZSk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBXZWJSZXF1ZXN0RW1wdHlFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIndlYnJlcXVlc3RlbXB0eVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXJsR2V0Q2hvaWNlc0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT3RoZXJFbXB0eUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwib3RoZXJlbXB0eVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJSZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgVXBsb2FkaW5nRmlsZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidXBsb2FkaW5nZmlsZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXBsb2FkaW5nRmlsZVwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlZGluYWxscm93c2Vycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEluQWxsUm93c0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTWluUm93Q291bnRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1pblJvd0NvdW50OiBudW1iZXIsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtaW5yb3djb3VudGVycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcIm1pblJvd0NvdW50RXJyb3JcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pblJvd0NvdW50KTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEtleUR1cGxpY2F0aW9uRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJrZXlkdXBsaWNhdGlvbmVycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Vycm9yLnRzIiwiaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIEpzb25PYmplY3RQcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIEFycmF5IG9mIEl0ZW1WYWx1ZSBpcyB1c2VkIGluIGNoZWNrb3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIGNob2ljZXMsIG1hdHJpeCBjb2x1bW5zIGFuZCByb3dzLlxuICogSXQgaGFzIHR3byBtYWluIHByb3BlcnRpZXM6IHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB2YWx1ZSBpcyB1c2VkIGZvciBkaXNwbGF5aW5nLlxuICogVGhlIHRleHQgcHJvcGVydHkgaXMgbG9jYWxpemFibGUgYW5kIHN1cHBvcnQgbWFya2Rvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBJdGVtVmFsdWUgZXh0ZW5kcyBCYXNlIHtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFNlcGFyYXRvcigpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXRlbVZhbHVlU2VwYXJhdG9yO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IFNlcGFyYXRvcih2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLml0ZW1WYWx1ZVNlcGFyYXRvciA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFycmF5KGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBpdGVtczogQXJyYXk8SXRlbVZhbHVlPiA9IFtdO1xuICAgIEl0ZW1WYWx1ZS5zZXR1cEFycmF5KGl0ZW1zLCBsb2NPd25lcik7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0dXBBcnJheShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXJcbiAgKSB7XG4gICAgaXRlbXMucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMudW5zaGlmdCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMuc3BsaWNlID0gZnVuY3Rpb24oXG4gICAgICBzdGFydD86IG51bWJlcixcbiAgICAgIGRlbGV0ZUNvdW50PzogbnVtYmVyLFxuICAgICAgLi4uaXRlbXM6IEl0ZW1WYWx1ZVtdXG4gICAgKTogSXRlbVZhbHVlW10ge1xuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zW2ldLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBpdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICB2YXIgaXRlbTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZ2V0VHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGl0ZW0gPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKHZhbHVlLmdldFR5cGUoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIGl0ZW0uc2V0RGF0YSh2YWx1ZSk7XG4gICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldERhdGEoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtc1tpXS5nZXREYXRhKCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0SXRlbUJ5VmFsdWUoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sIHZhbDogYW55KTogSXRlbVZhbHVlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGl0ZW1zW2ldLnZhbHVlLCB2YWwpKSByZXR1cm4gaXRlbXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgdmFsOiBhbnlcbiAgKTogc3RyaW5nIHtcbiAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShpdGVtcywgdmFsKTtcbiAgICByZXR1cm4gaXRlbSAhPT0gbnVsbCA/IGl0ZW0ubG9jVGV4dC50ZXh0T3JIdG1sIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGxvY1N0cnNDaGFuZ2VkKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbXNbaV0ubG9jVGV4dC5zdHJDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgcnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIGZpbHRlcmVkSXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgcnVubmVyOiBDb25kaXRpb25SdW5uZXIsXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55LFxuICAgIHVzZUl0ZW1FeHByZXNzaW9uOiBib29sZWFuID0gdHJ1ZVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtc0NvcmUoXG4gICAgICBpdGVtcyxcbiAgICAgIGZpbHRlcmVkSXRlbXMsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHVzZUl0ZW1FeHByZXNzaW9uXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHJ1bkVuYWJsZWRDb25kaXRpb25zRm9ySXRlbXMoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgcnVubmVyOiBDb25kaXRpb25SdW5uZXIsXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zQ29yZShcbiAgICAgIGl0ZW1zLFxuICAgICAgbnVsbCxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgcnVuQ29uZGl0aW9uc0Zvckl0ZW1zQ29yZShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBmaWx0ZXJlZEl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICBpc1Zpc2libGU6IGJvb2xlYW4sXG4gICAgdXNlSXRlbUV4cHJlc3Npb246IGJvb2xlYW4gPSB0cnVlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICB2YWx1ZXMgPSB7fTtcbiAgICB9XG4gICAgdmFyIGl0ZW1WYWx1ZSA9IHZhbHVlc1tcIml0ZW1cIl07XG4gICAgdmFyIGNob2ljZVZhbHVlID0gdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIHZhciBoYXNDaGFuZGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtLnZhbHVlO1xuICAgICAgdmFsdWVzW1wiY2hvaWNlXCJdID0gaXRlbS52YWx1ZTtcbiAgICAgIHZhciBpdGVtUnVubmVyID1cbiAgICAgICAgdXNlSXRlbUV4cHJlc3Npb24gJiYgISFpdGVtLmdldENvbmRpdGlvblJ1bm5lclxuICAgICAgICAgID8gaXRlbS5nZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlKVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICBpZiAoIWl0ZW1SdW5uZXIpIHtcbiAgICAgICAgaXRlbVJ1bm5lciA9IHJ1bm5lcjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRydWU7XG4gICAgICBpZiAoaXRlbVJ1bm5lcikge1xuICAgICAgICBuZXdWYWx1ZSA9IGl0ZW1SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB9XG4gICAgICBpZiAoISFmaWx0ZXJlZEl0ZW1zICYmIG5ld1ZhbHVlKSB7XG4gICAgICAgIGZpbHRlcmVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHZhciBvbGRWYWx1ZSA9IGlzVmlzaWJsZSA/IGl0ZW0uaXNWaXNpYmxlIDogaXRlbS5pc0VuYWJsZWQ7XG4gICAgICBpZiAobmV3VmFsdWUgIT0gb2xkVmFsdWUpIHtcbiAgICAgICAgaGFzQ2hhbmRlZCA9IHRydWU7XG4gICAgICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgICAgICBpZiAoISFpdGVtLnNldElzVmlzaWJsZSkgaXRlbS5zZXRJc1Zpc2libGUobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghIWl0ZW0uc2V0SXNFbmFibGVkKSBpdGVtLnNldElzRW5hYmxlZChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0ZW1WYWx1ZSkge1xuICAgICAgdmFsdWVzW1wiaXRlbVwiXSA9IGl0ZW1WYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlc1tcIml0ZW1cIl07XG4gICAgfVxuICAgIGlmIChjaG9pY2VWYWx1ZSkge1xuICAgICAgdmFsdWVzW1wiY2hvaWNlXCJdID0gY2hvaWNlVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJjaG9pY2VcIl07XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZGVkO1xuICB9XG4gIHByaXZhdGUgdmlzaWJsZUlmVmFsdWU6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgaXRlbVZhbHVlOiBhbnk7XG4gIHByaXZhdGUgbG9jVGV4dFZhbHVlOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgcHJpdmF0ZSBpc1Zpc2libGVWYWx1ZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgdmlzaWJsZUNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIGVuYWJsZUNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBhbnksIHRleHQ6IHN0cmluZyA9IG51bGwsIHByaXZhdGUgdHlwZU5hbWUgPSBcIml0ZW12YWx1ZVwiKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhudWxsLCB0cnVlKTtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IHR4dCA9PiB7XG4gICAgICByZXR1cm4gdHh0ID8gdHh0IDogIXRoaXMuaXNWYWx1ZUl0ZW1FbXB0eSA/IHRoaXMudmFsdWUudG9TdHJpbmcoKSA6IG51bGw7XG4gICAgfTtcbiAgICBpZiAodGV4dCkgdGhpcy5sb2NUZXh0LnRleHQgPSB0ZXh0O1xuICAgIGlmICghIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5zZXREYXRhKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgb25DcmVhdGluZygpOiBhbnkge31cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGVOYW1lID8gdGhpcy50eXBlTmFtZSA6IFwiaXRlbXZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0VmFsdWU7XG4gIH1cbiAgc2V0TG9jVGV4dChsb2NUZXh0OiBMb2NhbGl6YWJsZVN0cmluZykge1xuICAgIHRoaXMubG9jVGV4dFZhbHVlID0gbG9jVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY093bmVyKCk6IElMb2NhbGl6YWJsZU93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0Lm93bmVyO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9jT3duZXIodmFsdWU6IElMb2NhbGl6YWJsZU93bmVyKSB7XG4gICAgdGhpcy5sb2NUZXh0Lm93bmVyID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLml0ZW1WYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLml0ZW1WYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmICghdGhpcy5pdGVtVmFsdWUpIHJldHVybjtcbiAgICB2YXIgc3RyOiBzdHJpbmcgPSB0aGlzLml0ZW1WYWx1ZS50b1N0cmluZygpO1xuICAgIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKHNldHRpbmdzLml0ZW1WYWx1ZVNlcGFyYXRvcik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuaXRlbVZhbHVlID0gc3RyLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgIHRoaXMudGV4dCA9IHN0ci5zbGljZShpbmRleCArIDEpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzVGV4dCkge1xuICAgICAgdGhpcy5sb2NUZXh0Lm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5wdXJlVGV4dCA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LmNhbGN1bGF0ZWRUZXh0OyAvL1RPRE86IGl0IHdpbGwgYmUgY29ycmVjdCB0byB1c2UgdGhpcy5sb2NUZXh0LnRleHQsIGhvd2V2ZXIgaXQgd291bGQgcmVxdWlyZSBhIGxvdCBvZiByZXdyaXR0aW5nIGluIENyZWF0b3JcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQobmV3VGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3Qgb2xkVGV4dCA9IHRoaXMubG9jVGV4dC50ZXh0O1xuICAgIHRoaXMubG9jVGV4dC50ZXh0ID0gbmV3VGV4dDtcbiAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKFwidGV4dFwiLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhbGN1bGF0ZWRUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQuY2FsY3VsYXRlZFRleHQ7XG4gIH1cbiAgcHVibGljIGdldERhdGEoKTogYW55IHtcbiAgICB2YXIganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgaWYgKCEhanNvbltcInZhbHVlXCJdICYmICEhanNvbltcInZhbHVlXCJdW1wicG9zXCJdKSB7XG4gICAgICBkZWxldGUganNvbltcInZhbHVlXCJdW1wicG9zXCJdO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoanNvbikubGVuZ3RoID09IDEgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KGpzb25bXCJ2YWx1ZVwiXSkpXG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIHZhciBwcm9wZXJ0aWVzID0gU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzKHRoaXMuZ2V0VHlwZSgpKTtcbiAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgcHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllcyhcIml0ZW12YWx1ZVwiKTtcbiAgICB9XG4gICAgdmFyIGpzb09iaiA9IG5ldyBKc29uT2JqZWN0KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBqc29PYmoudmFsdWVUb0pzb24odGhpcywgcmVzLCBwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0RGF0YSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHZhciBqc29uID0gdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGpzb24gPSAoPEJhc2U+dmFsdWUpLnRvSlNPTigpO1xuICAgICAgfVxuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVJZlZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy52aXNpYmxlSWZWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Zpc2libGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0SXNWaXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNWaXNpYmxlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzRW5hYmxlZFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0SXNFbmFibGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRW5hYmxlZFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5BZGRMb2NTdHJpbmdUb1VzZWRMb2NhbGVzKHRoaXMubG9jVGV4dFZhbHVlLCBsb2NhbGVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29uZGl0aW9uUnVubmVyKGlzVmlzaWJsZTogYm9vbGVhbikge1xuICAgIGlmIChpc1Zpc2libGUpIHJldHVybiB0aGlzLmdldFZpc2libGVDb25kaXRpb25SdW5uZXIoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRFbmFibGVDb25kaXRpb25SdW5uZXIoKTtcbiAgfVxuICBwcml2YXRlIGdldFZpc2libGVDb25kaXRpb25SdW5uZXIoKTogQ29uZGl0aW9uUnVubmVyIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIHRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy52aXNpYmxlSWY7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lcjtcbiAgfVxuICBwcml2YXRlIGdldEVuYWJsZUNvbmRpdGlvblJ1bm5lcigpOiBDb25kaXRpb25SdW5uZXIge1xuICAgIGlmICghdGhpcy5lbmFibGVJZikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICB0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5lbmFibGVJZjtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVDb25kaXRpb25SdW5uZXI7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNWYWx1ZUl0ZW1FbXB0eSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXRlbVZhbHVlICYmIHRoaXMuaXRlbVZhbHVlICE9PSAwICYmIHRoaXMuaXRlbVZhbHVlICE9PSBmYWxzZTtcbiAgfVxufVxuXG5CYXNlLmNyZWF0ZUl0ZW1WYWx1ZSA9IGZ1bmN0aW9uKHNvdXJjZTogYW55LCB0eXBlPzogc3RyaW5nKTogYW55IHtcbiAgdmFyIGl0ZW0gPSBudWxsO1xuICBpZiAoISF0eXBlKSB7XG4gICAgaXRlbSA9IEpzb25PYmplY3QubWV0YURhdGEuY3JlYXRlQ2xhc3ModHlwZSwge30pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UuZ2V0VHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCwgdW5kZWZpbmVkLCBzb3VyY2UuZ2V0VHlwZSgpKTtcbiAgfSBlbHNlIHtcbiAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsKTtcbiAgfVxuICBpdGVtLnNldERhdGEoc291cmNlKTtcbiAgcmV0dXJuIGl0ZW07XG59O1xuQmFzZS5pdGVtVmFsdWVMb2NTdHJDaGFuZ2VkID0gZnVuY3Rpb24oYXJyOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gIEl0ZW1WYWx1ZS5sb2NTdHJzQ2hhbmdlZChhcnIpO1xufTtcbkpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24odmFsOiBhbnkpOiBhbnkge1xuICB2YXIgcmVzID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgSXRlbVZhbHVlLnNldERhdGEocmVzLCB2YWwgfHwgW10pO1xuICByZXR1cm4gcmVzO1xufTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJpdGVtdmFsdWVcIixcbiAgW1xuICAgIFwidmFsdWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmOmNvbmRpdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9XG4gIF0sXG4gICh2YWx1ZTogYW55KSA9PiBuZXcgSXRlbVZhbHVlKHZhbHVlKVxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9pdGVtdmFsdWUudHMiLCJleHBvcnQgdmFyIHN1cnZleUNzczogYW55ID0ge1xuICBjdXJyZW50VHlwZTogXCJcIixcbiAgZ2V0Q3NzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50VHlwZSA/IHRoaXNbdGhpcy5jdXJyZW50VHlwZV0gOiBkZWZhdWx0U3RhbmRhcmRDc3M7XG4gICAgaWYgKCFsb2MpIGxvYyA9IGRlZmF1bHRTdGFuZGFyZENzcztcbiAgICByZXR1cm4gbG9jO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGRlZmF1bHRTdGFuZGFyZENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2RlZmF1bHRfY3NzXCIsXG4gIGNvbnRhaW5lcjogXCJzdl9jb250YWluZXJcIixcbiAgaGVhZGVyOiBcInN2X2hlYWRlclwiLFxuICBib2R5OiBcInN2X2JvZHlcIixcbiAgYm9keUVtcHR5OiBcInN2X2JvZHkgc3ZfYm9keV9lbXB0eVwiLFxuICBmb290ZXI6IFwic3ZfbmF2XCIsXG4gIHRpdGxlOiBcIlwiLFxuICBkZXNjcmlwdGlvbjogXCJcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJzdl9jb21wbGV0ZWRfcGFnZVwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwic3ZfY29tcGxldGVfYnRuXCIsXG4gICAgcHJldjogXCJzdl9wcmV2X2J0blwiLFxuICAgIG5leHQ6IFwic3ZfbmV4dF9idG5cIixcbiAgICBzdGFydDogXCJzdl9zdGFydF9idG5cIlxuICB9LFxuICBwcm9ncmVzczogXCJzdl9wcm9ncmVzc1wiLFxuICBwcm9ncmVzc0JhcjogXCJzdl9wcm9ncmVzc19iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0SW5CYXI6IFwic3YtaGlkZGVuXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcInN2X3Bfcm9vdFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiXG4gIH0sXG4gIC8vIFRPRE86IG1vdmUgdG8gdGhlIHBhZ2Ugb2JqZWN0XG4gIHBhZ2VUaXRsZTogXCJzdl9wYWdlX3RpdGxlXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3Egc3ZfcXN0blwiLFxuICAgIGZsb3dSb290OiBcInN2X3FfZmxvdyBzdl9xc3RuXCIsXG4gICAgaGVhZGVyOiBcIlwiLFxuICAgIGhlYWRlckxlZnQ6IFwidGl0bGUtbGVmdFwiLFxuICAgIGNvbnRlbnQ6IFwiXCIsXG4gICAgY29udGVudExlZnQ6IFwiY29udGVudC1sZWZ0XCIsXG4gICAgdGl0bGVMZWZ0Um9vdDogXCJzdl9xc3RuX2xlZnRcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3ZfcV9yZXF1aXJlZF90ZXh0XCIsXG4gICAgdGl0bGU6IFwic3ZfcV90aXRsZVwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2X3FfZGVzY3JpcHRpb25cIixcbiAgICBjb21tZW50OiBcIlwiLFxuICAgIHJlcXVpcmVkOiBcIlwiLFxuICAgIHRpdGxlUmVxdWlyZWQ6IFwiXCIsXG4gICAgaGFzRXJyb3I6IFwiXCIsXG4gICAgaW5kZW50OiAyMCxcbiAgICBmb290ZXI6IFwic3ZfcV9mb290ZXJcIixcbiAgICBmb3JtR3JvdXA6IFwiZm9ybS1ncm91cFwiXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdl9wX3RpdGxlX2V4cGFuZGFibGVcIixcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3ZfZXhwYW5kZWRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdl9wX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCJcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcInN2X3FfZXJib3hcIixcbiAgICBpY29uOiBcIlwiLFxuICAgIGl0ZW06IFwiXCIsXG4gICAgbG9jYXRpb25Ub3A6IFwic3ZfcXN0bl9lcnJvcl90b3BcIixcbiAgICBsb2NhdGlvbkJvdHRvbTogXCJzdl9xc3RuX2Vycm9yX2JvdHRvbVwiXG4gIH0sXG5cbiAgYm9vbGVhbjoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xYmxuXCIsXG4gICAgaXRlbTogXCJzdi1ib29sZWFuXCIsXG4gICAgY29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWJvb2xlYW4tLWNoZWNrZWQgY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmRldGVybWluYXRlOiBcInN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGVcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYm9vbGVhbi0tZGlzYWJsZWRcIixcbiAgICBzd2l0Y2g6IFwic3YtYm9vbGVhbl9fc3dpdGNoXCIsXG4gICAgc2xpZGVyOiBcInN2LWJvb2xlYW5fX3NsaWRlclwiLFxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxuICAgIGRpc2FibGVkTGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCJcbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWNieFwiLFxuICAgIGl0ZW06IFwic3ZfcV9jaGVja2JveFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfY2hlY2tib3hfaW5saW5lXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9jaGVja2JveF9sYWJlbFwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2NoZWNrYm94X2NvbnRyb2xfaXRlbVwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2X3FfY2hlY2tib3hfY29udHJvbF9sYWJlbFwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNoZWNrYm94LW1hdGVyaWFsXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9vdGhlciBzdl9xX2NoZWNrYm94X290aGVyXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiXG4gIH0sXG4gIGNvbW1lbnQ6IFwiXCIsXG4gIGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBjb250cm9sOiBcInN2X3FfZHJvcGRvd25fY29udHJvbFwiLFxuICAgIHNlbGVjdFdyYXBwZXI6IFwic3Zfc2VsZWN0X3dyYXBwZXJcIixcbiAgICBvdGhlcjogXCJzdl9xX2RkX290aGVyXCJcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWxcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZFwiLFxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwic3ZfcV9tYXRyaXhfZHJvcGRvd25cIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdl9xX21hdHJpeF9keW5hbWljXCIsXG4gICAgYnV0dG9uOiBcInN2X21hdHJpeF9keW5hbWljX2J1dHRvblwiLFxuICAgIGJ1dHRvbkFkZDogXCJcIixcbiAgICBidXR0b25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkFkZDogXCJcIixcbiAgICBpY29uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwic3ZfcGFuZWxfZHluYW1pY1wiLFxuICAgIHRpdGxlOiBcInN2X3BfdGl0bGVcIixcbiAgICBidXR0b246IFwiXCIsXG4gICAgYnV0dG9uQWRkOiBcInN2LXBhbmVsZHluYW1pY19fYWRkLWJ0blwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIlxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInN2X3FfbXRcIixcbiAgICBpdGVtVGl0bGU6IFwic3ZfcV9tdF90aXRsZVwiLFxuICAgIHJvdzogXCJzdl9xX210X3Jvd1wiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgc3ZfcV90ZXh0X3Jvb3RcIlxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX3JhZGlvZ3JvdXBfaW5saW5lXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBsYWJlbDogXCJzdl9xX3JhZGlvZ3JvdXBfbGFiZWxcIixcbiAgICBsYWJlbENoZWNrZWQ6IFwiXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfaXRlbVwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfcmFkaW9ncm91cF9vdGhlclwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIlxuICB9LFxuICBpbWFnZXBpY2tlcjoge1xuICAgIHJvb3Q6IFwic3ZfaW1nc2VsXCIsXG4gICAgaXRlbTogXCJzdl9xX2ltZ3NlbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2ltYWdlcGlja2VyX2lubGluZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXJcIlxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcInN2X3FfcmF0aW5nXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhdGluZ19pdGVtXCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIixcbiAgICBkaXNhYmxlZDogXCJcIlxuICB9LFxuICB0ZXh0OiBcInN2X3FfdGV4dF9yb290XCIsXG4gIGV4cHJlc3Npb246IFwiXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxuICAgIHBsYWNlaG9sZGVySW5wdXQ6IFwic3ZfcV9maWxlX3BsYWNlaG9sZGVyXCIsXG4gICAgcHJldmlldzogXCJzdl9xX2ZpbGVfcHJldmlld1wiLFxuICAgIHJlbW92ZUJ1dHRvbjogXCJzdl9xX2ZpbGVfcmVtb3ZlX2J1dHRvblwiLFxuICAgIGZpbGVJbnB1dDogXCJzdl9xX2ZpbGVfaW5wdXRcIixcbiAgICByZW1vdmVGaWxlOiBcInN2X3FfZmlsZV9yZW1vdmVcIixcbiAgICByZW1vdmVGaWxlU3ZnOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVEZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgZmlsZVNpZ25Cb3R0b206IFwic3YtaGlkZGVuXCIsXG4gICAgcmVtb3ZlQnV0dG9uQm90dG9tOiBcInN2LWhpZGRlblwiXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiXCIsXG4gICAgZXJyb3I6IFwiXCIsXG4gICAgc3VjY2VzczogXCJcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCJcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcbiAgICBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBidXR0b246IFwiXCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJcIlxuICAgIH1cbiAgfVxufTtcblxuc3VydmV5Q3NzW1wic3RhbmRhcmRcIl0gPSBkZWZhdWx0U3RhbmRhcmRDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsImltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUNvcmUge1xuICBoYXNWYWx1ZTogYm9vbGVhbjtcbiAgdmFsdWU6IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NWYWx1ZSB7XG4gIHB1YmxpYyB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgcHVibGljIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgZ2V0Rmlyc3ROYW1lKHRleHQ6IHN0cmluZywgb2JqOiBhbnkgPSBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmICghIW9iaikge1xuICAgICAgcmVzID0gdGhpcy5nZXRGaXJzdFByb3BlcnR5TmFtZSh0ZXh0LCBvYmopO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCIuXCIgfHwgY2ggPT0gXCJbXCIpIGJyZWFrO1xuICAgICAgcmVzICs9IGNoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBoYXNWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xuICAgIHJldHVybiByZXMuaGFzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKG9iajogYW55LCB0ZXh0OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICB2YXIgbm9uTmVzdGVkT2JqID0gdGhpcy5nZXROb25OZXN0ZWRPYmplY3Qob2JqLCB0ZXh0KTtcbiAgICBpZiAoIW5vbk5lc3RlZE9iaikgcmV0dXJuO1xuICAgIG9iaiA9IG5vbk5lc3RlZE9iai52YWx1ZTtcbiAgICB0ZXh0ID0gbm9uTmVzdGVkT2JqLnRleHQ7XG4gICAgaWYgKCEhb2JqICYmICEhdGV4dCkge1xuICAgICAgb2JqW3RleHRdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXZhbHVlcykgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VmFsdWVDb3JlKHRleHQsIHZhbHVlcyk7XG4gICAgcmV0dXJuIHJlcy52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgcmVzOiBWYWx1ZUNvcmUgPSB7IGhhc1ZhbHVlOiBmYWxzZSwgdmFsdWU6IG51bGwgfTtcbiAgICB2YXIgY3VyVmFsdWUgPSB2YWx1ZXM7XG4gICAgaWYgKCFjdXJWYWx1ZSAmJiBjdXJWYWx1ZSAhPT0gMCAmJiBjdXJWYWx1ZSAhPT0gZmFsc2UpIHJldHVybiByZXM7XG4gICAgaWYgKFxuICAgICAgdGV4dCAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPiAtMSAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPT09IHRleHQubGVuZ3RoIC0gXCIubGVuZ3RoXCIubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXMudmFsdWUgPSAwO1xuICAgICAgcmVzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KGN1clZhbHVlLCB0ZXh0KTtcbiAgICBpZiAoIW5vbk5lc3RlZE9iaikgcmV0dXJuIHJlcztcbiAgICByZXMudmFsdWUgPSAhIW5vbk5lc3RlZE9iai50ZXh0XG4gICAgICA/IHRoaXMuZ2V0T2JqZWN0VmFsdWUobm9uTmVzdGVkT2JqLnZhbHVlLCBub25OZXN0ZWRPYmoudGV4dClcbiAgICAgIDogbm9uTmVzdGVkT2JqLnZhbHVlO1xuICAgIHJlcy5oYXNWYWx1ZSA9ICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyZXMudmFsdWUpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXROb25OZXN0ZWRPYmplY3Qob2JqOiBhbnksIHRleHQ6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaik7XG4gICAgd2hpbGUgKHRleHQgIT0gY3VyTmFtZSAmJiAhIW9iaikge1xuICAgICAgdmFyIGlzQXJyYXkgPSB0ZXh0WzBdID09IFwiW1wiO1xuICAgICAgaWYgKCFpc0FycmF5KSB7XG4gICAgICAgIGlmICghY3VyTmFtZSAmJiB0ZXh0ID09IHRoaXMuZ2V0Rmlyc3ROYW1lKHRleHQpKVxuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmosIHRleHQ6IHRleHQgfTtcbiAgICAgICAgb2JqID0gdGhpcy5nZXRPYmplY3RWYWx1ZShvYmosIGN1ck5hbWUpO1xuICAgICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkob2JqKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cihjdXJOYW1lLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb2JqSW5BcnJheSA9IHRoaXMuZ2V0T2JqSW5BcnJheShvYmosIHRleHQpO1xuICAgICAgICBpZiAoIW9iakluQXJyYXkpIHJldHVybiBudWxsO1xuICAgICAgICBvYmogPSBvYmpJbkFycmF5LnZhbHVlO1xuICAgICAgICB0ZXh0ID0gb2JqSW5BcnJheS50ZXh0O1xuICAgICAgfVxuICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0WzBdID09IFwiLlwiKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaik7XG4gICAgfVxuICAgIHJldHVybiB7IHZhbHVlOiBvYmosIHRleHQ6IHRleHQgfTtcbiAgfVxuICBwcml2YXRlIGdldE9iakluQXJyYXkoY3VyVmFsdWU6IGFueSwgdGV4dDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VyVmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgaW5kZXggPSAxO1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIHdoaWxlIChpbmRleCA8IHRleHQubGVuZ3RoICYmIHRleHRbaW5kZXhdICE9IFwiXVwiKSB7XG4gICAgICBzdHIgKz0gdGV4dFtpbmRleF07XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgICB0ZXh0ID0gaW5kZXggPCB0ZXh0Lmxlbmd0aCA/IHRleHQuc3Vic3RyKGluZGV4ICsgMSkgOiBcIlwiO1xuICAgIGluZGV4ID0gdGhpcy5nZXRJbnRWYWx1ZShzdHIpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY3VyVmFsdWUubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyB2YWx1ZTogY3VyVmFsdWVbaW5kZXhdLCB0ZXh0OiB0ZXh0IH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRGaXJzdFByb3BlcnR5TmFtZShuYW1lOiBzdHJpbmcsIG9iajogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBuYW1lO1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIEEgPSBuYW1lWzBdO1xuICAgIHZhciBhID0gQS50b1VwcGVyQ2FzZSgpO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIHZhciBmaXJzdCA9IGtleVswXTtcbiAgICAgIGlmIChmaXJzdCA9PT0gYSB8fCBmaXJzdCA9PT0gQSkge1xuICAgICAgICB2YXIga2V5TmFtZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoa2V5TmFtZSA9PSBuYW1lKSByZXR1cm4ga2V5O1xuICAgICAgICBpZiAobmFtZS5sZW5ndGggPD0ga2V5TmFtZS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgY2ggPSBuYW1lW2tleU5hbWUubGVuZ3RoXTtcbiAgICAgICAgaWYgKGNoICE9IFwiLlwiICYmIGNoICE9IFwiW1wiKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGtleU5hbWUgPT0gbmFtZS5zdWJzdHIoMCwga2V5TmFtZS5sZW5ndGgpKSByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldE9iamVjdFZhbHVlKG9iajogYW55LCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgfVxuICBwcml2YXRlIGdldEludFZhbHVlKHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PSBcIjBcIiB8fCAoKHN0ciB8IDApID4gMCAmJiBzdHIgJSAxID09IDApKSByZXR1cm4gTnVtYmVyKHN0cik7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uUHJvY2Vzc1ZhbHVlLnRzIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyB0aGUgc3RyaW5nIHRoYXQgc3VwcG9ydHMgbXVsdGktbGFuZ3VhZ2VzIGFuZCBtYXJrZG93bi5cbiAqIEl0IHVzZXMgaW4gYWxsIG9iamVjdHMgd2hlcmUgc3VwcG9ydCBmb3IgbXVsdGktbGFuZ3VhZ2VzIGFuZCBtYXJrZG93biBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsaXphYmxlU3RyaW5nIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBkZWZhdWx0TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgPSB2YWw7XG4gIH1cbiAgcHJpdmF0ZSB2YWx1ZXMgPSB7fTtcbiAgcHJpdmF0ZSBodG1sVmFsdWVzID0ge307XG4gIHByaXZhdGUgcmVuZGVyZWRUZXh0OiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNhbGN1bGF0ZWRUZXh0VmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBvbkdldFRleHRDYWxsYmFjazogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgb25TdHJDaGFuZ2VkOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgc2hhcmVkRGF0YTogTG9jYWxpemFibGVTdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgcHVibGljIHVzZU1hcmtkb3duOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIgPyB0aGlzLm93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc3RyQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlZFRleHQgPT09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUgPSB0aGlzLmNhbFRleHQoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlZFRleHQgIT09IHRoaXMuY2FsY3VsYXRlZFRleHRWYWx1ZSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFRleHQgPSBudWxsO1xuICAgICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlID0gbnVsbDtcbiAgICAgIHRoaXMub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnB1cmVUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgY2FsY3VsYXRlZFRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnJlbmRlcmVkVGV4dCA9XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUgIT09IG51bGxcbiAgICAgICAgPyB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWVcbiAgICAgICAgOiB0aGlzLmNhbFRleHQoKTtcbiAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkVGV4dDtcbiAgfVxuICBwcml2YXRlIGNhbFRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5wdXJlVGV4dDtcbiAgICBpZiAoXG4gICAgICByZXMgJiZcbiAgICAgIHRoaXMub3duZXIgJiZcbiAgICAgIHRoaXMub3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCAmJlxuICAgICAgcmVzLmluZGV4T2YoXCJ7XCIpID4gLTFcbiAgICApIHtcbiAgICAgIHJlcyA9IHRoaXMub3duZXIuZ2V0UHJvY2Vzc2VkVGV4dChyZXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vbkdldFRleHRDYWxsYmFjaykgcmVzID0gdGhpcy5vbkdldFRleHRDYWxsYmFjayhyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBwdXJlVGV4dCgpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5sb2NhbGU7XG4gICAgaWYgKCFsb2MpIGxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlKGxvYyk7XG4gICAgaWYgKCFyZXMgJiYgbG9jID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKSB7XG4gICAgICByZXMgPSB0aGlzLmdldFZhbHVlKHN1cnZleUxvY2FsaXphdGlvbi5kZWZhdWx0TG9jYWxlKTtcbiAgICB9XG4gICAgaWYgKCFyZXMgJiYgbG9jICE9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSkge1xuICAgICAgcmVzID0gdGhpcy5nZXRWYWx1ZShzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSk7XG4gICAgfVxuICAgIGlmICghcmVzKSByZXMgPSBcIlwiO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBoYXNIdG1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWxWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaHRtbCgpIHtcbiAgICBpZiAoIXRoaXMuaGFzSHRtbCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SHRtbFZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlc0tleXMoKS5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHRPckh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzSHRtbCA/IHRoaXMuZ2V0SHRtbFZhbHVlKCkgOiB0aGlzLmNhbGN1bGF0ZWRUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLnRleHRPckh0bWw7XG4gIH1cbiAgcHVibGljIHNldCB0ZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsZVRleHQodGhpcy5sb2NhbGUsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlVGV4dChsb2M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFsb2MpIGxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlKGxvYyk7XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KGxvYykpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgbG9jICYmXG4gICAgICBsb2MgIT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgJiZcbiAgICAgICF0aGlzLmdldFZhbHVlKGxvYykgJiZcbiAgICAgIHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgaWYgKCFsb2MpIGxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgIGRlbGV0ZSAoPGFueT50aGlzKS5odG1sVmFsdWVzW2xvY107XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuZ2V0VmFsdWUobG9jKSkgdGhpcy5kZWxldGVWYWx1ZShsb2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBsb2MgIT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgJiZcbiAgICAgICAgICB2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQoc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChsb2MsIG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUobG9jLCB2YWx1ZSk7XG4gICAgICAgICAgaWYgKGxvYyA9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVWYWx1ZXNFcXVhbHNUb0RlZmF1bHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0ckNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgaGFzTm9uRGVmYXVsdFRleHQoKTogYm9vbGVhbiB7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzLmxlbmd0aCA+IDEgfHwga2V5c1swXSAhPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHJldHVybiB0aGlzLmdldEpzb24oKTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMSAmJiBrZXlzWzBdID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKVxuICAgICAgcmV0dXJuICg8YW55PnRoaXMpLnZhbHVlc1trZXlzWzBdXTtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkge1xuICAgICAgdGhpcy5zZXRKc29uKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB0aGlzLmh0bWxWYWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KG51bGwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChrZXksIHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0ckNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZXF1YWxzKG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSByZXR1cm4gdGhpcy5lcXVhbHMob2JqKTtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLnZhbHVlcykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZXMsIG9iai52YWx1ZXMpO1xuICB9XG4gIHB1YmxpYyBvbkNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMub25TdHJDaGFuZ2VkKSB0aGlzLm9uU3RyQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJpdmF0ZSBoYXNIdG1sVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLm93bmVyIHx8ICF0aGlzLnVzZU1hcmtkb3duKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlbmRlcmVkVGV4dCA9IHRoaXMuY2FsY3VsYXRlZFRleHQ7XG4gICAgaWYgKCFyZW5kZXJlZFRleHQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbG9jID0gdGhpcy5sb2NhbGU7XG4gICAgaWYgKCFsb2MpIGxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXSA9IHRoaXMub3duZXIuZ2V0TWFya2Rvd25IdG1sKHJlbmRlcmVkVGV4dCk7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldEh0bWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXTtcbiAgfVxuICBwcml2YXRlIGRlbGV0ZVZhbHVlc0VxdWFsc1RvRGVmYXVsdChkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoa2V5c1tpXSA9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5nZXRWYWx1ZShrZXlzW2ldKSA9PSBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5kZWxldGVWYWx1ZShrZXlzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZShsb2M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSByZXR1cm4gdGhpcy5zaGFyZWREYXRhLmdldFZhbHVlKGxvYyk7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLnZhbHVlc1tsb2NdO1xuICB9XG4gIHByaXZhdGUgc2V0VmFsdWUobG9jOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHRoaXMuc2hhcmVkRGF0YS5zZXRWYWx1ZShsb2MsIHZhbHVlKTtcbiAgICBlbHNlICg8YW55PnRoaXMpLnZhbHVlc1tsb2NdID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBkZWxldGVWYWx1ZShsb2M6IHN0cmluZykge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgdGhpcy5zaGFyZWREYXRhLmRlbGV0ZVZhbHVlKGxvYyk7XG4gICAgZWxzZSBkZWxldGUgKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZXNLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHJldHVybiB0aGlzLnNoYXJlZERhdGEuZ2V0VmFsdWVzS2V5cygpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YWJsZXN0cmluZy50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvblVuY29udHJvbGxlZEVsZW1lbnRcbn0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fY29tbWVudFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25Db21tZW50IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25VbmNvbnRyb2xsZWRFbGVtZW50PFxuICBRdWVzdGlvbkNvbW1lbnRNb2RlbFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBvbkJsdXIgPSAhdGhpcy5xdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZVxuICAgICAgPyB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudFxuICAgICAgOiBudWxsO1xuICAgIHZhciBvbklucHV0ID0gdGhpcy5xdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZVxuICAgICAgPyB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudFxuICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfVxuICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgcmVmPXt0ZXR4YXJlYSA9PiAodGhpcy5jb250cm9sID0gdGV0eGFyZWEpfVxuICAgICAgICBtYXhMZW5ndGg9e3RoaXMucXVlc3Rpb24uZ2V0TWF4TGVuZ3RoKCl9XG4gICAgICAgIHBsYWNlaG9sZGVyPXt0aGlzLnF1ZXN0aW9uLnBsYWNlSG9sZGVyfVxuICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgb25JbnB1dD17b25JbnB1dH1cbiAgICAgICAgb25DaGFuZ2U9e3RoaXMudXBkYXRlVmFsdWVPbkV2ZW50fVxuICAgICAgICBjb2xzPXt0aGlzLnF1ZXN0aW9uLmNvbHN9XG4gICAgICAgIHJvd3M9e3RoaXMucXVlc3Rpb24ucm93c31cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0gZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGxldCBxdWVzdGlvbiA9IHRoaXMucHJvcHMucXVlc3Rpb247XG4gICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgbGV0IGNsYXNzTmFtZSA9IHRoaXMucHJvcHMub3RoZXJDc3MgfHwgdGhpcy5jc3NDbGFzc2VzLmNvbW1lbnQ7XG4gICAgbGV0IGhhbmRsZU9uQ2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBjb21tZW50OiBldmVudC50YXJnZXQudmFsdWUgfSk7XG4gICAgfTtcbiAgICBsZXQgdXBkYXRlVmFsdWVPbkV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHF1ZXN0aW9uLmNvbW1lbnQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgfTtcbiAgICB2YXIgb25CbHVyID0gIXF1ZXN0aW9uLmlzU3VydmV5SW5wdXRUZXh0VXBkYXRlID8gdXBkYXRlVmFsdWVPbkV2ZW50IDogbnVsbDtcbiAgICB2YXIgb25JbnB1dCA9IHF1ZXN0aW9uLmlzU3VydmV5SW5wdXRUZXh0VXBkYXRlID8gdXBkYXRlVmFsdWVPbkV2ZW50IDogbnVsbDtcblxuICAgIGxldCBjb21tZW50ID1cbiAgICAgICEhdGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLmNvbW1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuc3RhdGUuY29tbWVudFxuICAgICAgICA6IHF1ZXN0aW9uLmNvbW1lbnQgfHwgXCJcIjtcbiAgICByZXR1cm4gKFxuICAgICAgPHRleHRhcmVhXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICB2YWx1ZT17Y29tbWVudH1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgbWF4TGVuZ3RoPXtxdWVzdGlvbi5nZXRPdGhlcnNNYXhMZW5ndGgoKX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3F1ZXN0aW9uLm90aGVyUGxhY2VIb2xkZXJ9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uSW5wdXQ9e29uSW5wdXR9XG4gICAgICAgIGFyaWEtbGFiZWw9e3F1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uQ29tbWVudCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmNvbW1lbnQudHN4IiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJlYWN0RWxlbWVudEZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBSZWFjdEVsZW1lbnRGYWN0b3J5ID0gbmV3IFJlYWN0RWxlbWVudEZhY3RvcnkoKTtcbiAgcHJpdmF0ZSBjcmVhdG9ySGFzaDogSGFzaFRhYmxlPChuYW1lOiBzdHJpbmcpID0+IEpTWC5FbGVtZW50PiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlckVsZW1lbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICBlbGVtZW50Q3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gSlNYLkVsZW1lbnRcbiAgKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV0gPSBlbGVtZW50Q3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBpc0VsZW1lbnRSZWdpc2dlcmVkKGVsZW1lbnRUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gISF0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgfVxuICBwdWJsaWMgY3JlYXRlRWxlbWVudChlbGVtZW50VHlwZTogc3RyaW5nLCBwYXJhbXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjcmVhdG9yKHBhcmFtcyk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9lbGVtZW50LWZhY3RvcnkudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCwgU3VydmV5RXJyb3IsIEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50QmFzZSwgUmVhY3RTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFN1cnZleUN1c3RvbVdpZGdldCB9IGZyb20gXCIuL2N1c3RvbS13aWRnZXRcIjtcbmltcG9ydCB7IFJlYWN0RWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5Q3JlYXRvciB7XG4gIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb24pOiBKU1guRWxlbWVudDtcbiAgcmVuZGVyRXJyb3Ioa2V5OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvciwgY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQ7XG4gIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmc7XG4gIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbiBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcbiAgcHVibGljIHN0YXRpYyByZW5kZXJRdWVzdGlvbkJvZHkoXG4gICAgY3JlYXRvcjogSVN1cnZleUNyZWF0b3IsXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXF1ZXN0aW9uLnZpc2libGUpIHJldHVybiBudWxsO1xuICAgIHZhciBjdXN0b21XaWRnZXQgPSBxdWVzdGlvbi5jdXN0b21XaWRnZXQ7XG4gICAgaWYgKCFjdXN0b21XaWRnZXQpIHtcbiAgICAgIHJldHVybiBjcmVhdG9yLmNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiA8U3VydmV5Q3VzdG9tV2lkZ2V0IGNyZWF0b3I9e2NyZWF0b3J9IHF1ZXN0aW9uPXtxdWVzdGlvbn0vPjtcbiAgfVxuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdGF0ZUVsZW1lbnQoKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZWxlbWVudDtcbiAgfVxuICBwcml2YXRlIGdldCBjcmVhdG9yKCk6IElTdXJ2ZXlDcmVhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jcmVhdG9yO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgaWYgKCEhdGhpcy5xdWVzdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvbltcInJlYWN0XCJdID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5kb0FmdGVyUmVuZGVyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAoISF0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uW1wicmVhY3RcIl0gPSBudWxsO1xuICAgIH1cbiAgICB2YXIgZWw6IGFueSA9IHRoaXMucmVmc1tcInJvb3RcIl07XG4gICAgaWYgKCEhZWwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtcmVuZGVyZWRcIik7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IGFueSwgcHJldlN0YXRlOiBhbnkpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpO1xuICAgIHRoaXMuZG9BZnRlclJlbmRlcigpO1xuICB9XG4gIHByaXZhdGUgZG9BZnRlclJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgdmFyIGVsOiBhbnkgPSB0aGlzLnJlZnNbXCJyb290XCJdO1xuICAgICAgaWYgKFxuICAgICAgICBlbCAmJlxuICAgICAgICB0aGlzLnF1ZXN0aW9uLnN1cnZleSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIpICE9PSBcInJcIlxuICAgICAgKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcmVuZGVyZWRcIiwgXCJyXCIpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJuYW1lXCIsIHRoaXMucXVlc3Rpb24ubmFtZSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24uc3VydmV5LmFmdGVyUmVuZGVyUXVlc3Rpb24odGhpcy5xdWVzdGlvbiwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb247XG5cbiAgICBpZiAoIXF1ZXN0aW9uIHx8ICF0aGlzLmNyZWF0b3IpIHJldHVybiBudWxsO1xuICAgIGlmICghcXVlc3Rpb24uaXNWaXNpYmxlKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIHF1ZXN0aW9uUmVuZGVyID0gdGhpcy5yZW5kZXJRdWVzdGlvbigpO1xuICAgIHZhciBoZWFkZXIgPSB0aGlzLnJlbmRlckhlYWRlcihxdWVzdGlvbik7XG4gICAgdmFyIGhlYWRlclRvcCA9IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0VG9wID8gaGVhZGVyIDogbnVsbDtcbiAgICB2YXIgaGVhZGVyQm90dG9tID0gcXVlc3Rpb24uaGFzVGl0bGVPbkJvdHRvbSA/IGhlYWRlciA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0aW9uVW5kZXJJbnB1dCA9IHF1ZXN0aW9uLmhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dFxuICAgICAgPyB0aGlzLnJlbmRlckRlc2NyaXB0aW9uKGNzc0NsYXNzZXMsIHRydWUpXG4gICAgICA6IG51bGw7XG4gICAgdmFyIGNvbnRlbnRDbGFzcyA9XG4gICAgICBxdWVzdGlvbi5jc3NDbGFzc2VzLmNvbnRlbnQgK1xuICAgICAgKHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0ID8gXCIgXCIgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLmNvbnRlbnRMZWZ0IDogXCJcIik7XG4gICAgbGV0IHF1ZXN0aW9uUm9vdENsYXNzID0gcXVlc3Rpb24uY3NzTWFpblJvb3Q7XG4gICAgaWYgKHF1ZXN0aW9uLmNzc0NsYXNzZXMuc21hbGwgJiYgIXF1ZXN0aW9uLndpZHRoKSB7XG4gICAgICBxdWVzdGlvblJvb3RDbGFzcyArPSBcIiBcIiArIHF1ZXN0aW9uLmNzc0NsYXNzZXMuc21hbGw7XG4gICAgfVxuXG4gICAgdmFyIGNvbW1lbnQgPVxuICAgICAgcXVlc3Rpb24gJiYgcXVlc3Rpb24uaGFzQ29tbWVudCA/IHRoaXMucmVuZGVyQ29tbWVudChjc3NDbGFzc2VzKSA6IG51bGw7XG4gICAgdmFyIGVycm9yc1RvcCA9XG4gICAgICB0aGlzLmNyZWF0b3IucXVlc3Rpb25FcnJvckxvY2F0aW9uKCkgPT09IFwidG9wXCJcbiAgICAgICAgPyB0aGlzLnJlbmRlckVycm9ycyhjc3NDbGFzc2VzLCBcInRvcFwiKVxuICAgICAgICA6IG51bGw7XG4gICAgdmFyIGVycm9yc0JvdHRvbSA9XG4gICAgICB0aGlzLmNyZWF0b3IucXVlc3Rpb25FcnJvckxvY2F0aW9uKCkgPT09IFwiYm90dG9tXCJcbiAgICAgICAgPyB0aGlzLnJlbmRlckVycm9ycyhjc3NDbGFzc2VzLCBcImJvdHRvbVwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHJvb3RTdHlsZTogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgaWYgKHF1ZXN0aW9uLnJlbmRlcldpZHRoKSByb290U3R5bGVbXCJ3aWR0aFwiXSA9IHF1ZXN0aW9uLnJlbmRlcldpZHRoO1xuICAgIGlmICghIXF1ZXN0aW9uLnBhZGRpbmdMZWZ0KSByb290U3R5bGVbXCJwYWRkaW5nTGVmdFwiXSA9IHF1ZXN0aW9uLnBhZGRpbmdMZWZ0O1xuICAgIGlmICghIXF1ZXN0aW9uLnBhZGRpbmdSaWdodClcbiAgICAgIHJvb3RTdHlsZVtcInBhZGRpbmdSaWdodFwiXSA9IHF1ZXN0aW9uLnBhZGRpbmdSaWdodDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9XCJyb290XCJcbiAgICAgICAgaWQ9e3F1ZXN0aW9uLmlkfVxuICAgICAgICBjbGFzc05hbWU9e3F1ZXN0aW9uUm9vdENsYXNzfVxuICAgICAgICBzdHlsZT17cm9vdFN0eWxlfVxuICAgICAgPlxuICAgICAgICB7aGVhZGVyVG9wfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y29udGVudENsYXNzfT5cbiAgICAgICAgICB7ZXJyb3JzVG9wfVxuICAgICAgICAgIHtxdWVzdGlvblJlbmRlcn1cbiAgICAgICAgICB7Y29tbWVudH1cbiAgICAgICAgICB7ZXJyb3JzQm90dG9tfVxuICAgICAgICAgIHtkZXNjcmlwdGlvblVuZGVySW5wdXR9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7aGVhZGVyQm90dG9tfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUXVlc3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiBTdXJ2ZXlRdWVzdGlvbi5yZW5kZXJRdWVzdGlvbkJvZHkodGhpcy5jcmVhdG9yLCB0aGlzLnF1ZXN0aW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGUoY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHZhciB0aXRsZVRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NUaXRsZSk7XG4gICAgdmFyIG51bWJlciA9IG51bGw7XG4gICAgdmFyIGRlbGltaXRlciA9IG51bGw7XG4gICAgdmFyIHF1ZXN0aW9uTnVtYmVyID0gdGhpcy5xdWVzdGlvbltcIm5vXCJdO1xuICAgIGlmIChxdWVzdGlvbk51bWJlcikge1xuICAgICAgbnVtYmVyID0gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMubnVtYmVyfSBzdHlsZT17eyBwb3NpdGlvbjogXCJzdGF0aWNcIiB9fT5cbiAgICAgICAgICB7cXVlc3Rpb25OdW1iZXJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgICBkZWxpbWl0ZXIgPSA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMubnVtYmVyfT4ue1wiXFx1MDBBMFwifTwvc3Bhbj47XG4gICAgfVxuXG4gICAgdmFyIHJlcXVyZWRTcGFuID0gdGhpcy5xdWVzdGlvbi5nZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKSA/IG51bGwgOiAoXG4gICAgICA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucmVxdWlyZWRUZXh0fT5cbiAgICAgICAge3RoaXMucXVlc3Rpb24ucmVxdWlyZWRUZXh0fVxuICAgICAgPC9zcGFuPlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGg1XG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5nZXRUaXRsZUNsYXNzKHRoaXMucXVlc3Rpb24pfVxuICAgICAgICB0aXRsZT17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICA+XG4gICAgICAgIHtudW1iZXJ9XG4gICAgICAgIHtkZWxpbWl0ZXJ9XG4gICAgICAgIHt0aXRsZVRleHR9XG4gICAgICAgIHtyZXF1cmVkU3Bhbn1cbiAgICAgIDwvaDU+XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFRpdGxlQ2xhc3MoZWxlbWVudDogUXVlc3Rpb24pIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGVsZW1lbnQuY3NzQ2xhc3NlcztcbiAgICB2YXIgcmVzdWx0ID0gY3NzQ2xhc3Nlcy50aXRsZTtcbiAgICBpZiAoZWxlbWVudC5jb250YWluc0Vycm9ycykge1xuICAgICAgcmVzdWx0ICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy50aXRsZU9uRXJyb3I7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LmlzQW5zd2VyZWQpIHtcbiAgICAgIHJlc3VsdCArPSBcIiBcIiArIGNzc0NsYXNzZXMudGl0bGVPbkFuc3dlcjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJEZXNjcmlwdGlvbihcbiAgICBjc3NDbGFzc2VzOiBhbnksXG4gICAgaXNVbmRlcklucHV0OiBib29sZWFuID0gZmFsc2VcbiAgKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBkZXNjcmlwdGlvblRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcoXG4gICAgICB0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uXG4gICAgKTtcbiAgICB2YXIgY2xhc3NOYW1lID0gaXNVbmRlcklucHV0XG4gICAgICA/IGNzc0NsYXNzZXMuZGVzY3JpcHRpb25VbmRlcklucHV0XG4gICAgICA6IGNzc0NsYXNzZXMuZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9PntkZXNjcmlwdGlvblRleHR9PC9kaXY+O1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJDb21tZW50KGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICAvLyB2YXIgY29tbWVudFRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcoXG4gICAgLy8gICB0aGlzLnF1ZXN0aW9uLmxvY0NvbW1lbnRUZXh0XG4gICAgLy8gKTtcbiAgICB2YXIgY29tbWVudFRleHQgPSB0aGlzLnF1ZXN0aW9uLmNvbW1lbnRUZXh0O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmZvcm1Hcm91cH0+XG4gICAgICAgIDxkaXY+e2NvbW1lbnRUZXh0fTwvZGl2PlxuICAgICAgICA8U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbVxuICAgICAgICAgIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgb3RoZXJDc3M9e2Nzc0NsYXNzZXMub3RoZXJ9XG4gICAgICAgICAgaXNEaXNwbGF5TW9kZT17dGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5fVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVySGVhZGVyKHF1ZXN0aW9uOiBRdWVzdGlvbik6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIHRpdGxlID0gcXVlc3Rpb24uaGFzVGl0bGUgPyB0aGlzLnJlbmRlclRpdGxlKGNzc0NsYXNzZXMpIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSBxdWVzdGlvbi5oYXNEZXNjcmlwdGlvblVuZGVyVGl0bGVcbiAgICAgID8gdGhpcy5yZW5kZXJEZXNjcmlwdGlvbihjc3NDbGFzc2VzKVxuICAgICAgOiBudWxsO1xuICAgIHZhciBoZWFkZXJDbGFzcyA9IGNzc0NsYXNzZXMuaGVhZGVyO1xuICAgIGlmIChxdWVzdGlvbi5oYXNUaXRsZU9uVG9wKSB7XG4gICAgICBoZWFkZXJDbGFzcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaGVhZGVyVG9wO1xuICAgIH1cbiAgICBpZiAocXVlc3Rpb24uaGFzVGl0bGVPbkxlZnQpIHtcbiAgICAgIGhlYWRlckNsYXNzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5oZWFkZXJMZWZ0O1xuICAgIH1cbiAgICBpZiAocXVlc3Rpb24uaGFzVGl0bGVPbkJvdHRvbSkge1xuICAgICAgaGVhZGVyQ2xhc3MgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmhlYWRlckJvdHRvbTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtoZWFkZXJDbGFzc30+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgICAge2Rlc2NyaXB0aW9ufVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRXJyb3JzKGNzc0NsYXNzZXM6IGFueSwgbG9jYXRpb246IHN0cmluZyk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1cnZleUVsZW1lbnRFcnJvcnNcbiAgICAgICAgZWxlbWVudD17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc31cbiAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICBsb2NhdGlvbj17bG9jYXRpb259XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RFbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckVsZW1lbnQoXCJxdWVzdGlvblwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uLCBwcm9wcyk7XG59KTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnRFcnJvcnMgZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBlbGVtZW50KCk6IFN1cnZleUVsZW1lbnQge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5wcm9wcy5lbGVtZW50O1xuICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgU3VydmV5RWxlbWVudCA/IGVsZW1lbnQgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgZ2V0IGNyZWF0b3IoKTogSVN1cnZleUNyZWF0b3Ige1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNyZWF0b3I7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBsb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmxvY2F0aW9uO1xuICB9XG4gIHByaXZhdGUgZ2V0U3RhdGUocHJldlN0YXRlOiBhbnkgPSBudWxsKSB7XG4gICAgcmV0dXJuICFwcmV2U3RhdGUgPyB7IGVycm9yOiAwIH0gOiB7IGVycm9yOiBwcmV2U3RhdGUuZXJyb3IgKyAxIH07XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudCB8fCB0aGlzLmVsZW1lbnQuZXJyb3JzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZXJyb3JzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnQuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gXCJlcnJvclwiICsgaTtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0b3IucmVuZGVyRXJyb3Ioa2V5LCB0aGlzLmVsZW1lbnQuZXJyb3JzW2ldLCB0aGlzLmNzc0NsYXNzZXMpXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgY2xhc3NlcyA9IHRoaXMuY3NzQ2xhc3Nlcy5lcnJvci5yb290O1xuXG4gICAgaWYgKHRoaXMubG9jYXRpb24gPT09IFwidG9wXCIpIHtcbiAgICAgIGNsYXNzZXMgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuZXJyb3IubG9jYXRpb25Ub3A7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2F0aW9uID09PSBcImJvdHRvbVwiKSB7XG4gICAgICBjbGFzc2VzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLmVycm9yLmxvY2F0aW9uQm90dG9tO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgIHtlcnJvcnN9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGwgZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjcmVhdG9yKCk6IElTdXJ2ZXlDcmVhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jcmVhdG9yO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICB0aGlzLmRvQWZ0ZXJSZW5kZXIoKTtcbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICB2YXIgZWw6IGFueSA9IHRoaXMucmVmc1tcImNlbGxcIl07XG4gICAgICBpZiAoISFlbCkge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBhbnksIHByZXZTdGF0ZTogYW55KSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKTtcbiAgICB0aGlzLmRvQWZ0ZXJSZW5kZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9BZnRlclJlbmRlcigpIHt9XG4gIHByb3RlY3RlZCBnZXRDZWxsQ2xhc3MoKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGVycm9yc0xvY2F0aW9uID0gdGhpcy5jcmVhdG9yLnF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpO1xuICAgIHZhciBlcnJvcnMgPSB0aGlzLnF1ZXN0aW9uLmlzVmlzaWJsZSA/IChcbiAgICAgIDxTdXJ2ZXlFbGVtZW50RXJyb3JzXG4gICAgICAgIGVsZW1lbnQ9e3RoaXMucXVlc3Rpb259XG4gICAgICAgIGNzc0NsYXNzZXM9e3RoaXMuY3NzQ2xhc3Nlc31cbiAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICBsb2NhdGlvbj17ZXJyb3JzTG9jYXRpb259XG4gICAgICAvPlxuICAgICkgOiBudWxsO1xuICAgIHZhciBlcnJvcnNUb3AgPSBlcnJvcnNMb2NhdGlvbiA9PT0gXCJ0b3BcIiA/IGVycm9ycyA6IG51bGw7XG4gICAgdmFyIGVycm9yc0JvdHRvbSA9IGVycm9yc0xvY2F0aW9uID09PSBcImJvdHRvbVwiID8gZXJyb3JzIDogbnVsbDtcbiAgICB2YXIgcmVuZGVyZWRDZWxsID0gdGhpcy5yZW5kZXJRdWVzdGlvbigpO1xuICAgIHJldHVybiAoXG4gICAgICA8dGRcbiAgICAgICAgcmVmPVwiY2VsbFwiXG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5nZXRDZWxsQ2xhc3MoKSArIFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLmNlbGx9XG4gICAgICAgIGhlYWRlcnM9e1xuICAgICAgICAgIHRoaXMucXVlc3Rpb24uaXNWaXNpYmxlICYmICEhdGhpc1tcImNlbGxcIl1cbiAgICAgICAgICAgID8gdGhpc1tcImNlbGxcIl0uY29sdW1uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbFxuICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAge2Vycm9yc1RvcH1cbiAgICAgICAge3JlbmRlcmVkQ2VsbH1cbiAgICAgICAge2Vycm9yc0JvdHRvbX1cbiAgICAgIDwvdGQ+XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlbmRlclF1ZXN0aW9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gU3VydmV5UXVlc3Rpb24ucmVuZGVyUXVlc3Rpb25Cb2R5KHRoaXMuY3JlYXRvciwgdGhpcy5xdWVzdGlvbik7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlXaW5kb3dNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlXaW5kb3dcIjtcblxuZXhwb3J0IGNsYXNzIFJlYWN0U3VydmV5TW9kZWwgZXh0ZW5kcyBTdXJ2ZXlNb2RlbCB7XG4gIHJlbmRlckNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnkgPSBudWxsKSB7XG4gICAgc3VwZXIoanNvbk9iaik7XG4gIH1cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJDYWxsYmFjaykge1xuICAgICAgdGhpcy5yZW5kZXJDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgbWVyZ2VDc3Moc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgIHRoaXMubWVyZ2VWYWx1ZXMoc3JjLCBkZXN0KTtcbiAgfVxuICBwdWJsaWMgZG9BZnRlclJlbmRlclN1cnZleShlbDogYW55KSB7XG4gICAgdGhpcy5hZnRlclJlbmRlclN1cnZleShlbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgIGlmICghIXRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2Uuc2V0V2FzU2hvd24oZmFsc2UpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHVibGljIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHN1cGVyLnNldENvbXBsZXRlZFN0YXRlKHZhbHVlLCB0ZXh0KTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHB1YmxpYyBzdGFydCgpIHtcbiAgICBzdXBlci5zdGFydCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlYWN0V2luZG93TW9kZWwgZXh0ZW5kcyBTdXJ2ZXlXaW5kb3dNb2RlbCB7XG4gIHJlbmRlckNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnkgPSBudWxsLCBtb2RlbDogUmVhY3RTdXJ2ZXlNb2RlbCA9IG51bGwpIHtcbiAgICBzdXBlcihqc29uT2JqLCBtb2RlbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShqc29uT2JqOiBhbnkpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBSZWFjdFN1cnZleU1vZGVsKGpzb25PYmopO1xuICB9XG59XG5cblN1cnZleU1vZGVsLnBsYXRmb3JtID0gXCJyZWFjdFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0c3VydmV5bW9kZWwudHN4IiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEJhc2UsIFN1cnZleUVycm9yLCBJU3VydmV5SW1wbCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgT3RoZXJFbXB0eUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IENob2ljZXNSZXN0ZnVsbCB9IGZyb20gXCIuL2Nob2ljZXNSZXN0ZnVsbFwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIEl0IGlzIGEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2VsZWN0QmFzZSBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHVibGljIHZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGZpbHRlcmVkQ2hvaWNlc1ZhbHVlOiBBcnJheTxJdGVtVmFsdWU+ID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgY29tbWVudFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcHJldkNvbW1lbnRWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIG90aGVySXRlbVZhbHVlOiBJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwib3RoZXJcIik7XG4gIHByaXZhdGUgY2hvaWNlc0Zyb21Vcmw6IEFycmF5PEl0ZW1WYWx1ZT4gPSBudWxsO1xuICBwcml2YXRlIGNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHM6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgaXNDaG9pY2VzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZW5hYmxlT25Mb2FkaW5nQ2hvaWNlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZmlsbCB0aGUgY2hvaWNlcyBmcm9tIGEgcmVzdGZ1bCBzZXJ2aWNlLlxuICAgKiBAc2VlIGNob2ljZXNcbiAgICovXG4gIHB1YmxpYyBjaG9pY2VzQnlVcmw6IENob2ljZXNSZXN0ZnVsbDtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY2hvaWNlcyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNob2ljZXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXNlbGYuZmlsdGVySXRlbXMoKSkge1xuICAgICAgICBzZWxmLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ2aXNpYmxlQ2hvaWNlc1wiKTtcbiAgICB0aGlzLmNob2ljZXNCeVVybCA9IHRoaXMuY3JlYXRlUmVzdGZ1bGwoKTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5vd25lciA9IHRoaXM7XG4gICAgdmFyIGxvY090aGVyVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMub3RoZXJJdGVtVmFsdWUubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMub3RoZXJJdGVtVmFsdWUuc2V0TG9jVGV4dChsb2NPdGhlclRleHQpO1xuICAgIGxvY090aGVyVGV4dC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5iZWZvcmVTZW5kUmVxdWVzdENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uQmVmb3JlU2VuZFJlcXVlc3QoKTtcbiAgICB9O1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLmdldFJlc3VsdENhbGxiYWNrID0gZnVuY3Rpb24oaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICAgIHNlbGYub25Mb2FkQ2hvaWNlc0Zyb21VcmwoaXRlbXMpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwudXBkYXRlUmVzdWx0Q2FsbGJhY2sgPSBmdW5jdGlvbihcbiAgICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgICApOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgIGlmIChzZWxmLnN1cnZleSkge1xuICAgICAgICByZXR1cm4gc2VsZi5zdXJ2ZXkudXBkYXRlQ2hvaWNlc0Zyb21TZXJ2ZXIoc2VsZiwgaXRlbXMsIHNlcnZlclJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJQbGFjZUhvbGRlclwiLCB0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNlbGVjdGJhc2VcIjtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG90aGVyIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICogQHNlZSBoYXNPdGhlclxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlckl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlckl0ZW1WYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgdXNlciBzZWxlY3QgdGhlICdvdGhlcicgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNPdGhlclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc090aGVyICYmIHRoaXMuZ2V0SGFzT3RoZXIodGhpcy5yZW5kZXJlZFZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggY2hvaWNlcyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqIEBzZWUgY2hvaWNlc0VuYWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNWaXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1Zpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNWaXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzVmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJdCBydW5zIGFnYWluc3QgZWFjaCBjaG9pY2VzIGl0ZW0gYW5kIGlmIGZvciB0aGlzIGl0ZW0gaXQgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBpdGVtIGlzIGVuYWJsZWQgb3RoZXJ3aXNlIHRoZSBpdGVtIGJlY29tZXMgZGlzYWJsZWQuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIGNob2ljZXNWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc0VuYWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNFbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNFbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNFbmFibGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5JdGVtc0VuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBpc1NldHRpbmdEZWZhdWx0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICB0aGlzLmlzU2V0dGluZ0RlZmF1bHRWYWx1ZSA9XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpICYmXG4gICAgICB0aGlzLmhhc1Vua25vd25WYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgdGhpcy5pc1NldHRpbmdEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgIXRoaXMuZGF0YSB8fFxuICAgICAgdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmdcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgcmV0dXJuIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB0aGlzLnNldENvbmRpdGlvbmFsQ2hvaWNlc1J1bm5lcigpO1xuICAgIHZhciBoYXNDaGFuZ2VzID0gdGhpcy5ydW5Db25kaXRpb25zRm9ySXRlbXModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgJiZcbiAgICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUubGVuZ3RoID09PSB0aGlzLmFjdGl2ZUNob2ljZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmICghIXRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlcztcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNFbmFibGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBhbnkge1xuICAgIHRoaXMuc2V0Q29uZGl0aW9uYWxFbmFibGVDaG9pY2VzUnVubmVyKCk7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuRW5hYmxlZENvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuYWN0aXZlQ2hvaWNlcyxcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuY2xlYXJEaXNhYmxlZFZhbHVlcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldENvbmRpdGlvbmFsQ2hvaWNlc1J1bm5lcigpIHtcbiAgICBpZiAodGhpcy5jaG9pY2VzVmlzaWJsZUlmKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKFxuICAgICAgICAgIHRoaXMuY2hvaWNlc1Zpc2libGVJZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmNob2ljZXNWaXNpYmxlSWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0Q29uZGl0aW9uYWxFbmFibGVDaG9pY2VzUnVubmVyKCkge1xuICAgIGlmICh0aGlzLmNob2ljZXNFbmFibGVJZikge1xuICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIoXG4gICAgICAgICAgdGhpcy5jaG9pY2VzRW5hYmxlSWZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmNob2ljZXNFbmFibGVJZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgPSBbXTtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuYWN0aXZlQ2hvaWNlcyxcbiAgICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzLFxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCA9PT0gdGhpcy5vdGhlckl0ZW0udmFsdWU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh0aGlzLnZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzdGZ1bGwoKTogQ2hvaWNlc1Jlc3RmdWxsIHtcbiAgICByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb21tZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5jb21tZW50VmFsdWUpIHJldHVybiB0aGlzLmNvbW1lbnRWYWx1ZTtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSByZXR1cm4gc3VwZXIuZ2V0Q29tbWVudCgpO1xuICAgIHJldHVybiB0aGlzLmNvbW1lbnRWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzU2V0dGluZ0NvbW1lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNldENvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmhhc0NvbW1lbnQgfHwgdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKVxuICAgICAgc3VwZXIuc2V0Q29tbWVudChuZXdWYWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuaXNTZXR0aW5nQ29tbWVudCAmJiBuZXdWYWx1ZSAhPSB0aGlzLmNvbW1lbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbW1lbnRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc090aGVyU2VsZWN0ZWQgJiYgIXRoaXMuaXNSZW5kZXJlZFZhbHVlU2V0dGluZykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YSh0aGlzLnJlbmRlcmVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nQ29tbWVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRWYWx1ZVwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbmRlcmVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFZhbHVlXCIsIHZhbCk7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZSwgbmV3VmFsdWUpKSByZXR1cm47XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRWYWx1ZVwiLCB0aGlzLnJlbmRyZWRWYWx1ZUZyb21EYXRhKG5ld1ZhbHVlKSk7XG4gICAgaWYgKHRoaXMuaGFzQ29tbWVudCkgcmV0dXJuO1xuICAgIHZhciBpc090aGVyU2VsID0gdGhpcy5pc090aGVyU2VsZWN0ZWQ7XG4gICAgaWYgKGlzT3RoZXJTZWwgJiYgISF0aGlzLnByZXZDb21tZW50VmFsdWUpIHtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gdGhpcy5wcmV2Q29tbWVudFZhbHVlO1xuICAgICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gXCJcIjtcbiAgICAgIHRoaXMuY29tbWVudCA9IG9sZENvbW1lbnQ7XG4gICAgfVxuICAgIGlmICghaXNPdGhlclNlbCAmJiAhIXRoaXMuY29tbWVudCkge1xuICAgICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkge1xuICAgICAgICB0aGlzLnByZXZDb21tZW50VmFsdWUgPSB0aGlzLmNvbW1lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbW1lbnQgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy52YWx1ZUZyb21EYXRhKG5ld1ZhbHVlKTtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuY2hvaWNlc0J5VXJsLmlzUnVubmluZyAmJlxuICAgICAgICAhdGhpcy5jaG9pY2VzQnlVcmwuaXNXYWl0aW5nRm9yUGFyYW1ldGVycykgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGxldCBjaG9pY2VpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuYWN0aXZlQ2hvaWNlcywgdmFsKTtcbiAgICBpZiAoISFjaG9pY2VpdGVtKSB7XG4gICAgICByZXR1cm4gY2hvaWNlaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWRWYWx1ZUZyb21EYXRhQ29yZSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMuaGFzVW5rbm93blZhbHVlKHZhbCwgdHJ1ZSkpIHJldHVybiB0aGlzLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgICB0aGlzLmNvbW1lbnQgPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlICYmIHRoaXMuZ2V0Q29tbWVudCgpKSB7XG4gICAgICB2YWwgPSB0aGlzLmdldENvbW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzVW5rbm93blZhbHVlKHZhbDogYW55LCBpbmNsdWRlT3RoZXI6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluY2x1ZGVPdGhlciAmJiB2YWwgPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuZmlsdGVyZWRDaG9pY2VzLCB2YWwpID09IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVEaXNhYmxlZCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBpdGVtVmFsdWUgPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5maWx0ZXJlZENob2ljZXMsIHZhbCk7XG4gICAgcmV0dXJuICEhaXRlbVZhbHVlICYmICFpdGVtVmFsdWUuaXNFbmFibGVkO1xuICB9XG4gIC8qKlxuICAgKiBJZiB0aGUgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDYWxsYmFjayBpcyBzZXQsIGl0IGlzIHVzZWQgdG8gY2xlYXIgaW5jb3JycmVjdCB2YWx1ZXMgaW5zdGVhZCBvZiBkZWZhdWx0IGJlaGF2aW91ci5cbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgY2hvaWNlc0J5VXJsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBoaWRlSWZDaG9pY2VzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhpZGVJZkNob2ljZXNFbXB0eVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoaWRlSWZDaG9pY2VzRW1wdHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBrZWVwSW5jb3JyZWN0VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZWVwSW5jb3JyZWN0VmFsdWVzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtlZXBJbmNvcnJlY3RWYWx1ZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2VlcEluY29ycmVjdFZhbHVlc1wiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsZWFzZSB1c2Ugc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb24gdGhlIHN1cnZleSBsZXZlbC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByaWNhdGVkIGFuZCBpbnZpc2libGUgaW4gU3VydmV5IENyZWF0b3IuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcImRlZmF1bHRcIiwgdHJ1ZSwgZmFsc2VcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5zdG9yZU90aGVyc0FzQ29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZU90aGVyc0FzQ29tbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZU90aGVyc0FzQ29tbWVudCh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciBpdGVtcyBpbiBhIHNwZWNpZmljIG9yZGVyOiBcImFzY1wiLCBcImRlc2NcIiwgXCJyYW5kb21cIi4gRGVmYXVsdCB2YWx1ZSBpcyBcIm5vbmVcIi5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc09yZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWwgPT0gdGhpcy5jaG9pY2VzT3JkZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG90aGVyIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyVGV4dFwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgcGxhY2UgaG9sZGVyIHRleHQgZm9yIG90aGVyIG9yIGNvbW1lbnQgZmllbGQgIC5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJQbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyUGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvdGhlclBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJQbGFjZUhvbGRlclwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgdGhhdCBzaG93cyB3aGVuIHRoZSBvdGhlciBpdGVtIGlzIGNob29zZWQgYnkgdGhlIG90aGVyIGlucHV0IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlckVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3RoZXJFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpdGVtcyBhcyB0aGV5IHdpbGwgYmUgcmVuZGVyZWQuIElmIG5lZWRlZCBpdGVtcyBhcmUgc29ydGVkIGFuZCB0aGUgb3RoZXIgaXRlbSBpcyBhZGRlZC5cbiAgICogQHNlZSBoYXNPdGhlclxuICAgKiBAc2VlIGNob2ljZXNPcmRlclxuICAgKiBAc2VlIGVuYWJsZWRDaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlQ2hvaWNlc1wiLCBbXSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVuYWJsZWQgaXRlbXMgYXMgdGhleSB3aWxsIGJlIHJlbmRlcmVkLiBUaGUgZGlzYWJsZWQgaXRlbXMgYXJlIG5vdCBpbmNsdWRlZFxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqIEBzZWUgdmlzaWJsZUNob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlZENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLmlzRW5hYmxlZCkgcmVzLnB1c2goaXRlbXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVWaXNpYmxlQ2hvaWNlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IG5ldyBBcnJheTxJdGVtVmFsdWU+KCk7XG4gICAgdmFyIGNhbGNWYWx1ZSA9IHRoaXMuY2FsY1Zpc2libGVDaG9pY2VzKCk7XG4gICAgaWYgKCFjYWxjVmFsdWUpIGNhbGNWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsY1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKGNhbGNWYWx1ZVtpXSk7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVDaG9pY2VzXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNhbGNWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBpZiAodGhpcy5jYW5Vc2VGaWx0ZXJlZENob2ljZXMoKSkgcmV0dXJuIHRoaXMuZmlsdGVyZWRDaG9pY2VzO1xuICAgIHZhciByZXMgPSB0aGlzLnNvcnRWaXNpYmxlQ2hvaWNlcyh0aGlzLmZpbHRlcmVkQ2hvaWNlcy5zbGljZSgpKTtcbiAgICB0aGlzLmFkZFRvVmlzaWJsZUNob2ljZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBjYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmhhc090aGVyICYmIHRoaXMuY2hvaWNlc09yZGVyID09IFwibm9uZVwiO1xuICB9XG4gIHByb3RlY3RlZCBhZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5vdGhlckl0ZW0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZVxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICB2YXIgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV07XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSB0cnVlO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHZhbHVlcy5tYXAoKGRhdGFWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgdmFyIGNob2ljZSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCBkYXRhVmFsdWUpO1xuICAgICAgICB2YXIgY2hvaWNlRGF0YUl0ZW0gPSA8YW55PntcbiAgICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAgICB0aXRsZTogXCJDaG9pY2VcIixcbiAgICAgICAgICB2YWx1ZTogZGF0YVZhbHVlLFxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdGhpcy5nZXRDaG9pY2VzRGlzcGxheVZhbHVlKFxuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlcyxcbiAgICAgICAgICAgIGRhdGFWYWx1ZVxuICAgICAgICAgICksXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICBpc05vZGU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghIWNob2ljZSkge1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaChjYWxjdWxhdGlvbiA9PiB7XG4gICAgICAgICAgICBjaG9pY2VEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID1cbiAgICAgICAgICAgICAgY2hvaWNlW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob2ljZURhdGFJdGVtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlbiByZXR1cm5zIGVtcHR5IHN0cmluZy4gSWYgJ290aGVyJyBpcyBzZWxlY3RlZCB0aGVuIHJldHVybnMgdGhlIHRleHQgZm9yIG90aGVyIHZhbHVlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXNEaXNwbGF5VmFsdWUoaXRlbXM6IEl0ZW1WYWx1ZVtdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm90aGVySXRlbVZhbHVlLnZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMuY29tbWVudCA/IHRoaXMuY29tbWVudCA6IHRoaXMubG9jT3RoZXJUZXh0LnRleHRPckh0bWw7XG4gICAgdmFyIHN0ciA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShpdGVtcywgdmFsKTtcbiAgICByZXR1cm4gc3RyID09IFwiXCIgJiYgdmFsID8gdmFsIDogc3RyO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpbHRlcmVkQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZVxuICAgICAgPyB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlXG4gICAgICA6IHRoaXMuYWN0aXZlQ2hvaWNlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlc0Zyb21VcmwgPyB0aGlzLmNob2ljZXNGcm9tVXJsIDogdGhpcy5nZXRDaG9pY2VzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlcztcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcbiAgICBpZiAoIXRoaXMuaGFzT3RoZXIgfHwgIXRoaXMuaXNPdGhlclNlbGVjdGVkIHx8IHRoaXMuY29tbWVudCkgcmV0dXJuO1xuICAgIGVycm9ycy5wdXNoKG5ldyBPdGhlckVtcHR5RXJyb3IodGhpcy5vdGhlckVycm9yVGV4dCwgdGhpcykpO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkge1xuICAgIGlmICh0aGlzLmlzU2V0dGluZ0RlZmF1bHRWYWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlT3RoZXJzQXNDb21tZW50ID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5zdG9yZU90aGVyc0FzQ29tbWVudCA9PSBcImRlZmF1bHRcIiAmJlxuICAgICAgICAodGhpcy5zdXJ2ZXkgIT0gbnVsbCA/IHRoaXMuc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IDogdHJ1ZSkpIHx8XG4gICAgICAoIXRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHkgJiYgIXRoaXMuY2hvaWNlc0Zyb21VcmwpXG4gICAgKTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgaWYgKG5hbWUgIT0gdGhpcy5nZXRWYWx1ZU5hbWUoKSkge1xuICAgICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBydW5DaG9pY2VzQnlVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmNob2ljZXNCeVVybCB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHByb2Nlc3NvciA9IHRoaXMuc3VydmV5SW1wbFxuICAgICAgPyB0aGlzLnN1cnZleUltcGwuZ2V0VGV4dFByb2Nlc3NvcigpXG4gICAgICA6IHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgICBpZiAoIXByb2Nlc3NvcikgcHJvY2Vzc29yID0gdGhpcy5zdXJ2ZXk7XG4gICAgaWYgKCFwcm9jZXNzb3IpIHJldHVybjtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IHRoaXMuaXNDaG9pY2VzTG9hZGVkIHx8IHRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHk7XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwucnVuKHByb2Nlc3Nvcik7XG4gIH1cbiAgcHJpdmF0ZSBpc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIG9uQmVmb3JlU2VuZFJlcXVlc3QoKSB7XG4gICAgaWYgKHNldHRpbmdzLmRpc2FibGVPbkdldHRpbmdDaG9pY2VzRnJvbVdlYiA9PT0gdHJ1ZSAmJiAhdGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICB0aGlzLmVuYWJsZU9uTG9hZGluZ0Nob2ljZXMgPSB0cnVlO1xuICAgICAgdGhpcy5yZWFkT25seSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRDaG9pY2VzRnJvbVVybChhcnJheTogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGlmICh0aGlzLmVuYWJsZU9uTG9hZGluZ0Nob2ljZXMpIHtcbiAgICAgIHRoaXMucmVhZE9ubHkgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIGlmICh0aGlzLmNob2ljZXNCeVVybCAmJiB0aGlzLmNob2ljZXNCeVVybC5lcnJvcikge1xuICAgICAgICBlcnJvcnMucHVzaCh0aGlzLmNob2ljZXNCeVVybC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB9XG4gICAgdmFyIG5ld0Nob2ljZXMgPSBudWxsO1xuICAgIHZhciBjaGVja0NhY2hlZFZhbHVlc09uRXhpc3RpbmcgPSB0cnVlO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNGaXJzdExvYWRDaG9pY2VzRnJvbVVybCAmJlxuICAgICAgIXRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyAmJlxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVcbiAgICApIHtcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgY2hlY2tDYWNoZWRWYWx1ZXNPbkV4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMpKSB7XG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgPSB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICB0aGlzLmlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgPSBmYWxzZTtcbiAgICB2YXIgY2FjaGVkVmFsdWVzID0gdGhpcy5jcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzLFxuICAgICAgY2hlY2tDYWNoZWRWYWx1ZXNPbkV4aXN0aW5nXG4gICAgKTtcbiAgICBpZiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgbmV3Q2hvaWNlcyA9IG5ldyBBcnJheTxJdGVtVmFsdWU+KCk7XG4gICAgICBJdGVtVmFsdWUuc2V0RGF0YShuZXdDaG9pY2VzLCBhcnJheSk7XG4gICAgfVxuICAgIHRoaXMuY2hvaWNlc0Zyb21VcmwgPSBuZXdDaG9pY2VzO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgaWYgKG5ld0Nob2ljZXMpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgICAgY2FjaGVkVmFsdWVzLFxuICAgICAgICBuZXdDaG9pY2VzXG4gICAgICApO1xuICAgICAgaWYgKCEhbmV3VmFsdWUgJiYgIXRoaXMuaXNSZWFkT25seSkge1xuICAgICAgICB0aGlzLmxvY05vdGlmaWNhdGlvbkluRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubG9jTm90aWZpY2F0aW9uSW5EYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaG9pY2VzTG9hZGVkKCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIGNoZWNrT25FeGlzdGluZzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YXIgcmVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLmNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHModmFsW2ldLCB0cnVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB2YXIgaXNFeGlzdHMgPSBjaGVja09uRXhpc3RpbmcgPyAhdGhpcy5oYXNVbmtub3duVmFsdWUodmFsKSA6IHRydWU7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbCwgaXNFeGlzdHM6IGlzRXhpc3RzIH07XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIG5ld0Nob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT5cbiAgKTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgICAgICB2YWxbaV0sXG4gICAgICAgICAgbmV3Q2hvaWNlc1xuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZFZhbHVlICYmICF0aGlzLmlzVmFsdWVFbXB0eSh1cGRhdGVkVmFsdWUudmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdXBkYXRlZFZhbHVlLnZhbHVlO1xuICAgICAgICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKG5ld0Nob2ljZXMsIHVwZGF0ZWRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiByZXMgfTtcbiAgICB9XG4gICAgdmFyIHZhbHVlID1cbiAgICAgIHZhbC5pc0V4aXN0cyAmJiB0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwudmFsdWUpID8gbnVsbCA6IHZhbC52YWx1ZTtcbiAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShuZXdDaG9pY2VzLCB2YWx1ZSk7XG4gICAgaWYgKCEhaXRlbSkge1xuICAgICAgdmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDaG9pY2VzKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgICBpZiAoISF0aGlzLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrKVxuICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eUJhc2VkT25DaG9pY2VzKCkge1xuICAgIGlmICh0aGlzLmhpZGVJZkNob2ljZXNFbXB0eSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMuZmlsdGVyZWRDaG9pY2VzIHx8IHRoaXMuZmlsdGVyZWRDaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5jaG9pY2VzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT0gXCJhc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAxKTtcbiAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gdGhpcy5yYW5kb21pemVBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICBpZiAoYS5jYWxjdWxhdGVkVGV4dCA8IGIuY2FsY3VsYXRlZFRleHQpIHJldHVybiAtMSAqIG11bHQ7XG4gICAgICBpZiAoYS5jYWxjdWxhdGVkVGV4dCA+IGIuY2FsY3VsYXRlZFRleHQpIHJldHVybiAxICogbXVsdDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmFuZG9taXplQXJyYXkoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gSGVscGVycy5yYW5kb21pemVBcnJheTxJdGVtVmFsdWU+KGFycmF5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMua2VlcEluY29ycmVjdFZhbHVlcykgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiZcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQ291bnRCeVZhbHVlTmFtZSh0aGlzLmdldFZhbHVlTmFtZSgpKSA+IDFcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgaWYgKHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXNDYWxsYmFjaykge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXNDb3JlKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckRpc2FibGVkVmFsdWVzKCkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMuc3VydmV5LmNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcykgcmV0dXJuO1xuICAgIHRoaXMuY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDb3JlKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICh0aGlzLmNhbkNsZWFyVmFsdWVBblVua25vdyh2YWwpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNhbkNsZWFyVmFsdWVBblVua25vdyh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpICYmIHRoaXMuaXNPdGhlclNlbGVjdGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuaGFzVW5rbm93blZhbHVlKHZhbCwgdHJ1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyRGlzYWJsZWRWYWx1ZXNDb3JlKCkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVEaXNhYmxlZCh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHN1cGVyLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiAhdGhpcy5oYXNDb21tZW50KSB7XG4gICAgICB0aGlzLmNvbW1lbnQgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBnZXRDb2x1bW5DbGFzcygpIHtcbiAgICB2YXIgY29sdW1uQ2xhc3MgPSB0aGlzLmNzc0NsYXNzZXMuY29sdW1uO1xuICAgIGlmICh0aGlzLmhhc0NvbHVtbnMpIHtcbiAgICAgIGNvbHVtbkNsYXNzICs9IFwiIHN2LXEtY29sdW1uLVwiICsgdGhpcy5jb2xDb3VudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkNsYXNzO1xuICB9XG4gIGdldExhYmVsQ2xhc3MoaXNDaGVja2VkOiBib29sZWFuKSB7XG4gICAgdmFyIGxhYmVsQ2xhc3MgPSB0aGlzLmNzc0NsYXNzZXMubGFiZWw7XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgbGFiZWxDbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5sYWJlbENoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbENsYXNzO1xuICB9XG4gIGdldENvbnRyb2xMYWJlbENsYXNzKGlzQ2hlY2tlZDogYm9vbGVhbikge1xuICAgIHZhciBjb250cm9sTGFiZWxDbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5jb250cm9sTGFiZWw7XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgY29udHJvbExhYmVsQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuY29udHJvbExhYmVsQ2hlY2tlZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xMYWJlbENsYXNzO1xuICB9XG4gIGdldCBjb2x1bW5zKCkge1xuICAgIHZhciBjb2x1bW5zID0gW107XG4gICAgdmFyIGNvbENvdW50ID0gdGhpcy5jb2xDb3VudDtcbiAgICBpZiAodGhpcy5oYXNDb2x1bW5zICYmIHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2x1bW4gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IGk7IGogPCB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaiArPSBjb2xDb3VudCkge1xuICAgICAgICAgIGNvbHVtbi5wdXNoKHRoaXMudmlzaWJsZUNob2ljZXNbal0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuICBnZXQgaGFzQ29sdW1ucygpIHtcbiAgICByZXR1cm4gdGhpcy5jb2xDb3VudCA+IDE7XG4gIH1cbiAgcHVibGljIGNob2ljZXNMb2FkZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Nob2ljZXNMb2FkZWQgPSB0cnVlO1xuICAgIGxldCBvbGRJc1JlYWR5OiBib29sZWFuID0gdGhpcy5pc1JlYWR5VmFsdWU7XG4gICAgdGhpcy5pc1JlYWR5VmFsdWUgPSB0cnVlO1xuICAgIHRoaXMub25SZWFkeUNoYW5nZWQgJiZcbiAgICAgIHRoaXMub25SZWFkeUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgICAgICBpc1JlYWR5OiB0cnVlLFxuICAgICAgICBvbHNJc1JlYWR5OiBvbGRJc1JlYWR5XG4gICAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94IGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy4gSXQgaW50cm9kdWNlZCBhIGNvbENvdW50IHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveEJhc2UgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBjb2xDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94IHF1ZXN0aW9ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHRoaXMuaXNGbG93TGF5b3V0ID8gMCA6IDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA1IHx8IHRoaXMuaXNGbG93TGF5b3V0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsdWUpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByb3RlY3RlZCBvblBhcmVudENoYW5nZWQoKSB7XG4gICAgc3VwZXIub25QYXJlbnRDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuaXNGbG93TGF5b3V0KSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2VsZWN0YmFzZVwiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc0NvbW1lbnQ6Ym9vbGVhblwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIixcbiAgICAgIGxheW91dDogXCJyb3dcIlxuICAgIH0sXG4gICAgXCJoYXNPdGhlcjpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcIm90aGVyUGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY090aGVyUGxhY2VIb2xkZXJcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIik7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzQnlVcmw6cmVzdGZ1bGxcIixcbiAgICAgIGNsYXNzTmFtZTogXCJDaG9pY2VzUmVzdGZ1bGxcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouY2hvaWNlc0J5VXJsLmdldERhdGEoKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY2hvaWNlc0J5VXJsLnNldERhdGEodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgXCJoaWRlSWZDaG9pY2VzRW1wdHk6Ym9vbGVhblwiLFxuICAgIFwiY2hvaWNlc1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICBcImNob2ljZXNFbmFibGVJZjpjb25kaXRpb25cIixcbiAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlclRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJvdGhlckVycm9yVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3RoZXJFcnJvclRleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCB0cnVlLCBmYWxzZV0sXG4gICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH1cbiAgXSxcbiAgbnVsbCxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNoZWNrYm94YmFzZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNCwgNV0sXG4gICAgICBsYXlvdXQ6IFwicm93XCJcbiAgICB9XG4gIF0sXG4gIG51bGwsXG4gIFwic2VsZWN0YmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2Jhc2VzZWxlY3QudHMiLCJpbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3Nvckl0ZW0ge1xuICBwdWJsaWMgc3RhcnQ6IG51bWJlcjtcbiAgcHVibGljIGVuZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvclZhbHVlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNFeGlzdHMgPSBmYWxzZTtcbiAgICB0aGlzLmNhblByb2Nlc3MgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB2YWx1ZTogYW55O1xuICBwdWJsaWMgaXNFeGlzdHM6IGJvb2xlYW47XG4gIHB1YmxpYyBjYW5Qcm9jZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvciB7XG4gIHByaXZhdGUgaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWU6IGJvb2xlYW47XG4gIHB1YmxpYyBvblByb2Nlc3M6ICh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgcHJvY2VzcyhcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuID0gZmFsc2UsXG4gICAgZG9FbmNvZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IHRydWU7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICBpZiAoIXRoaXMub25Qcm9jZXNzKSByZXR1cm4gdGV4dDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKHRleHQpO1xuICAgIGZvciAodmFyIGkgPSBpdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKHRleHQuc3Vic3RyaW5nKGl0ZW0uc3RhcnQgKyAxLCBpdGVtLmVuZCkpO1xuICAgICAgaWYgKCFuYW1lKSBjb250aW51ZTtcbiAgICAgIHZhciB0ZXh0VmFsdWUgPSBuZXcgVGV4dFByZVByb2Nlc3NvclZhbHVlKG5hbWUsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgICB0aGlzLm9uUHJvY2Vzcyh0ZXh0VmFsdWUpO1xuICAgICAgaWYgKCF0ZXh0VmFsdWUuaXNFeGlzdHMpIHtcbiAgICAgICAgaWYgKHRleHRWYWx1ZS5jYW5Qcm9jZXNzKSB7XG4gICAgICAgICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHJlcGxhY2VkVmFsdWUgPSAhSGVscGVycy5pc1ZhbHVlRW1wdHkodGV4dFZhbHVlLnZhbHVlKVxuICAgICAgICA/IHRleHRWYWx1ZS52YWx1ZVxuICAgICAgICA6IFwiXCI7XG4gICAgICBpZiAoZG9FbmNvZGluZykge1xuICAgICAgICByZXBsYWNlZFZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlcGxhY2VkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGV4dCA9XG4gICAgICAgIHRleHQuc3Vic3RyKDAsIGl0ZW0uc3RhcnQpICsgcmVwbGFjZWRWYWx1ZSArIHRleHQuc3Vic3RyKGl0ZW0uZW5kICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQWxsVmFsdWVzT25MYXN0UnVuKCkge1xuICAgIHJldHVybiAhIXRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJdGVtcyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxUZXh0UHJlUHJvY2Vzc29ySXRlbT4ge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHZhciBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICB2YXIgc3RhcnQgPSAtMTtcbiAgICB2YXIgY2ggPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoID0gdGV4dFtpXTtcbiAgICAgIGlmIChjaCA9PSBcIntcIikgc3RhcnQgPSBpO1xuICAgICAgaWYgKGNoID09IFwifVwiKSB7XG4gICAgICAgIGlmIChzdGFydCA+IC0xKSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgVGV4dFByZVByb2Nlc3Nvckl0ZW0oKTtcbiAgICAgICAgICBpdGVtLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgaXRlbS5lbmQgPSBpO1xuICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByaXZhdGUgZ2V0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIHJldHVybiBuYW1lLnRyaW0oKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElDb25kaXRpb25SdW5uZXIsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlEYXRhLFxuICBJRWxlbWVudCxcbiAgSVN1cnZleUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgU3VydmV5RWxlbWVudCxcbiAgU3VydmV5RXJyb3IsXG4gIElTdXJ2ZXlFcnJvck93bmVyXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi9rbm9ja291dC9rb3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BJbmZvIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNvdXJjZTogSUVsZW1lbnQsXG4gICAgcHVibGljIHRhcmdldDogSUVsZW1lbnQsXG4gICAgcHVibGljIG5lc3RlZFBhbmVsRGVwdGg6IG51bWJlciA9IC0xXG4gICkge31cbiAgcHVibGljIGRlc3RpbmF0aW9uOiBJU3VydmV5RWxlbWVudDtcbiAgcHVibGljIGlzQm90dG9tOiBib29sZWFuO1xuICBwdWJsaWMgaXNFZGdlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3dNb2RlbCBleHRlbmRzIEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnZpc2libGUgPSBwYW5lbC5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImVsZW1lbnRzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZWxlbWVudHNcIik7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlRWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5maWx0ZXIoZSA9PiBlLmlzVmlzaWJsZSk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVZpc2libGUoKSB7XG4gICAgdGhpcy52aXNpYmxlID0gdGhpcy5jYWxjVmlzaWJsZSgpO1xuICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgfVxuICBwdWJsaWMgYWRkRWxlbWVudChxOiBJRWxlbWVudCkge1xuICAgIHRoaXMuZWxlbWVudHMucHVzaChxKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWwucm93cy5pbmRleE9mKHRoaXMpO1xuICB9XG4gIHByaXZhdGUgc2V0V2lkdGgoKSB7XG4gICAgdmFyIHZpc0NvdW50ID0gdGhpcy52aXNpYmxlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICh2aXNDb3VudCA9PSAwKSByZXR1cm47XG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZWxlbWVudHNbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgIHZhciBxID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgICAgcS5yZW5kZXJXaWR0aCA9XG4gICAgICAgICAgISFxLndpZHRoICYmIHR5cGVvZiBxLndpZHRoID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IHEud2lkdGhcbiAgICAgICAgICAgIDogKDEwMCAvIHZpc0NvdW50KS50b0ZpeGVkKDYpICsgXCIlXCI7XG4gICAgICAgIHEucmlnaHRJbmRlbnQgPSBjb3VudGVyIDwgdmlzQ291bnQgLSAxID8gMSA6IDA7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0ucmVuZGVyV2lkdGggPSBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGNhbGNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVFbGVtZW50cy5sZW5ndGggPiAwO1xuICB9XG59XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhIFBhbmVsIGFuZCBQYWdlIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsQmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIsIElMb2NhbGl6YWJsZU93bmVyLCBJU3VydmV5RXJyb3JPd25lciB7XG4gIHByaXZhdGUgc3RhdGljIHBhbmVsQ291bnRlciA9IDEwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFuZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNwX1wiICsgUGFuZWxNb2RlbEJhc2UucGFuZWxDb3VudGVyKys7XG4gIH1cblxuICBwcml2YXRlIGVsZW1lbnRzVmFsdWU6IEFycmF5PElFbGVtZW50PjtcbiAgcHJpdmF0ZSBpc1F1ZXN0aW9uc1JlYWR5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcXVlc3Rpb25zVmFsdWU6IEFycmF5PFF1ZXN0aW9uPiA9IG5ldyBBcnJheTxRdWVzdGlvbj4oKTtcbiAgYWRkRWxlbWVudENhbGxiYWNrOiAoZWxlbWVudDogSUVsZW1lbnQpID0+IHZvaWQ7XG4gIHJlbW92ZUVsZW1lbnRDYWxsYmFjazogKGVsZW1lbnQ6IElFbGVtZW50KSA9PiB2b2lkO1xuICBvbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogKCkgPT4gc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInJvd3NcIik7XG4gICAgdGhpcy5lbGVtZW50c1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcbiAgICAgIFwiZWxlbWVudHNcIixcbiAgICAgIHRoaXMub25BZGRFbGVtZW50LmJpbmQodGhpcyksXG4gICAgICB0aGlzLm9uUmVtb3ZlRWxlbWVudC5iaW5kKHRoaXMpXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5iaW5kKHRoaXMpXG4gICAgKTtcbiAgICB0aGlzLmlkID0gUGFuZWxNb2RlbEJhc2UuZ2V0UGFuZWxJZCgpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxiYXNlXCI7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBQYW5lbE1vZGVsIG9yIFBhZ2VNb2RlbCB0aXRsZSBwcm9wZXJ0eS5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIFBhbmVsTW9kZWwgb3IgUGFnZU1vZGVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LiBJdCByZW5kZXJzIHVuZGVyIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIG9uIHJlcXVpcmVkIGVycm9yLiBVc2UgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNob3cgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NSZXF1aXJlZEVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXG4gICAgICA6IFwiXCI7XG4gIH1cbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0KSA6IG51bGw7XG4gIH1cbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3JcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHRleHQsIHRydWUpXG4gICAgICA6IHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIEEgcGFyZW50IGVsZW1lbnQuIEl0IGlzIGFsd2F5cyBudWxsIGZvciB0aGUgUGFnZSBvYmplY3QgYW5kIGFsd2F5cyBub3QgbnVsbCBmb3IgdGhlIFBhbmVsIG9iamVjdC4gUGFuZWwgb2JqZWN0IG1heSBjb250YWluIFF1ZXN0aW9ucyBhbmQgb3RoZXIgUGFuZWxzLlxuICAgKi9cbiAgcHVibGljIGdldCBwYXJlbnQoKTogUGFuZWxNb2RlbEJhc2Uge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgbnVsbCk7XG4gIH1cbiAgcHVibGljIHNldCBwYXJlbnQodmFsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgZGVwdGgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmRlcHRoICsgMTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBQYW5lbCBiZWNvbWVzIHZpc2libGUgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UgdGhlIFBhbmVsIGJlY29tZXMgaW52aXNpYmxlLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gdmlzaWJsZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHZpc2libGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3NlcygpOiBhbnkge1xuICAgIHZhciBjbGFzc2VzID0geyBwYW5lbDoge30sIGVycm9yOiB7fSwgcm93OiBcIlwifTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMucGFuZWwsIHRoaXMuY3NzLnBhbmVsKTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMuZXJyb3IsIHRoaXMuY3NzLmVycm9yKTtcbiAgICBpZighIXRoaXMuY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSB0aGlzLmNzcy5yb3c7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUGFuZWxDc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuZ2V0Q3NzKCkgOiB7fTtcbiAgfVxuICAvKipcbiAgICogQSB1bmlxdWUgZWxlbWVudCBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvYmplY3QgaXMgUGFuZWwuIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgKGEgcm9vdCBQYW5lbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheW91dFR5cGUgIT09IFwiZmxvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgbG9jYXRlZCBpbiB0aGUgUGFuZWwvUGFnZSwgaW5jbHVkaW5nIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmlzUXVlc3Rpb25zUmVhZHkpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAgIHZhciBxcyA9ICg8UGFuZWxNb2RlbD5lbCkucXVlc3Rpb25zO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaCg8UXVlc3Rpb24+ZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzUXVlc3Rpb25zUmVhZHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1ZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWVzdGlvbiBieSBpdHMgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSB0aGUgcXVlc3Rpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gcXVlc3Rpb25zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dW5zIHRoZSBlbGVtZW50IGJ5IGl0cyBuYW1lLiBJdCB3b3JrcyByZWN1cnNpdmVseS5cbiAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRCeU5hbWUobmFtZTogc3RyaW5nKTogSUVsZW1lbnQge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwubmFtZSA9PSBuYW1lKSByZXR1cm4gZWw7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmdldEVsZW1lbnRCeU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpID09IHZhbHVlTmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHZhciBkYXRhID0ge307XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKHEuaXNFbXB0eSgpKSBjb250aW51ZTtcbiAgICAgIHZhciB2YWx1ZU5hbWUgPSBxLmdldFZhbHVlTmFtZSgpO1xuICAgICAgKDxhbnk+ZGF0YSlbdmFsdWVOYW1lXSA9IHEudmFsdWU7XG4gICAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLmRhdGEuZ2V0Q29tbWVudCh2YWx1ZU5hbWUpO1xuICAgICAgICBpZiAoISFjb21tZW50KSB7XG4gICAgICAgICAgKDxhbnk+ZGF0YSlbdmFsdWVOYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF0gPSBjb21tZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9uIGNvbW1lbnRzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRDb21tZW50cygpOiBhbnkge1xuICAgIHZhciBjb21tZW50cyA9IHt9O1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gY29tbWVudHM7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBjb21tZW50ID0gdGhpcy5kYXRhLmdldENvbW1lbnQocS5nZXRWYWx1ZU5hbWUoKSk7XG4gICAgICBpZiAoISFjb21tZW50KSB7XG4gICAgICAgICg8YW55PmNvbW1lbnRzKVtxLmdldFZhbHVlTmFtZSgpXSA9IGNvbW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50cztcbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbGwgcXVlc3Rpb24gdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcGFnZS9wYW5lbCwgdGhhdCBlbmQtdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyLlxuICAgKiBGb3IgZXhhbXBsZSB0aGUgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0cyBpbiBhIHJhZGlncm91cC9kcm9wZG93bi9jaGVja2JveCBjaG9pY2VzIG9yIG1hdHJpeCByb3dzL2NvbHVtbnMuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2xlYXIgdmFsdWVzIGZvciBpbnZpc2libGUgcXVlc3Rpb25zIG9yIHZhbHVlcyB0aGF0IGRvZXNuJ3QgYXNzb2NpYXRlZCB3aXRoIHF1ZXN0aW9ucy5cbiAgICogQHNlZSBRdWVzdGlvbi5jbGVhckluY29ycmVjdFZhbHVlc1xuICAgKi9cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNsZWFyIGFsbCBlcnJvcnMgaW4gdGhlIHBhbmVsIC8gcGFnZSBhbmQgYWxsIGl0cyBjaGlsZCBlbGVtZW50cyAocGFuZWxzIGFuZCBxdWVzdGlvbnMpXG4gICAqL1xuICBwdWJsaWMgY2xlYXJFcnJvcnMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cbiAgcHJpdmF0ZSBtYXJrUXVlc3Rpb25MaXN0RGlydHkoKSB7XG4gICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucGFyZW50KSB0aGlzLnBhcmVudC5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIG9iamVjdCwgUGFuZWwvUGFnZS4gRWxlbWVudHMgY2FuIGJlIHF1ZXN0aW9ucyBvciBwYW5lbHMuIFRoZSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBlbGVtZW50cyBpbiB0aGUgbmVzdGVkIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIFBhbmVsL1BhZ2UuIEl0IGxvb2tzIGluIG5lc3RlZCBQYW5lbHMgYXMgd2VsbC5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWw6IGFueSA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICBpZiAoKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmNvbnRhaW5zRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gcmVxdWlyZSB0aGUgYW5zd2VyIGF0IGxlYXN0IGluIG9uZSBxdWVzdGlvbiBpbiB0aGUgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhpcyBQYWdlIG9yIGluc2lkZSB0aGUgY3VycmVudCBQYW5lbFxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlLCB0byBzaG93IGVycm9ycyBpbiBVSVxuICAgKiBAcGFyYW0gZm9jdXNPbkZpcnN0RXJyb3Igc2V0IGl0IHRvIHRydWUgdG8gZm9jdXMgb24gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgZG9lc24ndCBwYXNzIHRoZSB2YWxpZGF0aW9uXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsXG4gICAgZm9jdXNPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICByZWM6IGFueSA9IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmVjID0gISFyZWNcbiAgICAgID8gcmVjXG4gICAgICA6IHtcbiAgICAgICAgICBmaXJlQ2FsbGJhY2s6IGZpcmVDYWxsYmFjayxcbiAgICAgICAgICBmb2N1c2VPbkZpcnN0RXJyb3I6IGZvY3VzT25GaXJzdEVycm9yLFxuICAgICAgICAgIGZpcnN0RXJyb3JRdWVzdGlvbjogPGFueT5udWxsLFxuICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgfTtcbiAgICB0aGlzLmhhc0Vycm9yc0NvcmUocmVjKTtcbiAgICBpZiAocmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbi5mb2N1cyh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYy5yZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvcnNJblBhbmVscyhyZWM6IGFueSkge1xuICAgIHZhciBlcnJvcnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmhhc1JlcXVpcmVkRXJyb3IocmVjLCBlcnJvcnMpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdmFyIGN1c3RvbUVycm9yID0gdGhpcy5zdXJ2ZXkudmFsaWRhdGVQYW5lbCh0aGlzKTtcbiAgICAgIGlmIChjdXN0b21FcnJvcikge1xuICAgICAgICBlcnJvcnMucHVzaChjdXN0b21FcnJvcik7XG4gICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISFyZWMuZmlyZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB9XG4gIH1cbiAgLy9JU3VydmV5RXJyb3JPd25lclxuICBnZXRFcnJvckN1c3RvbVRleHQodGV4dDogc3RyaW5nLCBlcnJvcjogU3VydmV5RXJyb3IpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkuZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQsIGVycm9yKTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUmVxdWlyZWRFcnJvcihyZWM6IGFueSwgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCkgcmV0dXJuO1xuICAgIHZhciB2aXNRdWVzdGlvbnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNRdWVzdGlvbnMsIHRydWUpO1xuICAgIGlmICh2aXNRdWVzdGlvbnMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1F1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF2aXNRdWVzdGlvbnNbaV0uaXNFbXB0eSgpKSByZXR1cm47XG4gICAgfVxuICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgIGVycm9ycy5wdXNoKG5ldyBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yKHRoaXMucmVxdWlyZWRFcnJvclRleHQsIHRoaXMpKTtcbiAgICBpZiAocmVjLmZvY3VzZU9uRmlyc3RFcnJvciAmJiAhcmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9IHZpc1F1ZXN0aW9uc1swXTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhc0Vycm9yc0NvcmUocmVjOiBhbnkpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50ID0gbnVsbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgaWYgKCFlbGVtZW50LmlzVmlzaWJsZSkgY29udGludWU7XG5cbiAgICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbGVtZW50KSkuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPmVsZW1lbnQ7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSBjb250aW51ZTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmhhc0Vycm9ycyhyZWMuZmlyZUNhbGxiYWNrLCByZWMpKSB7XG4gICAgICAgICAgaWYgKHJlYy5mb2N1c2VPbkZpcnN0RXJyb3IgJiYgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaGFzRXJyb3JzSW5QYW5lbHMocmVjKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZWxlbWVudHNbaV0uY29udGFpbnNFcnJvcnMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgKDxCYXNlPig8YW55PmVsKSkuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCBlbC5pc1Zpc2libGUpO1xuICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHdpdGhFcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogUXVlc3Rpb24ge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoIWVsLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKFxuICAgICAgICAgIHdpdGhFcnJvclxuICAgICAgICApO1xuICAgICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbj5lbDtcbiAgICAgICAgaWYgKHEuaGFzSW5wdXQgJiYgKCF3aXRoRXJyb3IgfHwgcS5jdXJyZW50RXJyb3JDb3VudCA+IDApKSByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9uIHRoZSBmaXJzdCBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcSA9IHRoaXMuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoKTtcbiAgICBpZiAoISFxKSB7XG4gICAgICBxLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBoYXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgdmFyIHEgPSB0aGlzLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHRydWUpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEZpbGwgbGlzdCBhcnJheSB3aXRoIHRoZSBxdWVzdGlvbnMuXG4gICAqIEBwYXJhbSBsaXN0XG4gICAqIEBwYXJhbSB2aXNpYmxlT25seSBzZXQgaXQgdG8gdHJ1ZSB0byBnZXQgdmlzaWJsZSBxdWVzdGlvbnMgb25seVxuICAgKi9cbiAgcHVibGljIGFkZFF1ZXN0aW9uc1RvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUXVlc3Rpb24+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QobGlzdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogRmlsbCBsaXN0IGFycmF5IHdpdGggdGhlIHBhbmVscy5cbiAgICogQHBhcmFtIGxpc3RcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbHNJbnRvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUGFuZWw+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgICA8QXJyYXk8SUVsZW1lbnQ+Pig8QXJyYXk8YW55Pj5saXN0KSxcbiAgICAgIHZpc2libGVPbmx5LFxuICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgbGlzdDogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sXG4gICAgaXNQYW5lbDogYm9vbGVhblxuICApIHtcbiAgICBpZiAodmlzaWJsZU9ubHkgJiYgIXRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgbGlzdCxcbiAgICAgIHRoaXMuZWxlbWVudHMsXG4gICAgICB2aXNpYmxlT25seSxcbiAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICBpc1BhbmVsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICBsaXN0OiBBcnJheTxJRWxlbWVudD4sXG4gICAgZWxlbWVudHM6IEFycmF5PElFbGVtZW50PixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbixcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuLFxuICAgIGlzUGFuZWw6IGJvb2xlYW5cbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAodmlzaWJsZU9ubHkgJiYgIWVsLnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgaWYgKChpc1BhbmVsICYmIGVsLmlzUGFuZWwpIHx8ICghaXNQYW5lbCAmJiAhZWwuaXNQYW5lbCkpIHtcbiAgICAgICAgbGlzdC5wdXNoKGVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgICg8UGFuZWxNb2RlbD5lbCkuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5lbGVtZW50cyxcbiAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgICAgIGlzUGFuZWxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpbmNsdWRpbmdEZXNpZ25UaW1lKSB7XG4gICAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICAgICAgICBsaXN0LFxuICAgICAgICAgICAgKDxTdXJ2ZXlFbGVtZW50Pig8YW55PmVsKSkuZ2V0RWxlbWVudHNJbkRlc2lnbihmYWxzZSksXG4gICAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICAgICAgICBpc1BhbmVsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBQYWdlIGFuZCBpdCBpcyB0aGUgY3VycmVudCBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5IHx8IDxQYWdlTW9kZWw+dGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UgPT0gdGhpcy5yb290O1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbilcbiAgICAgIHJldHVybiB0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uICE9IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgIGlmICh0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbiA6IFwidG9wXCI7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicm93XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCByb290KCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICB2YXIgcmVzID0gPFBhbmVsTW9kZWxCYXNlPnRoaXM7XG4gICAgd2hpbGUgKHJlcy5wYXJlbnQpIHJlcyA9IHJlcy5wYXJlbnQ7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgY2hpbGRWaXNpYmlsaXR5Q2hhbmdlZCgpIHtcbiAgICB2YXIgbmV3SXNWaXNpYmxlVmFsdWUgPSB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7XG4gICAgdmFyIG9sZElzVmlzaWJsZVZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRydWUpO1xuICAgIGlmIChuZXdJc1Zpc2libGVWYWx1ZSAhPT0gb2xkSXNWaXNpYmxlVmFsdWUpIHtcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3dNb2RlbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgcm93cygpOiBBcnJheTxRdWVzdGlvblJvd01vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgdGhpcy5idWlsZFJvd3MoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGVsZW1lbnQuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgIGVsZW1lbnQucGFyZW50ID0gdGhpcztcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgIHRoaXMudXBkYXRlUm93c09uRWxlbWVudEFkZGVkKGVsZW1lbnQsIGluZGV4KTtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB2YXIgcCA9IDxQYW5lbE1vZGVsPmVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkucGFuZWxBZGRlZChwLCBpbmRleCwgdGhpcywgdGhpcy5yb290KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uPmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQWRkZWQocSwgaW5kZXgsIHRoaXMsIHRoaXMucm9vdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXRoaXMuYWRkRWxlbWVudENhbGxiYWNrKSB0aGlzLmFkZEVsZW1lbnRDYWxsYmFjayhlbGVtZW50KTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInN0YXJ0V2l0aE5ld0xpbmVcIixcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGVsZW1lbnQucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiLCBcInN0YXJ0V2l0aE5ld0xpbmVcIl0sXG4gICAgICB0aGlzLmlkXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NPbkVsZW1lbnRSZW1vdmVkKGVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVtb3ZlZCg8UXVlc3Rpb24+ZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkucGFuZWxSZW1vdmVkKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnJlbW92ZUVsZW1lbnRDYWxsYmFjaykgdGhpcy5yZW1vdmVFbGVtZW50Q2FsbGJhY2soZWxlbWVudCk7XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIG9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50KTtcbiAgICB0aGlzLmNoaWxkVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25FbGVtZW50U3RhcnRXaXRoTmV3TGluZUNoYW5nZWQoZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50OiBhbnkpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgaWYgKHJvdy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHtcbiAgICAgICAgcm93LnVwZGF0ZVZpc2libGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2FuQnVpbGRSb3dzKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLmdldENoaWxkcmVuTGF5b3V0VHlwZSgpID09IFwicm93XCI7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICB2YXIgaXNOZXdSb3cgPSBpID09IDAgfHwgZWwuc3RhcnRXaXRoTmV3TGluZTtcbiAgICAgIHZhciByb3cgPSBpc05ld1JvdyA/IHRoaXMuY3JlYXRlUm93KCkgOiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGlzTmV3Um93KSByZXN1bHQucHVzaChyb3cpO1xuICAgICAgcm93LmFkZEVsZW1lbnQoZWwpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldLnVwZGF0ZVZpc2libGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHZhciBkcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKG51bGwsIGVsZW1lbnQpO1xuICAgIGRyYWdEcm9wSW5mby50YXJnZXQgPSBlbGVtZW50O1xuICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gaW5kZXggPiAwO1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcy5lbGVtZW50c1sxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXMuZWxlbWVudHNbaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzT25FbGVtZW50UmVtb3ZlZChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuZmluZFJvd0J5RWxlbWVudChlbGVtZW50KVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhcbiAgICBlbGVtZW50OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKSB7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5wYW5lbCkgcmV0dXJuO1xuICAgIHZhciBlbEluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGVsSW5kZXggPCAwKSByZXR1cm47XG4gICAgcm93LmVsZW1lbnRzLnNwbGljZShlbEluZGV4LCAxKTtcbiAgICBpZiAocm93LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaW5kZXggPj0gMCkge1xuICAgICAgICByb3cucGFuZWwucm93cy5zcGxpY2Uocm93LmluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaW5kUm93QnlFbGVtZW50KGVsOiBJRWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd3NbaV0uZWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGVsKTtcbiAgICBpZiAoISFyb3cpIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlbmRlcmVkIHRpdGxlIHRleHQgb3IgaHRtbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yICE9IG51bGxcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHN0ciwgdHJ1ZSlcbiAgICAgIDogc3RyO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcgfHwgdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXSA9PSBleGNlcHRpb25RdWVzdGlvbikgY29udGludWU7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlIHx8IGluZGV4IDwgMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgc3RhcnRJbmRleCA9IGluZGV4O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaW5kZXggKz0gdGhpcy5lbGVtZW50c1tpXS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggLSBzdGFydEluZGV4O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1bnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSA8U3VydmV5RWxlbWVudD4oPGFueT50aGlzLmVsZW1lbnRzW2ldKTtcbiAgICAgIGVsLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlYWRPbmx5XCIsIGVsLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbC9QYWdlIGJlY29tZXMgcmVhZCBvbmx5IGFuZCBhbiBlbmQtdXNlciB3aWxsIG5vdCBhYmxlIHRvIGFuc3dlciBvbiBxdXN0aW9ucyBpbnNpZGUgaXQuXG4gICAqIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiByZWFkT25seSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGFuIGVsZW1lbnQgaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgYWRkZWQgc3VjY2Vzc2Z1bGx5LiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlciA9IC0xKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZEVsZW1lbnQoZWxlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmIGVsZW1lbnQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcXVlc3Rpb24gaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGFkZGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24sIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocXVlc3Rpb24sIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFuZWwgaW50byBQYW5lbCBvciBQYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gcGFuZWxcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocGFuZWwsIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBxdWVzdGlvbiBhbmQgYWRkcyBpdCBhdCBsb2NhdGlvbiBvZiBpbmRleCwgYnkgZGVmYXVsdCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LiBSZXR1cm5zIG51bGwsIGlmIHRoZSBxdWVzdGlvbiBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciBjb3VsZCBub3QgYmUgYWRkZWQgaW50byBwYWdlIG9yIHBhbmVsLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBcInRleHRcIiwgXCJjaGVja2JveFwiLCBcImRyb3Bkb3duXCIsIFwibWF0cml4XCIsIFwiaHRtbFwiLCBcIm1hdHJpeGR5bmFtaWNcIiwgXCJtYXRyaXhkcm9wZG93blwiIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1F1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgaW5kZXg6IG51bWJlciA9IC0xXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlLCBuYW1lKTtcbiAgICBpZiAoIXRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24sIGluZGV4KSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBhbmVsIGFuZCBhZGRzIGl0IGludG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudHMgbGlzdC4gUmV0dXJucyBudWxsLCBpZiB0aGUgcGFuZWwgY291bGQgbm90IGJlIGNyZWF0ZWQgb3IgY291bGQgbm90IGJlIGFkZGVkIGludG8gcGFnZSBvciBwYW5lbC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYW5lbCBuYW1lXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFuZWwobmFtZTogc3RyaW5nID0gbnVsbCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWwobmFtZSk7XG4gICAgaWYgKCF0aGlzLmFkZFBhbmVsKHBhbmVsKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBlbGVtZW50IHBhcmFtZXRlciBpbiB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnQgcXVlc3Rpb24gb3IgcGFuZWxcbiAgICovXG4gIHB1YmxpYyBpbmRleE9mKGVsZW1lbnQ6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbChuYW1lOiBzdHJpbmcpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsTW9kZWwobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBlbGVtZW50IChQYW5lbCBvciBRdWVzdGlvbikgZnJvbSB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHNlZSBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLnJlbW92ZUVsZW1lbnQoZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBxdWVzdGlvbiAgZnJvbSB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICogQHNlZSByZW1vdmVFbGVtZW50XG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtZW50KHF1ZXN0aW9uKTtcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblZlcnNpb24gPSAtMTtcbiAgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKHZhbHVlcy5jb25kaXRpb25WZXJzaW9uIDwgdGhpcy5jb25kaXRpb25WZXJzaW9uKSByZXR1cm47XG4gICAgdGhpcy5jb25kaXRpb25WZXJzaW9uID0gdmFsdWVzLmNvbmRpdGlvblZlcnNpb247XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cy5zbGljZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZXMuY29uZGl0aW9uVmVyc2lvbiA8IHRoaXMuY29uZGl0aW9uVmVyc2lvbikgcmV0dXJuO1xuICAgICAgZWxlbWVudHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZXMuY29uZGl0aW9uVmVyc2lvbiA8IHRoaXMuY29uZGl0aW9uVmVyc2lvbikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnJ1bkVuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuVmlzaWJsZUNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybjtcbiAgICB2YXIgY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnZpc2libGUgPSByZXM7XG4gICAgfTtcbiAgICBjb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSBydW5FbmFibGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlSWYpIHJldHVybjtcbiAgICB2YXIgY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICBjb25kaXRpb25SdW5uZXIub25SdW5Db21wbGV0ZSA9IChyZXM6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMucmVhZE9ubHkgPSAhcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRyYWdEcm9wQWRkVGFyZ2V0KGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKSB7XG4gICAgdmFyIHByZXZSb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyhkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICBpZiAodGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgcHJldlJvdykpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KGRyYWdEcm9wSW5mby50YXJnZXQsIHByZXZSb3cpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZHJhZ0Ryb3BGaW5kUm93KGZpbmRFbGVtZW50OiBJU3VydmV5RWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIGlmICghZmluZEVsZW1lbnQgfHwgZmluZEVsZW1lbnQuaXNQYWdlKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZWxlbWVudCA9IDxJRWxlbWVudD5maW5kRWxlbWVudDtcbiAgICB2YXIgcm93cyA9IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyb3dzW2ldLmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBubCA9IHRoaXMuZWxlbWVudHNbaV0uZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghcG5sKSBjb250aW51ZTtcbiAgICAgIHZhciByb3cgPSAoPFBhbmVsTW9kZWxCYXNlPnBubCkuZHJhZ0Ryb3BGaW5kUm93KGVsZW1lbnQpO1xuICAgICAgaWYgKCEhcm93KSByZXR1cm4gcm93O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9Sb3coXG4gICAgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm8sXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWwoZHJhZ0Ryb3BJbmZvKSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGRlc3QgPSBkcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgdmFyIGRlc3RSb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyhkZXN0KTtcbiAgICBpZiAoIWRlc3RSb3cpIHJldHVybiB0cnVlO1xuICAgIGlmICghZHJhZ0Ryb3BJbmZvLnRhcmdldC5zdGFydFdpdGhOZXdMaW5lKVxuICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgICAgICBkcmFnRHJvcEluZm8sXG4gICAgICAgIGRlc3RSb3csXG4gICAgICAgIHByZXZSb3dcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb05ld1JvdyhkcmFnRHJvcEluZm8sIGRlc3RSb3csIHByZXZSb3cpO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWwoZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm8pOiBib29sZWFuIHtcbiAgICBpZiAoZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uLmlzUGFnZSkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvRW1wdHlQYW5lbENvcmUoXG4gICAgICAgIHRoaXMucm9vdCxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBkZXN0ID0gPElFbGVtZW50PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoZGVzdC5pc1BhbmVsICYmICFkcmFnRHJvcEluZm8uaXNFZGdlKSB7XG4gICAgICB2YXIgcGFuZWwgPSA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+ZGVzdCk7XG4gICAgICBpZiAoKDxhbnk+ZHJhZ0Ryb3BJbmZvLnRhcmdldClbXCJ0ZW1wbGF0ZVwiXSA9PT0gZGVzdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEcm9wSW5mby5uZXN0ZWRQYW5lbERlcHRoIDwgMCB8fFxuICAgICAgICBkcmFnRHJvcEluZm8ubmVzdGVkUGFuZWxEZXB0aCA+PSBwYW5lbC5kZXB0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgICAgICAgIDxQYW5lbE1vZGVsQmFzZT4oPGFueT5kZXN0KSxcbiAgICAgICAgICBkcmFnRHJvcEluZm8udGFyZ2V0LFxuICAgICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIGRlc3RSb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgaW5kZXggPSBkZXN0Um93LmVsZW1lbnRzLmluZGV4T2YoPElFbGVtZW50PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbik7XG4gICAgaWYgKFxuICAgICAgaW5kZXggPT0gMCAmJlxuICAgICAgIWRyYWdEcm9wSW5mby5pc0JvdHRvbSAmJlxuICAgICAgZGVzdFJvdy5lbGVtZW50c1swXS5zdGFydFdpdGhOZXdMaW5lXG4gICAgKSB7XG4gICAgICBpZiAoZGVzdFJvdy5pbmRleCA+IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gdHJ1ZTtcbiAgICAgICAgZGVzdFJvdyA9IGRlc3RSb3cucGFuZWwucm93c1tkZXN0Um93LmluZGV4IC0gMV07XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9XG4gICAgICAgICAgZGVzdFJvdy5lbGVtZW50c1tkZXN0Um93LmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvRXhpc3RpbmdSb3coXG4gICAgICAgICAgZHJhZ0Ryb3BJbmZvLFxuICAgICAgICAgIGRlc3RSb3csXG4gICAgICAgICAgcHJldlJvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb05ld1JvdyhkcmFnRHJvcEluZm8sIGRlc3RSb3csIHByZXZSb3cpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcHJldlJvd0luZGV4ID0gLTE7XG4gICAgaWYgKHByZXZSb3cgPT0gZGVzdFJvdykge1xuICAgICAgcHJldlJvd0luZGV4ID0gZGVzdFJvdy5lbGVtZW50cy5pbmRleE9mKGRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgIH1cbiAgICBpZiAoZHJhZ0Ryb3BJbmZvLmlzQm90dG9tKSBpbmRleCsrO1xuICAgIHZhciBzcmNSb3cgPSB0aGlzLmZpbmRSb3dCeUVsZW1lbnQoZHJhZ0Ryb3BJbmZvLnNvdXJjZSk7XG4gICAgaWYgKFxuICAgICAgc3JjUm93ID09IGRlc3RSb3cgJiZcbiAgICAgIHNyY1Jvdy5lbGVtZW50cy5pbmRleE9mKGRyYWdEcm9wSW5mby5zb3VyY2UpID09IGluZGV4XG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA9PSBwcmV2Um93SW5kZXgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocHJldlJvd0luZGV4ID4gLTEpIHtcbiAgICAgIGRlc3RSb3cuZWxlbWVudHMuc3BsaWNlKHByZXZSb3dJbmRleCwgMSk7XG4gICAgICBpZiAocHJldlJvd0luZGV4IDwgaW5kZXgpIGluZGV4LS07XG4gICAgfVxuICAgIGRlc3RSb3cuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICBkZXN0Um93LnVwZGF0ZVZpc2libGUoKTtcbiAgICByZXR1cm4gcHJldlJvd0luZGV4IDwgMDtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coXG4gICAgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm8sXG4gICAgZGVzdFJvdzogUXVlc3Rpb25Sb3dNb2RlbCxcbiAgICBwcmV2Um93OiBRdWVzdGlvblJvd01vZGVsXG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciB0YXJnZXRSb3cgPSBkZXN0Um93LnBhbmVsLmNyZWF0ZVJvdygpO1xuICAgIHRhcmdldFJvdy5hZGRFbGVtZW50KGRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgIHZhciBpbmRleCA9IGRlc3RSb3cuaW5kZXg7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgLy9zYW1lIHJvd1xuICAgIGlmICghIXByZXZSb3cgJiYgcHJldlJvdy5wYW5lbCA9PSB0YXJnZXRSb3cucGFuZWwgJiYgcHJldlJvdy5pbmRleCA9PSBpbmRleClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgICEhc3JjUm93ICYmXG4gICAgICBzcmNSb3cucGFuZWwgPT0gdGFyZ2V0Um93LnBhbmVsICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMubGVuZ3RoID09IDEgJiZcbiAgICAgIHNyY1Jvdy5pbmRleCA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBkZXN0Um93LnBhbmVsLnJvd3Muc3BsaWNlKGluZGV4LCAwLCB0YXJnZXRSb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSxcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuXG4gICkge1xuICAgIHZhciB0YXJnZXRSb3cgPSBwYW5lbC5jcmVhdGVSb3coKTtcbiAgICB0YXJnZXRSb3cuYWRkRWxlbWVudCh0YXJnZXQpO1xuICAgIGlmIChwYW5lbC5lbGVtZW50cy5sZW5ndGggPT0gMCB8fCBpc0JvdHRvbSkge1xuICAgICAgcGFuZWwucm93cy5wdXNoKHRhcmdldFJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVsLnJvd3Muc3BsaWNlKDAsIDAsIHRhcmdldFJvdyk7XG4gICAgfVxuICB9XG4gIGRyYWdEcm9wTW92ZUVsZW1lbnQoc3JjOiBJRWxlbWVudCwgdGFyZ2V0OiBJRWxlbWVudCwgdGFyZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHZhciBzcmNJbmRleCA9ICg8UGFuZWxNb2RlbEJhc2U+c3JjLnBhcmVudCkuZWxlbWVudHMuaW5kZXhPZihzcmMpO1xuICAgIGlmICh0YXJnZXRJbmRleCA+IHNyY0luZGV4KSB7XG4gICAgICB0YXJnZXRJbmRleC0tO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUVsZW1lbnQoc3JjKTtcbiAgICB0aGlzLmFkZEVsZW1lbnQodGFyZ2V0LCB0YXJnZXRJbmRleCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBlbGVtZW50LCBzaW1pbGFyIHRvIHRoZSBQYWdlIG9iamVjdHMuIEhvd2V2ZXIsIHVubGlrZSB0aGUgUGFnZSwgUGFuZWwgY2FuJ3QgYmUgYSByb290LlxuICogSXQgbWF5IGNvbnRhaW4gcXVlc3Rpb25zIGFuZCBvdGhlciBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2UgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIHN0YXRlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwic3RhdGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZUNoYW5nZWRDYWxsYmFjaykgc2VsZi5zdGF0ZUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ3aWR0aFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghIXNlbGYucGFyZW50KSB7XG4gICAgICAgIHNlbGYucGFyZW50LmVsZW1lbnRXaWR0aENoYW5nZWQoc2VsZik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaW5kZW50XCIsIFwiaW5uZXJJbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uSW5kZW50Q2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYW5lbFwiO1xuICB9XG4gIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLm9uSW5kZW50Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFnZSB3aGVyZSB0aGUgcGFuZWwgaXMgbG9jYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZSgpOiBJUGFnZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZSh0aGlzLnBhcmVudCk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlKHZhbDogSVBhZ2UpIHtcbiAgICB0aGlzLnNldFBhZ2UodGhpcy5wYXJlbnQsIHZhbCk7XG4gIH1cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxmRnJvbUxpc3QodGhpcy5wYXJlbnQuZWxlbWVudHMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJjb2xsYXBzZWRcIiB0byByZW5kZXIgb25seSBQYW5lbCB0aXRsZSBhbmQgZXhwYW5kZWQgYnV0dG9uIGFuZCB0byBcImV4cGFuZGVkXCIgdG8gcmVuZGVyIHRoZSBjb2xsYXBzZWQgYnV0dG9uIGluIHRoZSBQYW5lbCBjYXB0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGF0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFBhbmVsIGlzIGluIHRoZSBjb2xsYXBzZWQgc3RhdGVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGNvbGxhcHNlXG4gICAqIEBzZWUgaXNFeHBhbmRlZFxuICAgKi9cbiAgcHVibGljIGdldCBpc0NvbGxhcHNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBcImNvbGxhcHNlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFBhbmVsIGlzIGluIHRoZSBleHBhbmRlZCBzdGF0ZVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgZXhwYW5kXG4gICAqIEBzZWUgaXNDb2xsYXBzZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBcImV4cGFuZGVkXCI7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSBQYW5lbFxuICAgKiBAc2VlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdGhpcy5zdGF0ZSA9IFwiY29sbGFwc2VkXCI7XG4gIH1cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgUGFuZWxcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGV4cGFuZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gXCJleHBhbmRlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHBhbmVsIHRvIGEgbmV3IGNvbnRhaW5lciBQYWdlL1BhbmVsLiBBZGQgYXMgYSBsYXN0IGVsZW1lbnQgaWYgaW5zZXJ0QmVmb3JlIHBhcmFtZXRlciBpcyBub3QgdXNlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBpbmRleCxcbiAgICogaWYgaW5zZXJ0IHBhcmFtZXRlciBpcyBudW1iZXIsIG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZWxlbWVudCwgaWYgdGhlIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgYSBxdWVzdGlvbiBvciBwYW5lbFxuICAgKiBAcGFyYW0gY29udGFpbmVyIFBhZ2Ugb3IgUGFuZWwgdG8gd2hlcmUgYSBxdWVzdGlvbiBpcyByZWxvY2F0ZWQuXG4gICAqIEBwYXJhbSBpbnNlcnRCZWZvcmUgVXNlIGl0IGlmIHlvdSB3YW50IHRvIHNldCB0aGUgcGFuZWwgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbi4gWW91IG1heSB1c2UgYSBudW1iZXIgKHVzZSAwIHRvIGluc2VydCBpbnQgdGhlIGJlZ2lubmluZykgb3IgZWxlbWVudCwgaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgbW92ZVRvKGNvbnRhaW5lcjogSVBhbmVsLCBpbnNlcnRCZWZvcmU6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG9CYXNlKHRoaXMucGFyZW50LCBjb250YWluZXIsIGluc2VydEJlZm9yZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc0Vycm9yc0NvcmUocmVjOiBhbnkpIHtcbiAgICBzdXBlci5oYXNFcnJvcnNDb3JlKHJlYyk7XG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgJiYgcmVjLnJlc3VsdCAmJiByZWMuZmlyZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmV4cGFuZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UmVuZGVyZWRUaXRsZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzdHIpIHtcbiAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8IHRoaXMuaXNFeHBhbmRlZCkgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIFwiW1wiICsgdGhpcy5uYW1lICsgXCJdXCI7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRSZW5kZXJlZFRpdGxlKHN0cik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBQYW5lbCB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsZWZ0IGluZGVudC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gaW5jcmVhc2UgdGhlIHBhbmVsIGxlZnQgaW5kZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbm5lciBpbmRlbnQuIFNldCB0aGlzIHByb3BlcnR5IHRvIGluY3JlYXNlIHRoZSBwYW5lbCBjb250ZW50IG1hcmdpbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5uZXJJbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJJbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBpbm5lckluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlubmVySW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHJlbmRlcldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIpO1xuICB9XG4gIHNldCByZW5kZXJXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBQYW5lbCByZW5kZXJzIG9uIHRoZSBuZXcgbGluZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGZhbHNlLCB0aGUgcGFuZWwgdHJpZXMgdG8gcmVuZGVyIG9uIHRoZSBzYW1lIGxpbmUvcm93IHdpdGggYSBwcmV2aW91cyBxdWVzdGlvbi9wYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRXaXRoTmV3TGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0V2l0aE5ld0xpbmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJpZ2h0IGluZGVudCBvZiB0aGUgUGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJpZ2h0SW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmlnaHRJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nTGVmdFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nTGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBpbm5lclBhZGRpbmdMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlubmVyUGFkZGluZ0xlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IGlubmVyUGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbm5lclBhZGRpbmdMZWZ0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHBhZGRpbmdSaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdSaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmdSaWdodFwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgb25JbmRlbnRDaGFuZ2VkKCkge1xuICAgIHRoaXMuaW5uZXJQYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmlubmVySW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnJpZ2h0SW5kZW50KTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGNzcyA9ICg8YW55PnRoaXMpLnN1cnZleVtcImNzc1wiXTtcbiAgICBpZiAoIWNzcykgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIGluZGVudCAqIGNzcy5xdWVzdGlvbi5pbmRlbnQgKyBcInB4XCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhbmVsVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy52aXNpYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJwYW5lbGJhc2VcIixcbiAgW1xuICAgIFwibmFtZVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZWxlbWVudHNcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwicXVlc3Rpb25cIixcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgaXNMaWdodFNlcmlhbGl6YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ2aXNpYmxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwiZW5hYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyZWFkT25seTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsQmFzZSgpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInBhbmVsXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcInN0YXRlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJjb2xsYXBzZWRcIiwgXCJleHBhbmRlZFwiXVxuICAgIH0sXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwic3RhcnRXaXRoTmV3TGluZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwiaW5uZXJJbmRlbnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzXSB9LFxuICAgIHsgbmFtZTogXCJpbmRlbnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzXSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFnZVwiLFxuICAgICAgaXNTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgICAgY2hvaWNlczogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgICByZXR1cm4gc3VydmV5XG4gICAgICAgICAgPyBzdXJ2ZXkucGFnZXMubWFwKChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHAubmFtZSwgdGV4dDogcC50aXRsZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IFtdO1xuICAgICAgfVxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGFuZWwudHMiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRFcnJvcnMgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBSZWFjdEVsZW1lbnRGYWN0b3J5IH0gZnJvbSBcIi4vZWxlbWVudC1mYWN0b3J5XCI7XG5cbmltcG9ydCB7IFN1cnZleVBhbmVsQmFzZSB9IGZyb20gXCIuL3BhbmVsLWJhc2VcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi4vcGFuZWxcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVBhbmVsIGV4dGVuZHMgU3VydmV5UGFuZWxCYXNlIHtcbiAgcHJpdmF0ZSBoYXNCZWVuRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBhbmVsQmFzZSBhcyBQYW5lbE1vZGVsO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKHRoaXMucGFuZWxCYXNlID09IG51bGwgfHwgdGhpcy5zdXJ2ZXkgPT0gbnVsbCB8fCB0aGlzLmNyZWF0b3IgPT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy5wYW5lbEJhc2UuaXNWaXNpYmxlKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdGl0bGUgPSB0aGlzLnJlbmRlclRpdGxlKCk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gdGhpcy5yZW5kZXJEZXNjcmlwdGlvbigpO1xuICAgIHZhciBlcnJvcnMgPSAoXG4gICAgICA8U3VydmV5RWxlbWVudEVycm9yc1xuICAgICAgICBlbGVtZW50PXt0aGlzLnBhbmVsQmFzZX1cbiAgICAgICAgY3NzQ2xhc3Nlcz17dGhpcy5wYW5lbEJhc2UuY3NzQ2xhc3Nlc31cbiAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgLz5cbiAgICApO1xuICAgIHZhciBzdHlsZSA9IHtcbiAgICAgIHBhZGRpbmdMZWZ0OiB0aGlzLnBhbmVsLmlubmVyUGFkZGluZ0xlZnQsXG4gICAgICBkaXNwbGF5OiAhdGhpcy5wYW5lbC5pc0NvbGxhcHNlZCA/IFwiYmxvY2tcIiA6IFwibm9uZVwiXG4gICAgfTtcbiAgICB2YXIgY29udGVudCA9IG51bGw7XG4gICAgaWYgKCF0aGlzLnBhbmVsLmlzQ29sbGFwc2VkIHx8IHRoaXMuaGFzQmVlbkV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmhhc0JlZW5FeHBhbmRlZCA9IHRydWU7XG4gICAgICB2YXIgcm93cyA9IHRoaXMucmVuZGVyUm93cyh0aGlzLnBhbmVsQmFzZS5jc3NDbGFzc2VzKTtcbiAgICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLnBhbmVsQmFzZS5jc3NDbGFzc2VzLnBhbmVsLmNvbnRlbnQ7XG4gICAgICBjb250ZW50ID0gdGhpcy5yZW5kZXJDb250ZW50KHN0eWxlLCByb3dzLCBjbGFzc05hbWUpO1xuICAgIH1cbiAgICB2YXIgcm9vdFN0eWxlOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAodGhpcy5wYW5lbC5yZW5kZXJXaWR0aCkgcm9vdFN0eWxlW1wid2lkdGhcIl0gPSB0aGlzLnBhbmVsLnJlbmRlcldpZHRoO1xuICAgIHZhciBib3R0b20gPSB0aGlzLnJlbmRlckJvdHRvbSgpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj1cInJvb3RcIlxuICAgICAgICBjbGFzc05hbWU9e3RoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMucGFuZWwuY29udGFpbmVyfVxuICAgICAgICBzdHlsZT17cm9vdFN0eWxlfVxuICAgICAgPlxuICAgICAgICB7dGl0bGV9XG4gICAgICAgIHtkZXNjcmlwdGlvbn1cbiAgICAgICAge2Vycm9yc31cbiAgICAgICAge2NvbnRlbnR9XG4gICAgICAgIHtib3R0b219XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJDb250ZW50KFxuICAgIHN0eWxlOiBhbnksXG4gICAgcm93czogSlNYLkVsZW1lbnRbXSxcbiAgICBjbGFzc05hbWU6IHN0cmluZ1xuICApOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e3N0eWxlfSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgIHtyb3dzfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGUoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5wYW5lbEJhc2UudGl0bGUpIHJldHVybiBudWxsO1xuICAgIHZhciB0ZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKHRoaXMucGFuZWxCYXNlLmxvY1RpdGxlKTtcbiAgICB2YXIgZXhwYW5kQ29sbGFwc2UgPSBudWxsO1xuICAgIHZhciB0aXRsZVN0eWxlID0gdGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLnRpdGxlO1xuICAgIGlmICh0aGlzLnBhbmVsLmlzQ29sbGFwc2VkIHx8IHRoaXMucGFuZWwuaXNFeHBhbmRlZCkge1xuICAgICAgdGl0bGVTdHlsZSArPSBcIiBcIiArIHRoaXMucGFuZWwuY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZUV4cGFuZGFibGU7XG4gICAgICB2YXIgaWNvbkNzcyA9IHRoaXMucGFuZWwuY3NzQ2xhc3Nlcy5wYW5lbC5pY29uO1xuICAgICAgaWYgKCF0aGlzLnBhbmVsLmlzQ29sbGFwc2VkKSBpY29uQ3NzICs9IFwiIFwiICsgdGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLmljb25FeHBhbmRlZDtcbiAgICAgIHZhciBjaGFuZ2VFeHBhbmRlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWwuaXNDb2xsYXBzZWQpIHtcbiAgICAgICAgICB0aGlzLnBhbmVsLmV4cGFuZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGFuZWwuY29sbGFwc2UoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGV4cGFuZENvbGxhcHNlID0gPHNwYW4gY2xhc3NOYW1lPXtpY29uQ3NzfSAvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGg0IGNsYXNzTmFtZT17dGl0bGVTdHlsZX0gb25DbGljaz17Y2hhbmdlRXhwYW5kZWR9PlxuICAgICAgICB7dGV4dH1cbiAgICAgICAge2V4cGFuZENvbGxhcHNlfVxuICAgICAgPC9oND5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJEZXNjcmlwdGlvbigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsQmFzZS5kZXNjcmlwdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5wYW5lbEJhc2UubG9jRGVzY3JpcHRpb24pO1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLmRlc2NyaXB0aW9ufT57dGV4dH08L2Rpdj47XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckJvdHRvbSgpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuUmVhY3RFbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckVsZW1lbnQoXCJwYW5lbFwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVBhbmVsLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9wYW5lbC50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5TmF2aWdhdGlvbkJhc2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0geyB1cGRhdGU6IDAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleSgpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc3VydmV5O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgY3NzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3NzO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlU3RhdGVGdW5jdGlvbjogYW55ID0gbnVsbDtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7IHVwZGF0ZTogc2VsZi5zdGF0ZS51cGRhdGUgKyAxIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc3VydmV5Lm9uUGFnZVZpc2libGVDaGFuZ2VkLmFkZCh0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnN1cnZleS5vblBhZ2VWaXNpYmxlQ2hhbmdlZC5yZW1vdmUodGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVGdW5jdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIFJlYWN0U3VydmV5RWxlbWVudCxcbiAgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZVxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgSVN1cnZleUNyZWF0b3IsXG4gIFN1cnZleVF1ZXN0aW9uLFxuICBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGxcbn0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHtcbiAgTWF0cml4RHJvcGRvd25DZWxsLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsXG59IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duQmFzZSBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZTtcbiAgfVxuICBwcml2YXRlIGdldFN0YXRlKHByZXZTdGF0ZTogYW55ID0gbnVsbCkge1xuICAgIHJldHVybiB7IHJvd0NvdW50ZXI6ICFwcmV2U3RhdGUgPyAwIDogcHJldlN0YXRlLnJvd0NvdW50ZXIgKyAxIH07XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9uQ2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2soKSB7XG4gICAgdGhpcy5xdWVzdGlvbi5vblJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9uQ2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgdXBkYXRlU3RhdGVPbkNhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLmlzUmVuZGVyaW5nKSByZXR1cm47XG4gICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFN0YXRlKHRoaXMuc3RhdGUpKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrKCk7XG4gIH1cbiAgaXNSZW5kZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnJlbmRlclRhYmxlRGl2KCk7XG4gIH1cbiAgcmVuZGVyVGFibGVEaXYoKTogSlNYLkVsZW1lbnQge1xuICAgIHRoaXMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgIHZhciBoZWFkZXIgPSB0aGlzLnJlbmRlckhlYWRlcigpO1xuICAgIHZhciBmb290ZXJzID0gdGhpcy5yZW5kZXJGb290ZXIoKTtcbiAgICB2YXIgcm93cyA9IHRoaXMucmVuZGVyUm93cygpO1xuICAgIHZhciBkaXZTdHlsZSA9IHRoaXMucXVlc3Rpb24uaG9yaXpvbnRhbFNjcm9sbFxuICAgICAgPyAoeyBvdmVyZmxvd1g6IFwic2Nyb2xsXCIgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzKVxuICAgICAgOiAoe30gYXMgUmVhY3QuQ1NTUHJvcGVydGllcyk7XG4gICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXtkaXZTdHlsZX0+XG4gICAgICAgIDx0YWJsZSBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgICB7aGVhZGVyfVxuICAgICAgICAgIHtyb3dzfVxuICAgICAgICAgIHtmb290ZXJzfVxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICByZW5kZXJIZWFkZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciB0YWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICBpZiAoIXRhYmxlLnNob3dIZWFkZXIpIHJldHVybiBudWxsO1xuICAgIHZhciBoZWFkZXJzOiBhbnlbXSA9IFtdO1xuICAgIHZhciBjZWxscyA9IHRhYmxlLmhlYWRlclJvdy5jZWxscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbCA9IGNlbGxzW2ldO1xuICAgICAgdmFyIGtleSA9IFwiY29sdW1uXCIgKyBpO1xuICAgICAgdmFyIGNvbHVtblN0eWxlOiBhbnkgPSB7fTtcbiAgICAgIGlmICghIWNlbGwud2lkdGgpIHtcbiAgICAgICAgY29sdW1uU3R5bGUud2lkdGggPSBjZWxsLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKCEhY2VsbC5taW5XaWR0aCkge1xuICAgICAgICBjb2x1bW5TdHlsZS5taW5XaWR0aCA9IGNlbGwubWluV2lkdGg7XG4gICAgICB9XG4gICAgICB2YXIgY29sdW1uVGl0bGUgPSB0aGlzLnJlbmRlckxvY1N0cmluZyhjZWxsLmxvY1RpdGxlKTtcbiAgICAgIGhlYWRlcnMucHVzaChcbiAgICAgICAgPHRoXG4gICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaGVhZGVyQ2VsbH1cbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICBzdHlsZT17Y29sdW1uU3R5bGV9XG4gICAgICAgID5cbiAgICAgICAgICB7Y29sdW1uVGl0bGV9XG4gICAgICAgIDwvdGg+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+e2hlYWRlcnN9PC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgKTtcbiAgfVxuICByZW5kZXJGb290ZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciB0YWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICBpZiAoIXRhYmxlLnNob3dGb290ZXIpIHJldHVybiBudWxsO1xuICAgIHZhciByb3cgPSB0aGlzLnJlbmRlclJvdyhcbiAgICAgIFwiZm9vdGVyXCIsXG4gICAgICB0YWJsZS5mb290ZXJSb3csXG4gICAgICB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXNcbiAgICApO1xuICAgIHJldHVybiA8dGZvb3Q+e3Jvd308L3Rmb290PjtcbiAgfVxuICByZW5kZXJSb3dzKCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciByZW5kZXJlZFJvd3MgPSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUucm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbmRlcmVkUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93cy5wdXNoKFxuICAgICAgICB0aGlzLnJlbmRlclJvdyhyZW5kZXJlZFJvd3NbaV0uaWQsIHJlbmRlcmVkUm93c1tpXSwgY3NzQ2xhc3NlcylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiA8dGJvZHk+e3Jvd3N9PC90Ym9keT47XG4gIH1cbiAgcmVuZGVyUm93KFxuICAgIGtleVZhbHVlOiBhbnksXG4gICAgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csXG4gICAgY3NzQ2xhc3NlczogYW55XG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgbWF0cml4cm93ID0gW107XG4gICAgdmFyIGNlbGxzID0gcm93LmNlbGxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hdHJpeHJvdy5wdXNoKHRoaXMucmVuZGVyQ2VsbChjZWxsc1tpXSwgaSwgY3NzQ2xhc3NlcykpO1xuICAgIH1cbiAgICB2YXIga2V5ID0gXCJyb3dcIiArIGtleVZhbHVlO1xuICAgIHJldHVybiA8dHIga2V5PXtrZXl9PnttYXRyaXhyb3d9PC90cj47XG4gIH1cbiAgcmVuZGVyQ2VsbChcbiAgICBjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgY3NzQ2xhc3NlczogYW55XG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIga2V5ID0gXCJjZWxsXCIgKyBpbmRleDtcbiAgICBpZiAoY2VsbC5oYXNRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25DZWxsXG4gICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc31cbiAgICAgICAgICBjZWxsPXtjZWxsLmNlbGx9XG4gICAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIGNlbGxDb250ZW50ID0gbnVsbDtcbiAgICBpZiAoY2VsbC5oYXNUaXRsZSkge1xuICAgICAgY2VsbENvbnRlbnQgPSB0aGlzLnJlbmRlckxvY1N0cmluZyhjZWxsLmxvY1RpdGxlKTtcbiAgICB9XG4gICAgaWYgKGNlbGwuaXNSZW1vdmVSb3cpIHtcbiAgICAgIGNlbGxDb250ZW50ID0gdGhpcy5yZW5kZXJSZW1vdmVCdXR0b24oY2VsbC5yb3cpO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPHRkIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5jZWxsfSBrZXk9e2tleX0+XG4gICAgICAgIHtjZWxsQ29udGVudH1cbiAgICAgIDwvdGQ+XG4gICAgKTtcbiAgfVxuICByZW5kZXJSZW1vdmVCdXR0b24ocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkNlbGwgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGwge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGNlbGwoKTogTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jZWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHEgPSBzdXBlci5nZXRRdWVzdGlvbigpO1xuICAgIGlmICghIXEpIHJldHVybiBxO1xuICAgIHJldHVybiAhIXRoaXMuY2VsbCA/IHRoaXMuY2VsbC5xdWVzdGlvbiA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGRvQWZ0ZXJSZW5kZXIoKSB7XG4gICAgdmFyIGVsOiBhbnkgPSB0aGlzLnJlZnNbXCJjZWxsXCJdO1xuICAgIGlmIChcbiAgICAgIGVsICYmXG4gICAgICB0aGlzLmNlbGwgJiZcbiAgICAgIHRoaXMucXVlc3Rpb24gJiZcbiAgICAgIHRoaXMucXVlc3Rpb24uc3VydmV5ICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIpICE9PSBcInJcIlxuICAgICkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1yZW5kZXJlZFwiLCBcInJcIik7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgICBjZWxsUXVlc3Rpb246IHRoaXMucXVlc3Rpb24sXG4gICAgICAgIGh0bWxFbGVtZW50OiBlbCxcbiAgICAgICAgcm93OiB0aGlzLmNlbGwucm93LFxuICAgICAgICBjb2x1bW46IHRoaXMuY2VsbC5jb2x1bW5cbiAgICAgIH07XG4gICAgICB0aGlzLnF1ZXN0aW9uLnN1cnZleS5tYXRyaXhBZnRlckNlbGxSZW5kZXIodGhpcy5xdWVzdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRDZWxsQ2xhc3MoKTogYW55IHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmNlbGwucXVlc3Rpb247XG5cbiAgICB2YXIgY2VsbENsYXNzID0gdGhpcy5jZWxsLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbVZhbHVlO1xuXG4gICAgaWYgKHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggIT09IDApXG4gICAgICBjZWxsQ2xhc3MgKz0gXCIgXCIgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLmhhc0Vycm9yO1xuXG4gICAgY2VsbENsYXNzICs9IFwiIFwiICsgcXVlc3Rpb24uY3NzQ2xhc3Nlcy5hc0NlbGw7XG5cbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGRyb3Bkb3duYmFzZS50c3giLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgRnVuY3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL2Z1bmN0aW9uc2ZhY3RvcnlcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhbmQge1xuICBwdWJsaWMgdG9TdHJpbmcoZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRUeXBlKCk6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueTtcbiAgcHVibGljIGFic3RyYWN0IHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pOiBhbnk7XG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KTogdm9pZCB7fVxufVxuXG5leHBvcnQgY2xhc3MgQmluYXJ5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwcml2YXRlIGNvbnN1bWVyOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBpc0FyaXRobWV0aWNWYWx1ZTogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvcGVyYXRvck5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIGxlZnQ6IGFueSA9IG51bGwsXG4gICAgcHJpdmF0ZSByaWdodDogYW55ID0gbnVsbCxcbiAgICBpc0FyaXRobWV0aWNPcDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pc0FyaXRobWV0aWNWYWx1ZSA9IGlzQXJpdGhtZXRpY09wO1xuICAgIGlmIChpc0FyaXRobWV0aWNPcCkge1xuICAgICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnNbXCJhcml0aG1ldGljT3BcIl0oXG4gICAgICAgIG9wZXJhdG9yTmFtZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnNbb3BlcmF0b3JOYW1lXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25zdW1lciA9PSBudWxsKSB7XG4gICAgICBPcGVyYW5kTWFrZXIudGhyb3dJbnZhbGlkT3BlcmF0b3JFcnJvcihvcGVyYXRvck5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJpbmFyeVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBcml0aG1ldGljKCkge1xuICAgIHJldHVybiB0aGlzLmlzQXJpdGhtZXRpY1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb25qdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvck5hbWUgPT0gXCJvclwiIHx8IHRoaXMub3BlcmF0b3JOYW1lID09IFwiYW5kXCI7XG4gIH1cbiAgcHVibGljIGdldCBsZWZ0T3BlcmFuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZWZ0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmlnaHRPcGVyYW5kKCkge1xuICAgIHJldHVybiB0aGlzLnJpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZVBhcmFtKHg6IGFueSwgcHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IHguZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVyLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5ldmFsdWF0ZVBhcmFtKHRoaXMubGVmdCwgcHJvY2Vzc1ZhbHVlKSxcbiAgICAgIHRoaXMuZXZhbHVhdGVQYXJhbSh0aGlzLnJpZ2h0LCBwcm9jZXNzVmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBcIihcIiArXG4gICAgICBPcGVyYW5kTWFrZXIuc2FmZVRvU3RyaW5nKHRoaXMubGVmdCwgZnVuYykgK1xuICAgICAgXCIgXCIgK1xuICAgICAgT3BlcmFuZE1ha2VyLm9wZXJhdG9yVG9TdHJpbmcodGhpcy5vcGVyYXRvck5hbWUpICtcbiAgICAgIFwiIFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci5zYWZlVG9TdHJpbmcodGhpcy5yaWdodCwgZnVuYykgK1xuICAgICAgXCIpXCJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAodGhpcy5sZWZ0ICE9IG51bGwpIHRoaXMubGVmdC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICBpZiAodGhpcy5yaWdodCAhPSBudWxsKSB0aGlzLnJpZ2h0LnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG5cbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoISF0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lmhhc0Z1bmN0aW9uKCkpIHx8XG4gICAgICAoISF0aGlzLnJpZ2h0ICYmIHRoaXMucmlnaHQuaGFzRnVuY3Rpb24oKSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBoYXNBc3luY0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoISF0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lmhhc0FzeW5jRnVuY3Rpb24oKSkgfHxcbiAgICAgICghIXRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5oYXNBc3luY0Z1bmN0aW9uKCkpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIGlmICghIXRoaXMubGVmdCkgdGhpcy5sZWZ0LmFkZFRvQXN5bmNMaXN0KGxpc3QpO1xuICAgIGlmICghIXRoaXMucmlnaHQpIHRoaXMucmlnaHQuYWRkVG9Bc3luY0xpc3QobGlzdCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXJ5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwcml2YXRlIGNvbnN1bWVyOiBGdW5jdGlvbjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBPcGVyYW5kLCBwcml2YXRlIG9wZXJhdG9yTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbnN1bWVyID0gT3BlcmFuZE1ha2VyLnVuYXJ5RnVuY3Rpb25zW29wZXJhdG9yTmFtZV07XG4gICAgaWYgKHRoaXMuY29uc3VtZXIgPT0gbnVsbCkge1xuICAgICAgT3BlcmFuZE1ha2VyLnRocm93SW52YWxpZE9wZXJhdG9yRXJyb3Iob3BlcmF0b3JOYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ1bmFyeVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBPcGVyYW5kTWFrZXIub3BlcmF0b3JUb1N0cmluZyh0aGlzLm9wZXJhdG9yTmFtZSkgK1xuICAgICAgXCIgXCIgK1xuICAgICAgdGhpcy5leHByZXNzaW9uLnRvU3RyaW5nKGZ1bmMpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBib29sZWFuIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5leHByZXNzaW9uLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcnJheU9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YWx1ZXM6IEFycmF5PE9wZXJhbmQ+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImFycmF5XCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIFwiW1wiICtcbiAgICAgIHRoaXMudmFsdWVzXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oZWw6IE9wZXJhbmQpIHtcbiAgICAgICAgICByZXR1cm4gZWwudG9TdHJpbmcoZnVuYyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiLCBcIikgK1xuICAgICAgXCJdXCJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcy5tYXAoZnVuY3Rpb24oZWw6IE9wZXJhbmQpIHtcbiAgICAgIHJldHVybiBlbC5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcy5zb21lKG9wZXJhbmQgPT4gb3BlcmFuZC5oYXNGdW5jdGlvbigpKTtcbiAgfVxuICBwdWJsaWMgaGFzQXN5bmNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc29tZShvcGVyYW5kID0+IG9wZXJhbmQuaGFzQXN5bmNGdW5jdGlvbigpKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIHRoaXMudmFsdWVzLmZvckVhY2gob3BlcmFuZCA9PiBvcGVyYW5kLmFkZFRvQXN5bmNMaXN0KGxpc3QpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uc3QgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YWx1ZTogYW55KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbnN0XCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvcnJlY3RWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7fVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodGhpcy5pc0Jvb2xlYW5WYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgICBpZiAoT3BlcmFuZE1ha2VyLmlzTnVtZXJpYyh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiMHhcIikgPT0gMCkgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNCb29sZWFuVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIilcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIENvbnN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YXJpYWJsZU5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHZhcmlhYmxlTmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ2YXJpYWJsZVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiBcIntcIiArIHRoaXMudmFyaWFibGVOYW1lICsgXCJ9XCI7XG4gIH1cbiAgcHVibGljIGdldCB2YXJpYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZU5hbWU7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4gcHJvY2Vzc1ZhbHVlLmhhc1ZhbHVlKHRoaXMudmFyaWFibGVOYW1lKVxuICAgICAgPyB0aGlzLmdldENvcnJlY3RWYWx1ZShwcm9jZXNzVmFsdWUuZ2V0VmFsdWUodGhpcy52YXJpYWJsZU5hbWUpKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdmFyaWFibGVzLnB1c2godGhpcy52YXJpYWJsZU5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbk9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgcHJpdmF0ZSBpc1JlYWR5VmFsdWU6IGJvb2xlYW47XG4gIHByaXZhdGUgYXN5blJlc3VsdDogYW55O1xuICBwdWJsaWMgb25Bc3luY1JlYWR5OiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9yaWdpb25hbFZhbHVlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBwYXJhbWV0ZXJzOiBBcnJheU9wZXJhbmRcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpICYmIHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMgPSBuZXcgQXJyYXlPcGVyYW5kKFtdKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmdW5jdGlvblwiO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZUFzeW5jKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKSB7XG4gICAgdGhpcy5pc1JlYWR5VmFsdWUgPSBmYWxzZTtcbiAgICB2YXIgYXN5bmNQcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgYXN5bmNQcm9jZXNzVmFsdWUudmFsdWVzID0gSGVscGVycy5jcmVhdGVDb3B5KHByb2Nlc3NWYWx1ZS52YWx1ZXMpO1xuICAgIGFzeW5jUHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBIZWxwZXJzLmNyZWF0ZUNvcHkocHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMpO1xuICAgIGFzeW5jUHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMucmV0dXJuUmVzdWx0ID0gKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICB0aGlzLmFzeW5SZXN1bHQgPSByZXN1bHQ7XG4gICAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IHRydWU7XG4gICAgICB0aGlzLm9uQXN5bmNSZWFkeSgpO1xuICAgIH07XG4gICAgdGhpcy5ldmFsdWF0ZUNvcmUoYXN5bmNQcm9jZXNzVmFsdWUpO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzUmVhZHkpIHJldHVybiB0aGlzLmFzeW5SZXN1bHQ7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDb3JlKHByb2Nlc3NWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvcmUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4gRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJ1bihcbiAgICAgIHRoaXMub3JpZ2lvbmFsVmFsdWUsXG4gICAgICB0aGlzLnBhcmFtZXRlcnMuZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKSxcbiAgICAgIHByb2Nlc3NWYWx1ZS5wcm9wZXJ0aWVzXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCkge1xuICAgIGlmICghIWZ1bmMpIHtcbiAgICAgIHZhciByZXMgPSBmdW5jKHRoaXMpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcmlnaW9uYWxWYWx1ZSArIFwiKFwiICsgdGhpcy5wYXJhbWV0ZXJzLnRvU3RyaW5nKGZ1bmMpICsgXCIpXCI7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMucGFyYW1ldGVycy5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkeVZhbHVlO1xuICB9XG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgaGFzQXN5bmNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLmlzQXN5bmNGdW5jdGlvbih0aGlzLm9yaWdpb25hbFZhbHVlKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIGlmICh0aGlzLmhhc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgbGlzdC5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3BlcmFuZE1ha2VyIHtcbiAgc3RhdGljIHRocm93SW52YWxpZE9wZXJhdG9yRXJyb3Iob3A6IHN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb3BlcmF0b3I6ICdcIiArIG9wICsgXCInXCIpO1xuICB9XG5cbiAgc3RhdGljIHNhZmVUb1N0cmluZyhvcGVyYW5kOiBPcGVyYW5kLCBmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9wZXJhbmQgPT0gbnVsbCA/IFwiXCIgOiBvcGVyYW5kLnRvU3RyaW5nKGZ1bmMpO1xuICB9XG5cbiAgc3RhdGljIHRvT3BlcmFuZFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICAhIXZhbHVlICYmXG4gICAgICAhT3BlcmFuZE1ha2VyLmlzTnVtZXJpYyh2YWx1ZSkgJiZcbiAgICAgICFPcGVyYW5kTWFrZXIuaXNCb29sZWFuVmFsdWUodmFsdWUpXG4gICAgKVxuICAgICAgdmFsdWUgPSBcIidcIiArIHZhbHVlICsgXCInXCI7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIGlzU3BhY2VTdHJpbmcoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzdHIgJiYgIXN0ci5yZXBsYWNlKFwiIFwiLCBcIlwiKTtcbiAgfVxuXG4gIHN0YXRpYyBpc051bWVyaWModmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgICh2YWx1ZS5pbmRleE9mKFwiLVwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIrXCIpID4gMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiKlwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCJeXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIi9cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiJVwiKSA+IC0xKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoT3BlcmFuZE1ha2VyLmlzU3BhY2VTdHJpbmcodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNOdW1iZXIodmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIGlzQm9vbGVhblZhbHVlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF2YWx1ZSAmJlxuICAgICAgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIilcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHVuYXJ5RnVuY3Rpb25zOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0ge1xuICAgIGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICAgIH0sXG4gICAgbm90ZW1wdHk6IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhT3BlcmFuZE1ha2VyLnVuYXJ5RnVuY3Rpb25zLmVtcHR5KHZhbHVlKTtcbiAgICB9LFxuICAgIG5lZ2F0ZTogZnVuY3Rpb24odmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBiaW5hcnlGdW5jdGlvbnM6IEhhc2hUYWJsZTxGdW5jdGlvbj4gPSB7XG4gICAgYXJpdGhtZXRpY09wKG9wZXJhdG9yTmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oYTogYW55LCBiOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkoYSkgJiYgIU9wZXJhbmRNYWtlci5pc1NwYWNlU3RyaW5nKGEpKSB7XG4gICAgICAgICAgYSA9IHR5cGVvZiBiID09PSBcInN0cmluZ1wiID8gXCJcIiA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGIpICYmICFPcGVyYW5kTWFrZXIuaXNTcGFjZVN0cmluZyhiKSkge1xuICAgICAgICAgIGIgPSB0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiA/IFwiXCIgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnN1bWVyID0gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9uc1tvcGVyYXRvck5hbWVdO1xuICAgICAgICByZXR1cm4gY29uc3VtZXIgPT0gbnVsbCA/IG51bGwgOiBjb25zdW1lci5jYWxsKHRoaXMsIGEsIGIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGFuZDogZnVuY3Rpb24oYTogYm9vbGVhbiwgYjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGEgJiYgYjtcbiAgICB9LFxuICAgIG9yOiBmdW5jdGlvbihhOiBib29sZWFuLCBiOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gYSB8fCBiO1xuICAgIH0sXG4gICAgcGx1czogZnVuY3Rpb24oYTogYW55LCBiOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH0sXG4gICAgbWludXM6IGZ1bmN0aW9uKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9LFxuICAgIG11bDogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIGEgKiBiO1xuICAgIH0sXG4gICAgZGl2OiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBpZiAoIWIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGEgLyBiO1xuICAgIH0sXG4gICAgbW9kOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBpZiAoIWIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGEgJSBiO1xuICAgIH0sXG4gICAgcG93ZXI6IGZ1bmN0aW9uKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdyhhLCBiKTtcbiAgICB9LFxuICAgIGdyZWF0ZXI6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gbGVmdCA+IHJpZ2h0O1xuICAgIH0sXG4gICAgbGVzczogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBsZWZ0IDwgcmlnaHQ7XG4gICAgfSxcbiAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBsZWZ0ID49IHJpZ2h0O1xuICAgIH0sXG4gICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgICB9LFxuICAgIGVxdWFsOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgIH0sXG4gICAgbm90ZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgIH0sXG4gICAgY29udGFpbnM6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnNDb3JlKGxlZnQsIHJpZ2h0LCB0cnVlKTtcbiAgICB9LFxuICAgIG5vdGNvbnRhaW5zOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICghbGVmdCAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zQ29yZShsZWZ0LCByaWdodCwgZmFsc2UpO1xuICAgIH0sXG4gICAgYW55b2Y6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHJpZ2h0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoIWxlZnQgfHwgKCFBcnJheS5pc0FycmF5KGxlZnQpICYmIGxlZnQubGVuZ3RoID09PSAwKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHJpZ2h0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGVmdCkpXG4gICAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKHJpZ2h0LCBsZWZ0KTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyaWdodCkpXG4gICAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmlnaHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMobGVmdCwgcmlnaHRbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGFsbG9mOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICghbGVmdCAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmlnaHQpKVxuICAgICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhsZWZ0LCByaWdodCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpZ2h0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhsZWZ0LCByaWdodFtpXSkpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBjb250YWluc0NvcmU6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgaXNDb250YWluczogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoIWxlZnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgbGVmdCA9IGxlZnQudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGVmdCA9PT0gXCJzdHJpbmdcIiB8fCBsZWZ0IGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmlnaHQgPSByaWdodC50b1N0cmluZygpO1xuICAgICAgICB2YXIgZm91bmQgPSBsZWZ0LmluZGV4T2YocmlnaHQpID4gLTE7XG4gICAgICAgIHJldHVybiBpc0NvbnRhaW5zID8gZm91bmQgOiAhZm91bmQ7XG4gICAgICB9XG4gICAgICB2YXIgcmlnaHRBcnJheSA9IEFycmF5LmlzQXJyYXkocmlnaHQpID8gcmlnaHQgOiBbcmlnaHRdO1xuICAgICAgZm9yICh2YXIgckluZGV4ID0gMDsgckluZGV4IDwgcmlnaHRBcnJheS5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgcmlnaHQgPSByaWdodEFycmF5W3JJbmRleF07XG4gICAgICAgIGZvciAoOyBpIDwgbGVmdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobGVmdFtpXSwgcmlnaHQpKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PSBsZWZ0Lmxlbmd0aCkgcmV0dXJuICFpc0NvbnRhaW5zO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQ29udGFpbnM7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBvcGVyYXRvclRvU3RyaW5nKG9wZXJhdG9yTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgb3BTdHIgPSBPcGVyYW5kTWFrZXIuc2lnbnNbb3BlcmF0b3JOYW1lXTtcbiAgICByZXR1cm4gb3BTdHIgPT0gbnVsbCA/IG9wZXJhdG9yTmFtZSA6IG9wU3RyO1xuICB9XG5cbiAgc3RhdGljIHNpZ25zOiBIYXNoVGFibGU8c3RyaW5nPiA9IHtcbiAgICBsZXNzOiBcIjxcIixcbiAgICBsZXNzb3JlcXVhbDogXCI8PVwiLFxuICAgIGdyZWF0ZXI6IFwiPlwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcIj49XCIsXG4gICAgZXF1YWw6IFwiPT1cIixcbiAgICBub3RlcXVhbDogXCIhPVwiLFxuICAgIHBsdXM6IFwiK1wiLFxuICAgIG1pbnVzOiBcIi1cIixcbiAgICBtdWw6IFwiKlwiLFxuICAgIGRpdjogXCIvXCIsXG4gICAgYW5kOiBcImFuZFwiLFxuICAgIG9yOiBcIm9yXCIsXG4gICAgcG93ZXI6IFwiXlwiLFxuICAgIG1vZDogXCIlXCIsXG4gICAgbmVnYXRlOiBcIiFcIlxuICB9O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRnVuY3Rpb25GYWN0b3J5ID0gbmV3IEZ1bmN0aW9uRmFjdG9yeSgpO1xuICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKSA9PiBhbnk+ID0ge307XG4gIHByaXZhdGUgaXNBc3luY0hhc2g6IEhhc2hUYWJsZTxib29sZWFuPiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnVuYzogKHBhcmFtczogYW55W10pID0+IGFueSxcbiAgICBpc0FzeW5jOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV0gPSBmdW5jO1xuICAgIGlmIChpc0FzeW5jKSB0aGlzLmlzQXN5bmNIYXNoW25hbWVdID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlcihuYW1lOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuaXNBc3luY0hhc2hbbmFtZV07XG4gIH1cbiAgcHVibGljIGhhc0Z1bmN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBpc0FzeW5jRnVuY3Rpb24obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pc0FzeW5jSGFzaFtuYW1lXTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmZ1bmN0aW9uSGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGwoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmZ1bmN0aW9uSGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIHJ1bihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKTogYW55IHtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICAgIGlmICghZnVuYykgcmV0dXJuIG51bGw7XG4gICAgbGV0IGNsYXNzUnVubmVyID0ge1xuICAgICAgZnVuYzogZnVuY1xuICAgIH07XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgKDxhbnk+Y2xhc3NSdW5uZXIpW2tleV0gPSBwcm9wZXJ0aWVzW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc1J1bm5lci5mdW5jKHBhcmFtcyk7XG4gIH1cbn1cblxuZXhwb3J0IHZhciByZWdpc3RlckZ1bmN0aW9uID0gRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyO1xuXG5mdW5jdGlvbiBnZXRQYXJhbXNBc0FycmF5KHZhbHVlOiBhbnksIGFycjogYW55W10pIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBnZXRQYXJhbXNBc0FycmF5KHZhbHVlW2ldLCBhcnIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhcnIucHVzaCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VtKHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzICs9IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtXCIsIHN1bSk7XG5cbmZ1bmN0aW9uIGNvdW50KHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgcmV0dXJuIGFyci5sZW5ndGg7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJjb3VudFwiLCBjb3VudCk7XG5cbmZ1bmN0aW9uIGF2ZyhwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIGFyci5sZW5ndGggPiAwID8gcmVzIC8gYXJyLmxlbmd0aCA6IDA7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhdmdcIiwgYXZnKTtcblxuZnVuY3Rpb24gZ2V0SW5BcnJheVBhcmFtcyhwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKHBhcmFtcy5sZW5ndGggIT0gMikgcmV0dXJuIG51bGw7XG4gIHZhciBhcnIgPSBwYXJhbXNbMF07XG4gIGlmICghYXJyKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikgJiYgIUFycmF5LmlzQXJyYXkoT2JqZWN0LmtleXMoYXJyKSkpIHJldHVybiBudWxsO1xuICB2YXIgbmFtZSA9IHBhcmFtc1sxXTtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiICYmICEobmFtZSBpbnN0YW5jZW9mIFN0cmluZykpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBkYXRhOiBhcnIsIG5hbWU6IG5hbWUgfTtcbn1cblxuZnVuY3Rpb24gY2FsY0luQXJyYXkoXG4gIHBhcmFtczogYW55W10sXG4gIGZ1bmM6IChyZXM6IG51bWJlciwgdmFsOiBudW1iZXIpID0+IG51bWJlclxuKTogYW55IHtcbiAgdmFyIHYgPSBnZXRJbkFycmF5UGFyYW1zKHBhcmFtcyk7XG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIHJlcyA9IHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodi5kYXRhKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHYuZGF0YVtpXTtcbiAgICAgIGlmICghIWl0ZW0gJiYgaXRlbVs8c3RyaW5nPnYubmFtZV0pIHtcbiAgICAgICAgcmVzID0gZnVuYyhyZXMsIGl0ZW1bPHN0cmluZz52Lm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIga2V5IGluIHYuZGF0YSkge1xuICAgICAgdmFyIGl0ZW0gPSB2LmRhdGFba2V5XTtcbiAgICAgIGlmICghIWl0ZW0gJiYgaXRlbVs8c3RyaW5nPnYubmFtZV0pIHtcbiAgICAgICAgcmVzID0gZnVuYyhyZXMsIGl0ZW1bPHN0cmluZz52Lm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gc3VtSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIHJlcyA9IGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmVzID0gMDtcbiAgICByZXR1cm4gK3JlcyArICt2YWw7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtSW5BcnJheVwiLCBzdW1JbkFycmF5KTtcblxuZnVuY3Rpb24gbWluSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gcmVzIDwgdmFsID8gcmVzIDogdmFsO1xuICB9KTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1pbkluQXJyYXlcIiwgbWluSW5BcnJheSk7XG5cbmZ1bmN0aW9uIG1heEluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHJlcyA+IHZhbCA/IHJlcyA6IHZhbDtcbiAgfSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJtYXhJbkFycmF5XCIsIG1heEluQXJyYXkpO1xuXG5mdW5jdGlvbiBjb3VudEluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IDA7XG4gICAgcmV0dXJuIHJlcyArIDE7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY291bnRJbkFycmF5XCIsIGNvdW50SW5BcnJheSk7XG5cbmZ1bmN0aW9uIGF2Z0luQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciBjb3VudCA9IGNvdW50SW5BcnJheShwYXJhbXMpO1xuICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBzdW1JbkFycmF5KHBhcmFtcykgLyBjb3VudDtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImF2Z0luQXJyYXlcIiwgYXZnSW5BcnJheSk7XG5cbmZ1bmN0aW9uIGlpZihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXJhbXNbMF0gPyBwYXJhbXNbMV0gOiBwYXJhbXNbMl07XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpaWZcIiwgaWlmKTtcblxuZnVuY3Rpb24gZ2V0RGF0ZShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiBudWxsO1xuICBpZiAoIXBhcmFtc1swXSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgRGF0ZShwYXJhbXNbMF0pO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiZ2V0RGF0ZVwiLCBnZXREYXRlKTtcblxuZnVuY3Rpb24gYWdlKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICghcGFyYW1zWzBdKSByZXR1cm4gbnVsbDtcbiAgdmFyIGJpcnRoRGF5ID0gbmV3IERhdGUocGFyYW1zWzBdKTtcbiAgdmFyIGFnZURpZk1zID0gRGF0ZS5ub3coKSAtIGJpcnRoRGF5LmdldFRpbWUoKTtcbiAgdmFyIGFnZURhdGUgPSBuZXcgRGF0ZShhZ2VEaWZNcyk7IC8vIG1pbGlzZWNvbmRzIGZyb20gZXBvY2hcbiAgcmV0dXJuIE1hdGguYWJzKGFnZURhdGUuZ2V0VVRDRnVsbFllYXIoKSAtIDE5NzApO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiYWdlXCIsIGFnZSk7XG5cbmZ1bmN0aW9uIGlzQ29udGFpbmVyUmVhZHkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIGlmICghcGFyYW1zICYmIHBhcmFtcy5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2U7XG4gIGlmICghcGFyYW1zWzBdIHx8ICF0aGlzLnN1cnZleSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgbmFtZSA9IHBhcmFtc1swXTtcbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuc3VydmV5LmdldFBhZ2VCeU5hbWUobmFtZSk7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSB0aGlzLnN1cnZleS5nZXRQYW5lbEJ5TmFtZShuYW1lKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybiBmYWxzZTtcbiAgdmFyIHF1ZXN0aW9ucyA9IGNvbnRhaW5lci5xdWVzdGlvbnM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHF1ZXN0aW9uc1tpXS5oYXNFcnJvcnMoZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpc0NvbnRhaW5lclJlYWR5XCIsIGlzQ29udGFpbmVyUmVhZHkpO1xuXG5mdW5jdGlvbiBpc0Rpc3BsYXlNb2RlKCkge1xuICByZXR1cm4gdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEaXNwbGF5TW9kZTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlzRGlzcGxheU1vZGVcIiwgaXNEaXNwbGF5TW9kZSk7XG5cbmZ1bmN0aW9uIGN1cnJlbnREYXRlKCkge1xuICByZXR1cm4gbmV3IERhdGUoKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImN1cnJlbnREYXRlXCIsIGN1cnJlbnREYXRlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwiaW1wb3J0IHtcbiAgSnNvbk9iamVjdCxcbiAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24sXG4gIEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgU2VyaWFsaXplclxufSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbCB9IGZyb20gXCIuL21hcnRpeEJhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIEJhc2UsXG4gIElRdWVzdGlvbixcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvcixcbiAgU3VydmV5RXJyb3Jcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFN1cnZleVZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgZ2V0Q3VycmVjeUNvZGVzIH0gZnJvbSBcIi4vcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgRnVuY3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICB2YWx1ZTogYW55O1xuICBvblJvd0NoYW5nZWQoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgbmV3Um93VmFsdWU6IGFueSxcbiAgICBpc0RlbGV0aW5nVmFsdWU6IGJvb2xlYW5cbiAgKTogdm9pZDtcbiAgb25Sb3dDaGFuZ2luZyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueTtcbiAgZ2V0Um93SW5kZXgocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IG51bWJlcjtcbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3I7XG4gIGNvbHVtbnM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPjtcbiAgY3JlYXRlUXVlc3Rpb24oXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uO1xuICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogUXVlc3Rpb247XG4gIG9uVG90YWxWYWx1ZUNoYW5nZWQoKTogYW55O1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4Q29sdW1uT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldFJlcXVpcmVkVGV4dCgpOiBzdHJpbmc7XG4gIG9uQ29sdW1uUHJvcGVydGllc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHZvaWQ7XG4gIGdldENlbGxUeXBlKCk6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKFxuICBjZWxsUXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIGRhdGE6IGFueVxuKSB7XG4gIGlmIChjZWxsUXVlc3Rpb24uaGFzT3RoZXIpIHtcbiAgICBjZWxsUXVlc3Rpb24uc3RvcmVPdGhlcnNBc0NvbW1lbnQgPSBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgKCFjZWxsUXVlc3Rpb24uY2hvaWNlcyB8fCBjZWxsUXVlc3Rpb24uY2hvaWNlcy5sZW5ndGggPT0gMCkgJiZcbiAgICBjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLmlzRW1wdHlcbiAgKSB7XG4gICAgY2VsbFF1ZXN0aW9uLmNob2ljZXMgPSBxdWVzdGlvbi5jaG9pY2VzO1xuICB9XG4gIGlmICghY2VsbFF1ZXN0aW9uLmNob2ljZXNCeVVybC5pc0VtcHR5KSB7XG4gICAgY2VsbFF1ZXN0aW9uLmNob2ljZXNCeVVybC5ydW4oZGF0YSk7XG4gIH1cbn1cbmV4cG9ydCB2YXIgbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcyA9IHtcbiAgZHJvcGRvd246IHtcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICBcImNob2ljZXNcIixcbiAgICAgIFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIFwiY2hvaWNlc1Zpc2libGVJZlwiXG4gICAgXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgaWYgKFxuICAgICAgICBjZWxsUXVlc3Rpb24ubG9jT3B0aW9uc0NhcHRpb24uaXNFbXB0eSAmJlxuICAgICAgICAhcXVlc3Rpb24ubG9jT3B0aW9uc0NhcHRpb24uaXNFbXB0eVxuICAgICAgKSB7XG4gICAgICAgIGNlbGxRdWVzdGlvbi5vcHRpb25zQ2FwdGlvbiA9IHF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICBcImNob2ljZXNcIixcbiAgICAgIFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIFwiY2hvaWNlc1Zpc2libGVJZlwiXG4gICAgXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgY2VsbFF1ZXN0aW9uLmNvbENvdW50ID1cbiAgICAgICAgY29sdW1uLmNvbENvdW50ID4gLTEgPyBjb2x1bW4uY29sQ291bnQgOiBxdWVzdGlvbi5jb2x1bW5Db2xDb3VudDtcbiAgICB9XG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICBcImNob2ljZXNcIixcbiAgICAgIFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIFwiY2hvaWNlc1Zpc2libGVJZlwiXG4gICAgXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgY2VsbFF1ZXN0aW9uLmNvbENvdW50ID1cbiAgICAgICAgY29sdW1uLmNvbENvdW50ID4gLTEgPyBjb2x1bW4uY29sQ291bnQgOiBxdWVzdGlvbi5jb2x1bW5Db2xDb3VudDtcbiAgICB9XG4gIH0sXG4gIHRleHQ6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJwbGFjZUhvbGRlclwiLCBcImlucHV0VHlwZVwiLCBcIm1heExlbmd0aFwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHt9XG4gIH0sXG4gIGNvbW1lbnQ6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJwbGFjZUhvbGRlclwiLCBcInJvd3NcIiwgXCJtYXhMZW5ndGhcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7fVxuICB9LFxuICBib29sZWFuOiB7XG4gICAgcHJvcGVydGllczogW1wiZGVmYXVsdFZhbHVlXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgY2VsbFF1ZXN0aW9uLnNob3dUaXRsZSA9IHRydWU7XG4gICAgfVxuICB9LFxuICBleHByZXNzaW9uOiB7XG4gICAgcHJvcGVydGllczogW1wiZXhwcmVzc2lvblwiLCBcImRpc3BsYXlTdHlsZVwiLCBcImN1cnJlbmN5XCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge31cbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcHJvcGVydGllczogW1wicmF0ZVZhbHVlc1wiXVxuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Db2x1bW4gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBwdWJsaWMgc3RhdGljIGdldENvbHVtblR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcykge1xuICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHRlbXBsYXRlUXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIHByaXZhdGUgY29sT3duZXJWYWx1ZTogSU1hdHJpeENvbHVtbk93bmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBpbmRleFZhbHVlID0gLTE7XG4gIHByaXZhdGUgX2lzVmlzaWJsZSA9IHRydWU7XG4gIHByaXZhdGUgX2hhc1Zpc2libGVDZWxsID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRvdGFsRm9ybWF0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcbiAgICAgICAgXCJ0b3RhbFR5cGVcIixcbiAgICAgICAgXCJ0b3RhbEV4cHJlc3Npb25cIixcbiAgICAgICAgXCJ0b3RhbEZvcm1hdFwiLFxuICAgICAgICBcInRvdGFsQ3VycmVuY3lcIixcbiAgICAgICAgXCJ0b3RhbERpc3BsYXlTdHlsZVwiLFxuICAgICAgICBcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsXG4gICAgICAgIFwidG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHNcIlxuICAgICAgXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmRvQ29sdW1uUHJvcGVydGllc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgaWYgKHRpdGxlKSB0aGlzLnRpdGxlID0gdGl0bGU7XG4gIH1cbiAgZ2V0RHluYW1pY1Byb3BlcnR5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNlbGxUeXBlXCI7XG4gIH1cbiAgZ2V0RHluYW1pY1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICB9XG4gIGdldER5bmFtaWNQcm9wZXJ0aWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBxVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgICB2YXIgcURlZmluaXRpb24gPSAoPGFueT5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKVtxVHlwZV07XG4gICAgaWYgKHFEZWZpbml0aW9uKSByZXR1cm4gcURlZmluaXRpb24ucHJvcGVydGllcztcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldCBjb2xPd25lcigpOiBJTWF0cml4Q29sdW1uT3duZXIge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjb2xPd25lcih2YWx1ZTogSU1hdHJpeENvbHVtbk93bmVyKSB7XG4gICAgdGhpcy5jb2xPd25lclZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5sb2NUaXRsZS5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGFkZFVzZWRMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBzdXBlci5hZGRVc2VkTG9jYWxlcyhsb2NhbGVzKTtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gIH1cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRJbmRleCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuaW5kZXhWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiO1xuICB9XG4gIHB1YmxpYyBnZXQgY2VsbFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVF1ZXN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG4gIHB1YmxpYyBzZXRJc1Zpc2libGUobmV3VmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNWaXNpYmxlID0gbmV3VmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUNlbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc1Zpc2libGVDZWxsO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzVmlzaWJsZUNlbGwobmV3VmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGFzVmlzaWJsZUNlbGwgPSBuZXdWYWw7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnRpdGxlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RpdGxlLnRleHRPckh0bWw7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaXNSZXF1aXJlZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzUmVxdWlyZWQgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRFcnJvclRleHQ7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZEVycm9yVGV4dCA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jUmVxdWlyZWRFcnJvclRleHQ7XG4gIH1cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlYWRPbmx5O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlYWRPbmx5ID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5oYXNPdGhlcjtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5oYXNPdGhlciA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmlzaWJsZUlmO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnZpc2libGVJZiA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGVuYWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5lbmFibGVJZjtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuYWJsZUlmID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRJZjtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRJZiA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnZpc2libGVJZiB8fFxuICAgICAgISF0aGlzLmVuYWJsZUlmIHx8XG4gICAgICAhIXRoaXMucmVxdWlyZWRJZiB8fFxuICAgICAgdGhpcy5jZWxsVHlwZSA9PT0gXCJleHByZXNzaW9uXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnZhbGlkYXRvcnM7XG4gIH1cbiAgcHVibGljIHNldCB2YWxpZGF0b3JzKHZhbDogQXJyYXk8U3VydmV5VmFsaWRhdG9yPikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52YWxpZGF0b3JzID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgdG90YWxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsVHlwZVwiLCBcIm5vbmVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbFR5cGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbEV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvdGFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvdGFsVHlwZSAhPSBcIm5vbmVcIiB8fCAhIXRoaXMudG90YWxFeHByZXNzaW9uO1xuICB9XG4gIHB1YmxpYyBnZXQgdG90YWxGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbEZvcm1hdFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsRm9ybWF0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbEZvcm1hdFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NUb3RhbEZvcm1hdCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbEZvcm1hdFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsRGlzcGxheVN0eWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsRGlzcGxheVN0eWxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxEaXNwbGF5U3R5bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbERpc3BsYXlTdHlsZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdG90YWxDdXJyZW5jeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEN1cnJlbmN5XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxDdXJyZW5jeSh2YWw6IHN0cmluZykge1xuICAgIGlmIChnZXRDdXJyZWN5Q29kZXMoKS5pbmRleE9mKHZhbCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxDdXJyZW5jeVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbWluV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5XaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlQ2VsbFF1ZXN0aW9uKGRhdGE6IGFueSk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIGNlbGxRdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmNyZWF0ZU5ld1F1ZXN0aW9uKHFUeXBlKTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGRhdGEpO1xuICAgIHJldHVybiBjZWxsUXVlc3Rpb247XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb246IFF1ZXN0aW9uLCBkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnNldFF1ZXN0aW9uUHJvcGVydGllcyhjZWxsUXVlc3Rpb24pO1xuICAgIHZhciBxVHlwZSA9IGNlbGxRdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgdmFyIHFEZWZpbml0aW9uID0gKDxhbnk+bWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcylbcVR5cGVdO1xuICAgIGlmIChxRGVmaW5pdGlvbiAmJiBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKSB7XG4gICAgICBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKFxuICAgICAgICBjZWxsUXVlc3Rpb24sXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMuY29sT3duZXIsXG4gICAgICAgIGRhdGFcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGRlZmF1bHRDZWxsVHlwZUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbGNDZWxsUXVlc3Rpb25UeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY2VsbFR5cGUgIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy5jZWxsVHlwZTtcbiAgICBpZiAodGhpcy5jb2xPd25lcikgcmV0dXJuIHRoaXMuY29sT3duZXIuZ2V0Q2VsbFR5cGUoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MubWF0cml4RGVmYXVsdENlbGxUeXBlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCkge1xuICAgIHZhciBwcmV2Q2VsbFR5cGUgPSB0aGlzLnRlbXBsYXRlUXVlc3Rpb25cbiAgICAgID8gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmdldFR5cGUoKVxuICAgICAgOiBcIlwiO1xuICAgIHZhciBjdXJDZWxsVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgICBpZiAoY3VyQ2VsbFR5cGUgPT09IHByZXZDZWxsVHlwZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydGllcyhwcmV2Q2VsbFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTmV3UXVlc3Rpb24oY3VyQ2VsbFR5cGUpO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NPd25lciA9IHRoaXM7XG4gICAgdGhpcy5hZGRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdRdWVzdGlvbihjZWxsVHlwZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKGNlbGxUeXBlKTtcbiAgICBpZiAoIXF1ZXN0aW9uKSB7XG4gICAgICBxdWVzdGlvbiA9IDxRdWVzdGlvbj5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwidGV4dFwiKTtcbiAgICB9XG4gICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIGlmICh0aGlzLnRlbXBsYXRlUXVlc3Rpb24pIHtcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QodGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLCB0cnVlKTtcbiAgICAgIGpzb24udHlwZSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICAgIHF1ZXN0aW9uLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHF1ZXN0aW9uKTtcbiAgICAgIHF1ZXN0aW9uLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgcXVlc3Rpb24ub25TdXJ2ZXlMb2FkKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMuZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5jb2xPd25lciAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmNvbE93bmVyLm9uQ29sdW1uUHJvcGVydGllc0NoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHFEZWYgPSAoPGFueT5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKVtjdXJDZWxsVHlwZV07XG4gICAgaWYgKCFxRGVmIHx8ICFxRGVmLnByb3BlcnRpZXMpIHJldHVybiBbXTtcbiAgICByZXR1cm4gU2VyaWFsaXplci5maW5kUHJvcGVydGllcyhjdXJDZWxsVHlwZSwgcURlZi5wcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZykge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGRlbGV0ZSAoPGFueT50aGlzKVtwcm9wLm5hbWVdO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIGRlbGV0ZSAoPGFueT50aGlzKVtwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3AubmFtZSwgZmFsc2UpO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eShcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBpc1JlYWRPbmx5OiBib29sZWFuXG4gICkge1xuICAgIHZhciBkZXNjID0ge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKVtwcm9wTmFtZV07XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICg8YW55PmRlc2MpW1wic2V0XCJdID0gZnVuY3Rpb24odjogYW55KSB7XG4gICAgICAgICg8YW55PnF1ZXN0aW9uKVtwcm9wTmFtZV0gPSB2O1xuICAgICAgfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BOYW1lLCBkZXNjKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgcHJpdmF0ZSBxdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcHVibGljIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKSB7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlID0gdGhpcy5jcmVhdGVRdWVzdGlvbihjb2x1bW4sIHJvdywgZGF0YSk7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbihcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHJlcyA9IGRhdGEuY3JlYXRlUXVlc3Rpb24odGhpcy5yb3csIHRoaXMuY29sdW1uKTtcbiAgICByZXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGF0YS52YWxpZGF0ZUNlbGwocm93LCBjb2x1bW4ubmFtZSwgcm93LnZhbHVlKTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmdldFByb3BlcnRpZXMoY29sdW1uLmdldFR5cGUoKSkuZm9yRWFjaChcbiAgICAgIHByb3BlcnR5ID0+IHtcbiAgICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gICAgICAgIGlmICgoPGFueT5jb2x1bW4pW3Byb3BlcnR5TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc1twcm9wZXJ0eU5hbWVdID0gKDxhbnk+Y29sdW1uKVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdGhpcy5xdWVzdGlvbi5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnF1ZXN0aW9uLnZpc2libGVJZiB8fFxuICAgICAgISF0aGlzLnF1ZXN0aW9uLmVuYWJsZUlmIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb24ucmVxdWlyZWRJZiB8fFxuICAgICAgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwiZXhwcmVzc2lvblwiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Ub3RhbENlbGwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93bkNlbGwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBwdWJsaWMgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBwdWJsaWMgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApIHtcbiAgICBzdXBlcihjb2x1bW4sIHJvdywgZGF0YSk7XG4gICAgdGhpcy51cGRhdGVDZWxsUXVlc3Rpb24oKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb24oXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKTogUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSA8UXVlc3Rpb24+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhcImV4cHJlc3Npb25cIik7XG4gICAgcmVzLnNldFN1cnZleUltcGwocm93KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDZWxsUXVlc3Rpb24oKSB7XG4gICAgdGhpcy5xdWVzdGlvbi5sb2NDYWxjdWxhdGlvbigpO1xuICAgIHRoaXMuY29sdW1uLnVwZGF0ZUNlbGxRdWVzdGlvbih0aGlzLnF1ZXN0aW9uLCBudWxsKTtcbiAgICB0aGlzLnF1ZXN0aW9uLmV4cHJlc3Npb24gPSB0aGlzLmdldFRvdGFsRXhwcmVzc2lvbigpO1xuICAgIHRoaXMucXVlc3Rpb24uZm9ybWF0ID0gdGhpcy5jb2x1bW4udG90YWxGb3JtYXQ7XG4gICAgdGhpcy5xdWVzdGlvbi5jdXJyZW5jeSA9IHRoaXMuY29sdW1uLnRvdGFsQ3VycmVuY3k7XG4gICAgdGhpcy5xdWVzdGlvbi5kaXNwbGF5U3R5bGUgPSB0aGlzLmNvbHVtbi50b3RhbERpc3BsYXlTdHlsZTtcbiAgICB0aGlzLnF1ZXN0aW9uLm1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuY29sdW1uLnRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgIHRoaXMucXVlc3Rpb24ubWluaW11bUZyYWN0aW9uRGlnaXRzID0gdGhpcy5jb2x1bW4udG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHM7XG4gICAgdGhpcy5xdWVzdGlvbi51bmxvY0NhbGN1bGF0aW9uKCk7XG4gIH1cbiAgcHVibGljIGdldFRvdGFsRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuY29sdW1uLnRvdGFsRXhwcmVzc2lvbikgcmV0dXJuIHRoaXMuY29sdW1uLnRvdGFsRXhwcmVzc2lvbjtcbiAgICBpZiAodGhpcy5jb2x1bW4udG90YWxUeXBlID09IFwibm9uZVwiKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgZnVuTmFtZSA9IHRoaXMuY29sdW1uLnRvdGFsVHlwZSArIFwiSW5BcnJheVwiO1xuICAgIGlmICghRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLmhhc0Z1bmN0aW9uKGZ1bk5hbWUpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gZnVuTmFtZSArIFwiKHtzZWxmfSwgJ1wiICsgdGhpcy5jb2x1bW4ubmFtZSArIFwiJylcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgaW1wbGVtZW50cyBJU3VydmV5RGF0YSwgSVN1cnZleUltcGwsIElMb2NhbGl6YWJsZU93bmVyLCBJVGV4dFByb2Nlc3NvciB7XG4gIHB1YmxpYyBzdGF0aWMgUm93VmFyaWFibGVOYW1lID0gXCJyb3dcIjtcbiAgcHVibGljIHN0YXRpYyBPd25lclZhcmlhYmxlTmFtZSA9IFwic2VsZlwiO1xuICBwdWJsaWMgc3RhdGljIEluZGV4VmFyaWFibGVOYW1lID0gXCJyb3dJbmRleFwiO1xuXG4gIHByaXZhdGUgc3RhdGljIGlkQ291bnRlcjogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcm93X1wiICsgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuaWRDb3VudGVyKys7XG4gIH1cbiAgcHJvdGVjdGVkIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGE7XG4gIHByaXZhdGUgaXNTZXR0aW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcblxuICBwdWJsaWMgY2VsbHM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ2VsbD4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24oXG4gICAgICB0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZVxuICAgICkge1xuICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMuaWRWYWx1ZSA9IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmdldElkKCk7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgIGlmICghcXVlc3Rpb24uaXNFbXB0eSgpKSB7XG4gICAgICAgIHJlc3VsdFtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIGFsbFZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgdmFyIHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHsgcm93OiBhbGxWYWx1ZXMgfTtcbiAgICBmb3IgKHZhciBrZXkgaW4gYWxsVmFsdWVzKSB7XG4gICAgICB2YWx1ZXNba2V5XSA9IGFsbFZhbHVlc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSwgcm93OiB0aGlzIH07XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLk93bmVyVmFyaWFibGVOYW1lXSA9IHRoaXMuZGF0YS52YWx1ZTtcbiAgICB9XG4gICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLkluZGV4VmFyaWFibGVOYW1lXSA9IHRoaXMucm93SW5kZXg7XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSBwcm9wZXJ0aWVzID0ge307XG4gICAgcHJvcGVydGllc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWVdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWVdID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgIHZhciB2YWwgPSAhIXZhbHVlID8gdmFsdWVbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldIDogbnVsbDtcbiAgICAgIHF1ZXN0aW9uLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWwpO1xuICAgICAgcXVlc3Rpb24ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodmFsKTtcbiAgICB9XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiAoPGFueT5zdXJ2ZXkpLmdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaCwga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlc0hhc2hba2V5XTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKTtcbiAgICByZXR1cm4gISFxdWVzdGlvbiA/IHF1ZXN0aW9uLnZhbHVlIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdDb2x1bW5WYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNTZXR0aW5nVmFsdWUpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkVmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIHZhciBjaGFuZ2VkUXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICAgIHZhciBjaGFuZ2luZ1ZhbHVlID0gdGhpcy5kYXRhLm9uUm93Q2hhbmdpbmcodGhpcywgbmFtZSwgbmV3VmFsdWUpO1xuICAgIGlmIChcbiAgICAgICEhY2hhbmdlZFF1ZXN0aW9uICYmXG4gICAgICAhSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGNoYW5naW5nVmFsdWUsIGNoYW5nZWRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUobmFtZSkudmFsdWUgPSBjaGFuZ2luZ1ZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEub25Sb3dDaGFuZ2VkKFxuICAgICAgICB0aGlzLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgbmV3Q29sdW1uVmFsdWUgPT0gbnVsbCAmJiAhY2hhbmdlZFF1ZXN0aW9uXG4gICAgICApO1xuICAgICAgdGhpcy5vbkFueVZhbHVlQ2hhbmdlZChNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWUpO1xuICAgIH1cbiAgfVxuICBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgc2V0VmFyaWFibGUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7fVxuICBwdWJsaWMgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmdldFZhbHVlKG5hbWUgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4KTtcbiAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcsIGxvY05vdGlmaWNhdGlvbjogYW55KSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeCwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbFtrZXldICE9PSB1bmRlZmluZWQgJiYgdmFsW2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW4oY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IFF1ZXN0aW9uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNlbGxzW2ldLmNvbHVtbiA9PSBjb2x1bW4pIHJldHVybiB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2VsbHNbaV0uY29sdW1uLm5hbWUgPT0gY29sdW1uTmFtZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb247XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTaGFyZWRRdWVzdGlvbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhXG4gICAgICA/IHRoaXMuZGF0YS5nZXRTaGFyZWRRdWVzdGlvbkJ5TmFtZShjb2x1bW5OYW1lLCB0aGlzKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcyh2YWw6IGFueSkge1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUoa2V5KTtcbiAgICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgICB2YXIgcVZhbCA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICBxdWVzdGlvbi5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhxVmFsLCBxdWVzdGlvbi52YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgcXVlc3Rpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoa2V5KSkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNlbGxzW2ldLmhhc0NvbmRpdGlvbikgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jZWxsc1tpXS5xdWVzdGlvbi5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbFF1ZXN0aW9uT25Db2x1bW5DaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNlbGxzW2ldLmNvbHVtbiA9PT0gY29sdW1uKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2VsbE9uQ29sdW1uQ2hhbmdlZCh0aGlzLmNlbGxzW2ldKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgb25RdWVzdGlvblJlYWRPbmx5Q2hhbmdlZChwYXJlbnRJc1JlYWRPbmx5OiBib29sZWFuKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISF0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uKSB7XG4gICAgICAgIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24ucmVhZE9ubHkgPSBwYXJlbnRJc1JlYWRPbmx5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ2VsbE9uQ29sdW1uQ2hhbmdlZChjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICBjZWxsLmNvbHVtbi51cGRhdGVDZWxsUXVlc3Rpb24oY2VsbC5xdWVzdGlvbiwgdGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkQ2VsbHModmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSB0cnVlO1xuICAgIHZhciBjb2x1bW5zID0gdGhpcy5kYXRhLmNvbHVtbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29sdW1uID0gY29sdW1uc1tpXTtcbiAgICAgIGlmICghY29sdW1uLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICB2YXIgY2VsbCA9IHRoaXMuY3JlYXRlQ2VsbChjb2x1bW4pO1xuICAgICAgdGhpcy5jZWxscy5wdXNoKGNlbGwpO1xuICAgICAgaWYgKCEhdmFsdWUgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2NvbHVtbi5uYW1lXSkpIHtcbiAgICAgICAgY2VsbC5xdWVzdGlvbi52YWx1ZSA9IHZhbHVlW2NvbHVtbi5uYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDZWxsKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBNYXRyaXhEcm9wZG93bkNlbGwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25DZWxsKGNvbHVtbiwgdGhpcywgdGhpcy5kYXRhKTtcbiAgfVxuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFN1cnZleSgpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHJvd0luZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFJvd0luZGV4KHRoaXMpICsgMSA6IC0xO1xuICB9XG4gIC8vSVRleHRQcm9jZXNzb3JcbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID1cbiAgICAgIGZpcnN0TmFtZSA9PSBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWU7XG4gICAgdGV4dFZhbHVlLmNhblByb2Nlc3MgPSB0ZXh0VmFsdWUuaXNFeGlzdHM7XG4gICAgaWYgKCF0ZXh0VmFsdWUuaXNFeGlzdHMpIHJldHVybjtcbiAgICB2YXIgdmFsdWVzID0geyByb3c6IHRoaXMudmFsdWUgfTtcbiAgICB0ZXh0VmFsdWUudmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUodGV4dFZhbHVlLm5hbWUsIHZhbHVlcyk7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRleHQgPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIGlmICghdGhpcy5nZXRTdXJ2ZXkoKSkgcmV0dXJuIHRleHQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5KCkucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogYW55IHtcbiAgICB0ZXh0ID0gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIGlmICghdGhpcy5nZXRTdXJ2ZXkoKSkgcmV0dXJuIHRleHQ7XG4gICAgdmFyIGhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5oYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0U3VydmV5KCkucHJvY2Vzc1RleHRFeCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUsIGZhbHNlKTtcbiAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuID1cbiAgICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gJiYgaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blRvdGFsUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIGNvbnN0cnVjdG9yKGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEpIHtcbiAgICBzdXBlcihkYXRhLCBudWxsKTtcbiAgICB0aGlzLmJ1aWxkQ2VsbHMobnVsbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUNlbGwoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93blRvdGFsQ2VsbChjb2x1bW4sIHRoaXMsIHRoaXMuZGF0YSk7XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhLm9uVG90YWxWYWx1ZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgcHJldlZhbHVlO1xuICAgIGRvIHtcbiAgICAgIHByZXZWYWx1ZSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNvdW50ZXIrKztcbiAgICB9IHdoaWxlICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHByZXZWYWx1ZSwgdGhpcy52YWx1ZSkgJiYgY291bnRlciA8IDMpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDZWxsT25Db2x1bW5DaGFuZ2VkKGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCkge1xuICAgICg8TWF0cml4RHJvcGRvd25Ub3RhbENlbGw+Y2VsbCkudXBkYXRlQ2VsbFF1ZXN0aW9uKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xuICBwcml2YXRlIHN0YXRpYyBjb3VudGVyID0gMTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBudW1iZXI7XG4gIHB1YmxpYyBtaW5XaWR0aDogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIHdpZHRoOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgbG9jVGl0bGU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBwdWJsaWMgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsO1xuICBwdWJsaWMgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZTtcbiAgcHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgcHVibGljIGlzUmVtb3ZlUm93OiBib29sZWFuO1xuICBwdWJsaWMgbWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlO1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pZFZhbHVlID0gUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbC5jb3VudGVyKys7XG4gIH1cbiAgcHVibGljIGdldCBoYXNRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NUaXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaWRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgcHJpdmF0ZSBzdGF0aWMgY291bnRlciA9IDE7XG4gIHByaXZhdGUgaWRWYWx1ZTogbnVtYmVyO1xuICBwdWJsaWMgY2VsbHM6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGw+ID0gW107XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlkVmFsdWUgPSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cuY291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIGhlYWRlclJvd1ZhbHVlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c7XG4gIHByaXZhdGUgZm9vdGVyUm93VmFsdWU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdztcbiAgcHJpdmF0ZSBoYXNSZW1vdmVSb3dzVmFsdWU6IGJvb2xlYW47XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicm93c1wiKTtcbiAgICB0aGlzLmJ1aWxkKCk7XG4gIH1cbiAgcHVibGljIGdldCBzaG93SGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXguaGFzRm9vdGVyICYmIHRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmZvb3RlclJvdztcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1JlbW92ZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUmVtb3ZlUm93c1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBpc1JlcXVpcmVSZXNldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5oYXNSZW1vdmVSb3dzICE9IHRoaXMubWF0cml4LmNhblJlbW92ZVJvd3MgfHxcbiAgICAgICF0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVhZGVyUm93KCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyUm93VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBmb290ZXJSb3coKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgICByZXR1cm4gdGhpcy5mb290ZXJSb3dWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd3MoKTogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkKCkge1xuICAgIHRoaXMuaGFzUmVtb3ZlUm93c1ZhbHVlID0gdGhpcy5tYXRyaXguY2FuUmVtb3ZlUm93cztcbiAgICAvL2J1aWxkIHJvd3Mgbm93XG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICB0aGlzLmJ1aWxkSGVhZGVyKCk7XG4gICAgdGhpcy5idWlsZFJvd3MoKTtcbiAgICB0aGlzLmJ1aWxkRm9vdGVyKCk7XG4gIH1cbiAgcHVibGljIG9uQWRkZWRSb3coKSB7XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPj0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3MubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5yb3dzLnB1c2goXG4gICAgICB0aGlzLmNyZWF0ZUhvcml6b250YWxSb3coXG4gICAgICAgIHRoaXMubWF0cml4LnZpc2libGVSb3dzW3RoaXMubWF0cml4LnZpc2libGVSb3dzLmxlbmd0aCAtIDFdXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgb25SZW1vdmVkUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuO1xuICAgIHRoaXMucm93cy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZEhlYWRlcigpIHtcbiAgICB2YXIgY29sSGVhZGVycyA9XG4gICAgICB0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWwgJiYgdGhpcy5tYXRyaXguc2hvd0hlYWRlcjtcbiAgICB2YXIgaXNTaG93biA9XG4gICAgICBjb2xIZWFkZXJzIHx8XG4gICAgICAodGhpcy5tYXRyaXguaGFzUm93VGV4dCAmJiAhdGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIGlzU2hvd24pO1xuICAgIGlmICghaXNTaG93bikgcmV0dXJuO1xuICAgIHRoaXMuaGVhZGVyUm93VmFsdWUgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KCk7XG4gICAgaWYgKHRoaXMubWF0cml4Lmhhc1Jvd1RleHQgJiYgdGhpcy5tYXRyaXguc2hvd0hlYWRlcikge1xuICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwobnVsbCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLm1hdHJpeC52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgICAgaWYgKCFjb2x1bW4uaGFzVmlzaWJsZUNlbGwpIGNvbnRpbnVlO1xuICAgICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChjb2x1bW4pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlVGV4dENlbGwocm93c1tpXS5sb2NUZXh0KSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXRyaXguaGFzRm9vdGVyKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2goXG4gICAgICAgICAgdGhpcy5jcmVhdGVUZXh0Q2VsbCh0aGlzLm1hdHJpeC5nZXRGb290ZXJUZXh0KCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1JlbW92ZVJvd3MpIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKG51bGwpKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5zaG93Rm9vdGVyKSByZXR1cm47XG4gICAgdGhpcy5mb290ZXJSb3dWYWx1ZSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coKTtcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzUm93VGV4dCkge1xuICAgICAgdGhpcy5mb290ZXJSb3cuY2VsbHMucHVzaChcbiAgICAgICAgdGhpcy5jcmVhdGVUZXh0Q2VsbCh0aGlzLm1hdHJpeC5nZXRGb290ZXJUZXh0KCkpXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgY2VsbHMgPSB0aGlzLm1hdHJpeC52aXNpYmxlVG90YWxSb3cuY2VsbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjZWxsc1tpXS5jb2x1bW4uaGFzVmlzaWJsZUNlbGwpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5mb290ZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUVkaXRDZWxsKGNlbGxzW2ldKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1JlbW92ZVJvd3MpIHtcbiAgICAgIHRoaXMuZm9vdGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKG51bGwpKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkUm93cygpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbFxuICAgICAgPyB0aGlzLmJ1aWxkSG9yaXpvbnRhbFJvd3MoKVxuICAgICAgOiB0aGlzLmJ1aWxkVmVydGljYWxSb3dzKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCByb3dzKTtcbiAgfVxuICBwcml2YXRlIGNhblJlbW92ZVJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4LmNhblJlbW92ZVJvdyhyb3cpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRIb3Jpem9udGFsUm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xuICAgIHZhciByZW5kZXJlZFJvd3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlSG9yaXpvbnRhbFJvdyhyb3dzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJlZFJvd3M7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVIb3Jpem9udGFsUm93KFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdygpO1xuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNSb3dUZXh0KSB7XG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZVRleHRDZWxsKHJvdy5sb2NUZXh0KSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgIGlmICghY2VsbC5jb2x1bW4uaGFzVmlzaWJsZUNlbGwpIGNvbnRpbnVlO1xuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1JlbW92ZVJvd3MpIHtcbiAgICAgIHJlcy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlUmVtb3ZlUm93Q2VsbChyb3cpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGJ1aWxkVmVydGljYWxSb3dzKCk6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdz4ge1xuICAgIHZhciBjb2x1bW5zID0gdGhpcy5tYXRyaXguY29sdW1ucztcbiAgICB2YXIgcmVuZGVyZWRSb3dzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29sdW1uc1tpXS5pc1Zpc2libGUgJiYgY29sdW1uc1tpXS5oYXNWaXNpYmxlQ2VsbCkge1xuICAgICAgICByZW5kZXJlZFJvd3MucHVzaCh0aGlzLmNyZWF0ZVZlcnRpY2FsUm93KGNvbHVtbnNbaV0sIGkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzUmVtb3ZlUm93cykge1xuICAgICAgcmVuZGVyZWRSb3dzLnB1c2godGhpcy5jcmVhdGVWZXJ0aWNhbFJlbW92ZVJvdygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlcmVkUm93cztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVZlcnRpY2FsUm93KFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xuICAgIHZhciByZXMgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KCk7XG4gICAgaWYgKHRoaXMubWF0cml4LnNob3dIZWFkZXIpIHtcbiAgICAgIHJlcy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlVGV4dENlbGwoY29sdW1uLmxvY1RpdGxlKSk7XG4gICAgfVxuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUVkaXRDZWxsKHJvd3NbaV0uY2VsbHNbaW5kZXhdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNUb3RhbCkge1xuICAgICAgcmVzLmNlbGxzLnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdENlbGwodGhpcy5tYXRyaXgudmlzaWJsZVRvdGFsUm93LmNlbGxzW2luZGV4XSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVWZXJ0aWNhbFJlbW92ZVJvdygpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xuICAgIHZhciByZXMgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KCk7XG4gICAgaWYgKHRoaXMubWF0cml4LnNob3dIZWFkZXIpIHtcbiAgICAgIHJlcy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlVGV4dENlbGwobnVsbCkpO1xuICAgIH1cbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVSZW1vdmVSb3dDZWxsKHJvd3NbaV0pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0cml4Lmhhc1RvdGFsKSB7XG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZVRleHRDZWxsKG51bGwpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUVkaXRDZWxsKFxuICAgIGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbFxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcbiAgICByZXMuY2VsbCA9IGNlbGw7XG4gICAgcmVzLnJvdyA9IGNlbGwucm93O1xuICAgIHJlcy5xdWVzdGlvbiA9IGNlbGwucXVlc3Rpb247XG4gICAgcmVzLm1hdHJpeCA9IHRoaXMubWF0cml4O1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVIZWFkZXJDZWxsKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKCEhY29sdW1uID8gY29sdW1uLmxvY1RpdGxlIDogbnVsbCk7XG4gICAgY2VsbC5taW5XaWR0aCA9IGNvbHVtbiAhPSBudWxsID8gdGhpcy5tYXRyaXguZ2V0Q29sdW1uV2lkdGgoY29sdW1uKSA6IFwiXCI7XG4gICAgY2VsbC53aWR0aCA9IGNvbHVtbiAhPSBudWxsID8gY29sdW1uLndpZHRoIDogXCJcIjtcbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVJlbW92ZVJvd0NlbGwoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcbiAgICByZXMucm93ID0gcm93O1xuICAgIHJlcy5pc1JlbW92ZVJvdyA9IHRoaXMuY2FuUmVtb3ZlUm93KHJvdyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVRleHRDZWxsKFxuICAgIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZ1xuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICB2YXIgY2VsbCA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XG4gICAgY2VsbC5sb2NUaXRsZSA9ICEhbG9jVGl0bGVcbiAgICAgID8gbG9jVGl0bGVcbiAgICAgIDogbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMubWF0cml4LCBmYWxzZSk7XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIG1hdHJpeCBkcm9wZG93biBhbmQgbWF0cml4IGR5bmFtaWMgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPFxuICAgIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gID5cbiAgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdENlbGxUeXBlKCkge1xuICAgIHJldHVybiBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgZGVmYXVsdENlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MubWF0cml4RGVmYXVsdENlbGxUeXBlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgYWRkRGVmYXVsdENvbHVtbnMobWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgdmFyIGNvbE5hbWVzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xOYW1lcy5sZW5ndGg7IGkrKykgbWF0cml4LmFkZENvbHVtbihjb2xOYW1lc1tpXSk7XG4gIH1cbiAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByaXZhdGUgcmVuZGVyZWRUYWJsZVZhbHVlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZTtcbiAgcHJvdGVjdGVkIGlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgY29sdW1uc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdXBkYXRlQ2VsbHNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29sdW1uTGF5b3V0Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBvblJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBvblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2s6IChcbiAgICB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGVcbiAgKSA9PiB2b2lkO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJjb2x1bW5zXCIsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGl0ZW0uY29sT3duZXIgPSB0aGlzO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb2x1bW5zXCIsIGZ1bmN0aW9uKFxuICAgICAgbmV3Q29sdW1uczogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLnVwZGF0ZUNvbHVtbnNJbmRleGVzKG5ld0NvbHVtbnMpO1xuICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICBzZWxmLmdlbmVyYXRlZFRvdGFsUm93ID0gbnVsbDtcbiAgICAgIHNlbGYucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImNvbHVtbkxheW91dFwiLCBcImFkZFJvd0xvY2F0aW9uXCJdLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sdW1uTGF5b3V0Q2hhbmdlZENhbGxiYWNrKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImNlbGxUeXBlXCIsIFwib3B0aW9uc0NhcHRpb25cIiwgXCJjb2x1bW5Db2xDb3VudFwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgICAgc2VsZi5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2x1bW5zQ2hhbmdlZENhbGxiYWNrKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcbiAgICAgICAgXCJjb2x1bW5MYXlvdXRcIixcbiAgICAgICAgXCJzaG93SGVhZGVyXCIsXG4gICAgICAgIFwibWluUm93Q291bnRcIixcbiAgICAgICAgXCJpc1JlYWRPbmx5XCIsXG4gICAgICAgIFwicm93Q291bnRcIixcbiAgICAgICAgXCJoYXNGb290ZXJcIlxuICAgICAgXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUm93c0R5bmFtaWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgY29sdW1uTGF5b3V0IHRvICd2ZXJ0aWNhbCcgdG8gcGxhY2UgY29sdW1ucyB2ZXJ0aWNhbGx5IGFuZCByb3dzIGhvcml6b250YWxseS4gSXQgbWFrZXMgc2Vuc2Ugd2hlbiB3ZSBoYXZlIG1hbnkgY29sdW1ucyBhbmQgZmV3IHJvd3MuXG4gICAqIEBzZWUgY29sdW1uc1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkxheW91dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5MYXlvdXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5MYXlvdXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5MYXlvdXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgY29sdW1uc0xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uTGF5b3V0O1xuICB9XG4gIHNldCBjb2x1bW5zTG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbHVtbkxheW91dCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGNvbHVtbnMgYXJlIGxvY2F0ZWQgaG9yaXpvbnRhbGx5XG4gICAqIEBzZWUgY29sdW1uTGF5b3V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQgIT0gXCJ2ZXJ0aWNhbFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzUm93VGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0Rm9vdGVyVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBjYW5SZW1vdmVSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgY2FuUmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIHN1cGVyLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGxvY2tSZXNldFJlbmRlcmVkVGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9uU3RhcnRSb3dBZGRpbmdSZW1vdmluZygpIHtcbiAgICB0aGlzLmxvY2tSZXNldFJlbmRlcmVkVGFibGUgPSB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvbkVuZFJvd0FkZGluZygpIHtcbiAgICB0aGlzLmxvY2tSZXNldFJlbmRlcmVkVGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMucmVuZGVyZWRUYWJsZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkVGFibGUuaXNSZXF1aXJlUmVzZXQoKSkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLm9uQWRkZWRSb3coKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uRW5kUm93UmVtb3ZpbmcoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubG9ja1Jlc2V0UmVuZGVyZWRUYWJsZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkVGFibGUuaXNSZXF1aXJlUmVzZXQoKSkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLm9uUmVtb3ZlZFJvdyhpbmRleCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCByZXNldFJlbmRlcmVkVGFibGUoKSB7XG4gICAgaWYgKHRoaXMubG9ja1Jlc2V0UmVuZGVyZWRUYWJsZSB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5yZW5kZXJlZFRhYmxlVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMub25SZW5kZXJlZFRhYmxlUmVzZXRDYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZFRhYmxlKCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZWRUYWJsZVZhbHVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkVGFibGVWYWx1ZSA9IHRoaXMuY3JlYXRlUmVuZGVyZWRUYWJsZSgpO1xuICAgICAgaWYgKCEhdGhpcy5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2sodGhpcy5yZW5kZXJlZFRhYmxlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFRhYmxlVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlbmRlcmVkVGFibGUoKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93VmFsdWU6IHJvdy52YWx1ZSxcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uOiA8YW55Pm51bGwsXG4gICAgICBjb2x1bW5OYW1lOiA8YW55Pm51bGwsXG4gICAgICBjZWxsOiA8YW55Pm51bGwsXG4gICAgICBjZWxsUXVlc3Rpb246IDxhbnk+bnVsbCxcbiAgICAgIHZhbHVlOiA8YW55Pm51bGxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgb3B0aW9ucy5jb2x1bW4gPSB0aGlzLnZpc2libGVDb2x1bW5zW2ldO1xuICAgICAgb3B0aW9ucy5jb2x1bW5OYW1lID0gb3B0aW9ucy5jb2x1bW4ubmFtZTtcbiAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2ldO1xuICAgICAgb3B0aW9ucy5jZWxsID0gY2VsbDtcbiAgICAgIG9wdGlvbnMuY2VsbFF1ZXN0aW9uID0gY2VsbC5xdWVzdGlvbjtcbiAgICAgIG9wdGlvbnMudmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbENyZWF0ZWQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY2VsbCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBjZWxsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGUpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGhpcy5jZWxsVHlwZSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0NlbGxUeXBlKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy51cGRhdGVDZWxsc0NhbGxiYWNrKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnNDZWxsVHlwZSgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2x1bW5zW2ldLmRlZmF1bHRDZWxsVHlwZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zSW5kZXhlcyhjb2xzOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbHNbaV0uc2V0SW5kZXgoaSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjb2x1bW4gY291bnQgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94ICBjZWxsIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5Db2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5Db2xDb3VudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbkNvbENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIHZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG1pbWltdW0gY29sdW1uIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5NaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbk1pbldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uTWluV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBob3Jpem9udGFsIHNjcm9sbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBob3Jpem9udGFsU2Nyb2xsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhvcml6b250YWxTY3JvbGxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0IDogXCJcIjtcbiAgfVxuICBvbkNvbHVtblByb3BlcnRpZXNDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pIHtcbiAgICB0aGlzLnVwZGF0ZUhhc0Zvb3RlcigpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS51cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkNoYW5nZWQoY29sdW1uKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdy51cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkNoYW5nZWQoY29sdW1uKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBoYXNGb290ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc0Zvb3RlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUhhc0Zvb3RlcigpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoYXNGb290ZXJcIiwgdGhpcy5oYXNUb3RhbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb3RhbCgpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uc1tpXS5oYXNUb3RhbCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXRDZWxsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxUeXBlO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgdmFyIGNvbHVtbk5hbWUgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAocGF0aFtpXSA9PSBcIi5cIikgYnJlYWs7XG4gICAgICBjb2x1bW5OYW1lID0gcGF0aFtpXSArIGNvbHVtbk5hbWU7XG4gICAgfVxuICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICBpZiAoIWNvbHVtbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHF1ZXN0aW9uID0gY29sdW1uLmNyZWF0ZUNlbGxRdWVzdGlvbihudWxsKTtcbiAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcXVlc3Rpb24uZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcik7XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJvd3NbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXModGhpcy5nZXRSb3dWYWx1ZShpKSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGlmICghIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICByb3cuY2VsbHNbal0ucXVlc3Rpb24uY2xlYXJFcnJvcnMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIHByZXZUb3RhbFZhbHVlO1xuICAgIGRvIHtcbiAgICAgIHByZXZUb3RhbFZhbHVlID0gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnRvdGFsVmFsdWUpO1xuICAgICAgdGhpcy5ydW5DZWxsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgdGhpcy5ydW5Ub3RhbHNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGNvdW50ZXIrKztcbiAgICB9IHdoaWxlIChcbiAgICAgICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMocHJldlRvdGFsVmFsdWUsIHRoaXMudG90YWxWYWx1ZSkgJiZcbiAgICAgIGNvdW50ZXIgPCAzXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2hvdWxkUnVuQ29sdW1uRXhwcmVzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkNlbGxzQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzIHx8ICF0aGlzLmhhc0NlbGxzQ29uZGl0aW9uKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlcyA9IHRoaXMuZ2V0Um93Q29uZGl0aW9uVmFsdWVzKHZhbHVlcyk7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5ydW5Db25kaXRpb24obmV3VmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgdGhpcy5jaGVja0NvbHVtbnNWaXNpYmlsaXR5KCk7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja0NvbHVtbnNWaXNpYmlsaXR5KCkge1xuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMudmlzaWJsZUNvbHVtbnNbaV0udmlzaWJsZUlmKSBjb250aW51ZTtcbiAgICAgIGhhc0NoYW5nZWQgPVxuICAgICAgICB0aGlzLmlzQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWQodGhpcy52aXNpYmxlQ29sdW1uc1tpXSkgfHwgaGFzQ2hhbmdlZDtcbiAgICB9XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgdmFyIGN1clZpcyA9IGNvbHVtbi5oYXNWaXNpYmxlQ2VsbDtcbiAgICB2YXIgaGFzVmlzQ2VsbCA9IGZhbHNlO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxsID0gcm93c1tpXS5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgaWYgKCEhY2VsbCAmJiAhIWNlbGwucXVlc3Rpb24gJiYgY2VsbC5xdWVzdGlvbi5pc1Zpc2libGUpIHtcbiAgICAgICAgaGFzVmlzQ2VsbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VyVmlzICE9IGhhc1Zpc0NlbGwpIHtcbiAgICAgIGNvbHVtbi5oYXNWaXNpYmxlQ2VsbCA9IGhhc1Zpc0NlbGw7XG4gICAgfVxuICAgIHJldHVybiBjdXJWaXMgIT0gaGFzVmlzQ2VsbDtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuVG90YWxzQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFRvdGFsUm93KSByZXR1cm47XG4gICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdy5ydW5Db25kaXRpb24oXG4gICAgICB0aGlzLmdldFJvd0NvbmRpdGlvblZhbHVlcyh2YWx1ZXMpLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSb3dDb25kaXRpb25WYWx1ZXModmFsdWVzOiBIYXNoVGFibGU8YW55Pik6IEhhc2hUYWJsZTxhbnk+IHtcbiAgICB2YXIgbmV3VmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAodmFsdWVzICYmIHZhbHVlcyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgbmV3VmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZXMpKTtcbiAgICB9XG4gICAgdmFyIHRvdGFsUm93ID0ge307XG4gICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLnRvdGFsVmFsdWUpKSB7XG4gICAgICB0b3RhbFJvdyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy50b3RhbFZhbHVlKSk7XG4gICAgfVxuICAgIG5ld1ZhbHVlc1tcInJvd1wiXSA9IHt9O1xuICAgIG5ld1ZhbHVlc1tcInRvdGFsUm93XCJdID0gdG90YWxSb3c7XG4gICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgfVxuICBwcml2YXRlIGdldCBoYXNDZWxsc0NvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93c1tpXS5oYXNDb25kaXRpb24pIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIHZhciBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29sdW1uc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJvd3NbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29sdW1uIGJ5IGl0J3MgbmFtZS4gUmV0dW5zIG51bGwgaWYgYSBjb2x1bW4gd2l0aCB0aGlzIG5hbWUgZG9lc24ndCBleGlzdC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnNbaV0ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jb2x1bW5zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbldpZHRoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4ubWluV2lkdGggPyBjb2x1bW4ubWluV2lkdGggOiB0aGlzLmNvbHVtbk1pbldpZHRoO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjaG9pY2VzIGZvciBkcm9wZG93biwgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgY2VsbCB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzKHZhbDogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgb3B0aW9ucyBjYXB0aW9uIGZvciBkcm9wZG93biBjZWxsIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3B0aW9uc0NhcHRpb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY09wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGFkZENvbHVtbihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTWF0cml4RHJvcGRvd25Db2x1bW4ge1xuICAgIHZhciBjb2x1bW4gPSBuZXcgTWF0cml4RHJvcGRvd25Db2x1bW4obmFtZSwgdGl0bGUpO1xuICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+IHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gdGhpcy5nZW5lcmF0ZVJvd3MoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuZm9yRWFjaChyb3cgPT4gdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KSk7XG4gICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbih0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZU9uUm93c0dlbmVyYXRpb24ocm93czogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+KSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSh0cnVlKTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWUoaSk7XG4gICAgICB2YXIgclZhbHVlID0gcm93LnZhbHVlO1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhyb3dWYWx1ZSwgclZhbHVlKSkgY29udGludWU7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuZ2V0TmV3VmFsdWVPblJvd0NoYW5nZWQocm93LCBcIlwiLCByVmFsdWUsIGZhbHNlLCBuZXdWYWx1ZSlcbiAgICAgICAgLnZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgdG90YWxWYWx1ZSgpOiBhbnkge1xuICAgIGlmICghdGhpcy5oYXNUb3RhbCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB0aGlzLnZpc2libGVUb3RhbFJvdy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuaGFzVG90YWwpIHtcbiAgICAgIGlmICghdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gdGhpcy5nZW5lcmF0ZVRvdGFsUm93KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsgc3VydmV5OiB0aGlzLnN1cnZleSB9O1xuICAgICAgICAgIHRoaXMucnVuVG90YWxzQ29uZGl0aW9uKHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFRvdGFsUm93O1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlVG90YWxSb3coKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0luZGV4ZXModGhpcy5jb2x1bW5zKTtcbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZUhhc0Zvb3RlcigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgdmFsdWUuIElmIHRoZSByb3cgdmFsdWUgaXMgZW1wdHksIHRoZSBvYmplY3QgaXMgZW1wdHk6IHt9LlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93VmFsdWUocm93SW5kZXg6IG51bWJlcikge1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRSb3dWYWx1ZUNvcmUodmlzUm93c1tyb3dJbmRleF0sIG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSByb3cgdmFsdWUuXG4gICAqIEBwYXJhbSByb3dJbmRleCByb3cgaW5kZXggZnJvbSAwIHRvIHZpc2libGUgcm93IGNvdW50IC0gMS5cbiAgICogQHBhcmFtIHJvd1ZhbHVlIGFuIG9iamVjdCB7XCJjb2x1bW4gbmFtZVwiOiBjb2x1bW5WYWx1ZSwuLi4gfVxuICAgKi9cbiAgcHVibGljIHNldFJvd1ZhbHVlKHJvd0luZGV4OiBudW1iZXIsIHJvd1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHRoaXMub25Sb3dDaGFuZ2VkKHZpc1Jvd3Nbcm93SW5kZXhdLCBcIlwiLCByb3dWYWx1ZSwgZmFsc2UpO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlVG90YWxSb3coKTogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Ub3RhbFJvd01vZGVsKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdWYWx1ZShudWxsT25FbXB0eTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcbiAgICB2YXIgcmVzID0gIXRoaXMudmFsdWUgPyB7fSA6IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKG51bGxPbkVtcHR5ICYmIHRoaXMuaXNNYXRyaXhWYWx1ZUVtcHR5KHJlcykpIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlQ29yZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHF1ZXN0aW9uVmFsdWU6IGFueSxcbiAgICBjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBhbnkge1xuICAgIHZhciByZXN1bHQgPVxuICAgICAgISFxdWVzdGlvblZhbHVlICYmICEhcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV1cbiAgICAgICAgPyBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKCFyZXN1bHQgJiYgY3JlYXRlKSB7XG4gICAgICByZXN1bHQgPSB7fTtcbiAgICAgIGlmICghIXF1ZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Um93RGlzcGxheVZhbHVlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIGlmICghcm93VmFsdWUpIHJldHVybiByb3dWYWx1ZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShrZXkpO1xuICAgICAgaWYgKCFxdWVzdGlvbikge1xuICAgICAgICBxdWVzdGlvbiA9IHRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoa2V5LCByb3cpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgcm93VmFsdWVba2V5XSA9IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlXG4gICAgfVxuICApIHtcbiAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSBzdXBlci5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgaWYgKCEhcXVlc3Rpb25QbGFpbkRhdGEpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gdGhpcy52aXNpYmxlUm93cy5tYXAoXG4gICAgICAgIChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSA9PiB7XG4gICAgICAgICAgdmFyIHJvd0RhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgICBuYW1lOiByb3cucm93TmFtZSxcbiAgICAgICAgICAgIHRpdGxlOiByb3cucm93TmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiByb3cudmFsdWUsXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuZ2V0Um93RGlzcGxheVZhbHVlKHJvdywgcm93LnZhbHVlKSxcbiAgICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICAgIGlzTm9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJvdy5jZWxsc1xuICAgICAgICAgICAgICAubWFwKChjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpID0+XG4gICAgICAgICAgICAgICAgY2VsbC5xdWVzdGlvbi5nZXRQbGFpbkRhdGEob3B0aW9ucylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+ICEhZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaChjYWxjdWxhdGlvbiA9PiB7XG4gICAgICAgICAgICByb3dEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gKDxhbnk+cm93KVtcbiAgICAgICAgICAgICAgY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByb3dEYXRhSXRlbTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVmb3JlVmFsdWVDaGFuZ2VkKHZhbDogYW55KSB7fVxuICBwcml2YXRlIG9uU2V0UXVlc3Rpb25WYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgdGhpcy5vbkJlZm9yZVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIHZhbCk7XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgdGhpcy5vblNldFF1ZXN0aW9uVmFsdWUoKTtcbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChcbiAgICAgICAgICBxdWVzdGlvbiAmJlxuICAgICAgICAgICghcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB8fCAhcXVlc3Rpb24udmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb250YWluc0Vycm9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuZ2V0Q29udGFpbnNFcnJvcnMoKSB8fFxuICAgICAgdGhpcy5jaGVja0ZvckFuc3dlcnNPckVycm9ycyhcbiAgICAgICAgKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gcXVlc3Rpb24uY29udGFpbnNFcnJvcnMsXG4gICAgICAgIGZhbHNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNBbnN3ZXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpICYmXG4gICAgICB0aGlzLmNoZWNrRm9yQW5zd2Vyc09yRXJyb3JzKFxuICAgICAgICAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBxdWVzdGlvbi5pc0Fuc3dlcmVkLFxuICAgICAgICB0cnVlXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrRm9yQW5zd2Vyc09yRXJyb3JzKFxuICAgIHByZWRpY2F0ZTogKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gYm9vbGVhbixcbiAgICBldmVyeTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XG4gICAgICBpZiAoIWNlbGxzKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFjZWxsc1tjb2xJbmRleF0pIGNvbnRpbnVlO1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1Zpc2libGUpXG4gICAgICAgICAgaWYgKHByZWRpY2F0ZShxdWVzdGlvbikpIHtcbiAgICAgICAgICAgIGlmICghZXZlcnkpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXZlcnkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVyeSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvc0luQ29sdW1ucyA9IHRoaXMuaGFzRXJyb3JJbkNvbHVtbnMoZmlyZUNhbGxiYWNrKTtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJbkNvbHVtbnM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cGVyLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGlmICghY2VsbHNbY29sSW5kZXhdKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICBpZiAoISFxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1J1bm5pbmdWYWxpZGF0b3JzKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICB2YXIgcmVzdWx0ID0gc3VwZXIuZ2V0QWxsRXJyb3JzKCk7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuXG4gICAgaWYgKHJvd3MgPT09IG51bGwpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJbkNvbHVtbnMoZmlyZUNhbGxiYWNrOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKCFxdWVzdGlvbiB8fCAhcXVlc3Rpb24udmlzaWJsZSkgY29udGludWU7XG4gICAgICAgIHF1ZXN0aW9uLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gKGhhc0Vycm9yczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHRoaXMucmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgICB9O1xuICAgICAgICByZXMgPSBxdWVzdGlvbi5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKGZhbHNlKTtcbiAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKHRydWUpO1xuICAgIHJldHVybiBxdWVzdGlvbiA/IHF1ZXN0aW9uLmlucHV0SWQgOiBzdXBlci5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RDZWxsUXVlc3Rpb24ob25FcnJvcjogYm9vbGVhbik6IFF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFvbkVycm9yKSByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICBpZiAoY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uLmN1cnJlbnRFcnJvckNvdW50ID4gMClcbiAgICAgICAgICByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25SZWFkT25seUNoYW5nZWQoKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnZpc2libGVSb3dzW2ldLm9uUXVlc3Rpb25SZWFkT25seUNoYW5nZWQodGhpcy5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cblxuICAvL0lNYXRyaXhEcm9wZG93bkRhdGFcbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlc3Rpb25Db3JlKHJvdywgY29sdW1uKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb25Db3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gY29sdW1uLmNyZWF0ZUNlbGxRdWVzdGlvbihyb3cpO1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICB9XG4gICAgcXVlc3Rpb24uc2V0U3VydmV5SW1wbChyb3cpO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZGVsZXRlUm93VmFsdWUoXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gICk6IGFueSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIGRlbGV0ZSBuZXdWYWx1ZVtyb3cucm93TmFtZV07XG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3QobmV3VmFsdWUpICYmIE9iamVjdC5rZXlzKG5ld1ZhbHVlKS5sZW5ndGggPT0gMFxuICAgICAgPyBudWxsXG4gICAgICA6IG5ld1ZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgIHRoaXMuaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkIHx8XG4gICAgICAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgdmFyIHRvdGFsUm93ID0gdGhpcy52aXNpYmxlVG90YWxSb3c7XG4gICAgaWYgKCEhdG90YWxSb3cpIHtcbiAgICAgIHRvdGFsUm93Lm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBpc09iamVjdCh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbiAgfVxuICBwcml2YXRlIGdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZ2V0UXVlc3Rpb24gPSBmdW5jdGlvbihjb2xOYW1lOiBhbnkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBzZWxmLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuY29sdW1uc1tpXS5uYW1lID09PSBjb2xOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcm93OiByb3csXG4gICAgICBjb2x1bW5OYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgcm93VmFsdWU6IHJvd1ZhbHVlLFxuICAgICAgdmFsdWU6ICEhcm93VmFsdWUgPyByb3dWYWx1ZVtjb2x1bW5OYW1lXSA6IG51bGwsXG4gICAgICBnZXRDZWxsUXVlc3Rpb246IGdldFF1ZXN0aW9uXG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DZWxsVmFsdWVDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGdldFF1ZXN0aW9uID0gZnVuY3Rpb24oY29sTmFtZTogYW55KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgc2VsZi5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLmNvbHVtbnNbaV0ubmFtZSA9PT0gY29sTmFtZSkge1xuICAgICAgICAgIHJldHVybiByb3cuY2VsbHNbaV0ucXVlc3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICByb3dWYWx1ZTogcm93VmFsdWUsXG4gICAgICB2YWx1ZTogcm93VmFsdWVbY29sdW1uTmFtZV0sXG4gICAgICBnZXRDZWxsUXVlc3Rpb246IGdldFF1ZXN0aW9uXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbFZhbGlkYXRlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG9uUm93Q2hhbmdpbmcoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiAhIXJvd1ZhbHVlID8gcm93VmFsdWVbY29sdW1uTmFtZV0gOiBudWxsO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIHZhciBvbGRSb3dWYWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWVDb3JlKHJvdywgdGhpcy5jcmVhdGVOZXdWYWx1ZSgpLCB0cnVlKTtcbiAgICBvcHRpb25zLm9sZFZhbHVlID0gISFvbGRSb3dWYWx1ZSA/IG9sZFJvd1ZhbHVlW2NvbHVtbk5hbWVdIDogbnVsbDtcbiAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsdWVDaGFuZ2luZyh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy52YWx1ZTtcbiAgfVxuICBvblJvd0NoYW5nZWQoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgbmV3Um93VmFsdWU6IGFueSxcbiAgICBpc0RlbGV0aW5nVmFsdWU6IGJvb2xlYW5cbiAgKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSh0cnVlKTtcbiAgICB2YXIgY29tYmluZSA9IHRoaXMuZ2V0TmV3VmFsdWVPblJvd0NoYW5nZWQoXG4gICAgICByb3csXG4gICAgICBjb2x1bW5OYW1lLFxuICAgICAgbmV3Um93VmFsdWUsXG4gICAgICBpc0RlbGV0aW5nVmFsdWUsXG4gICAgICB0aGlzLmNyZWF0ZU5ld1ZhbHVlKClcbiAgICApO1xuICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIGNvbWJpbmUudmFsdWUpKSByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKGNvbWJpbmUudmFsdWUpO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICB0aGlzLm9uQ2VsbFZhbHVlQ2hhbmdlZChyb3csIGNvbHVtbk5hbWUsIGNvbWJpbmUucm93VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldE5ld1ZhbHVlT25Sb3dDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIG5ld1Jvd1ZhbHVlOiBhbnksXG4gICAgaXNEZWxldGluZ1ZhbHVlOiBib29sZWFuLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKTogYW55IHtcbiAgICB2YXIgcm93VmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICBpZiAoaXNEZWxldGluZ1ZhbHVlKSB7XG4gICAgICBkZWxldGUgcm93VmFsdWVbY29sdW1uTmFtZV07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcm93LmNlbGxzW2ldLnF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpO1xuICAgICAgZGVsZXRlIHJvd1ZhbHVlW2tleV07XG4gICAgfVxuICAgIGlmIChuZXdSb3dWYWx1ZSkge1xuICAgICAgbmV3Um93VmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5ld1Jvd1ZhbHVlKSk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gbmV3Um93VmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eShuZXdSb3dWYWx1ZVtrZXldKSkge1xuICAgICAgICAgIHJvd1ZhbHVlW2tleV0gPSBuZXdSb3dWYWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzT2JqZWN0KHJvd1ZhbHVlKSAmJiBPYmplY3Qua2V5cyhyb3dWYWx1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuZGVsZXRlUm93VmFsdWUobmV3VmFsdWUsIHJvdyk7XG4gICAgfVxuICAgIHJldHVybiB7IHZhbHVlOiBuZXdWYWx1ZSwgcm93VmFsdWU6IHJvd1ZhbHVlIH07XG4gIH1cbiAgZ2V0Um93SW5kZXgocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpO1xuICB9XG4gIGdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gICk6IFF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRSb3dJbmRleChyb3cpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiA8UXVlc3Rpb24+KFxuICAgICAgdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICAgICAgdGhpcy52YWx1ZU5hbWUsXG4gICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgIGluZGV4XG4gICAgICApXG4gICAgKTtcbiAgfVxuICBvblRvdGFsVmFsdWVDaGFuZ2VkKCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy52aXNpYmxlVG90YWxSb3cpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5nZXRWYWx1ZU5hbWUoKSArIHNldHRpbmdzLm1hdHJpeFRvdGFsVmFsdWVQb3N0Rml4LFxuICAgICAgICB0aGlzLnRvdGFsVmFsdWUsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogSVF1ZXN0aW9uIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy52aXNpYmxlUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzW2luZGV4XS5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIGlzTWF0cml4VmFsdWVFbXB0eSh2YWw6IGFueSkge1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPYmplY3QodmFsW2ldKSAmJiBPYmplY3Qua2V5cyh2YWxbaV0pLmxlbmd0aCA+IDApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCA9PSAwO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiLFxuICBbXG4gICAgXCIhbmFtZVwiLFxuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2VsbFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICB2YXIgcmVzID0gTWF0cml4RHJvcGRvd25Db2x1bW4uZ2V0Q29sdW1uVHlwZXMoKTtcbiAgICAgICAgcmVzLnNwbGljZSgwLCAwLCBcImRlZmF1bHRcIik7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29sQ291bnRcIiwgZGVmYXVsdDogLTEsIGNob2ljZXM6IFstMSwgMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCJcbiAgICB9LFxuICAgIFwiaGFzT3RoZXI6Ym9vbGVhblwiLFxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxuICAgIFwibWluV2lkdGhcIixcbiAgICBcIndpZHRoXCIsXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcInJlcXVpcmVkSWY6Y29uZGl0aW9uXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRvdGFsVHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwic3VtXCIsIFwiY291bnRcIiwgXCJtaW5cIiwgXCJtYXhcIiwgXCJhdmdcIl1cbiAgICB9LFxuICAgIFwidG90YWxFeHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICB7IG5hbWU6IFwidG90YWxGb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RvdGFsRm9ybWF0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRvdGFsRGlzcGxheVN0eWxlXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRvdGFsQ3VycmVuY3lcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlY3lDb2RlcygpO1xuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IFwiVVNEXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwidG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93bkNvbHVtbihcIlwiKTtcbiAgfVxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93bmJhc2VcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uczptYXRyaXhkcm9wZG93bmNvbHVtbnNcIixcbiAgICAgIGNsYXNzTmFtZTogXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbkxheW91dFwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcImNvbHVtbnNMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJob3Jpem9udGFsXCIsXG4gICAgICBjaG9pY2VzOiBbXCJob3Jpem9udGFsXCIsIFwidmVydGljYWxcIl1cbiAgICB9LFxuICAgIFwiaG9yaXpvbnRhbFNjcm9sbDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZVtdXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJvcHRpb25zQ2FwdGlvblwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3B0aW9uc0NhcHRpb25cIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2VsbFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZHJvcGRvd25cIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdHJpeERyb3Bkb3duQ29sdW1uLmdldENvbHVtblR5cGVzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29sdW1uQ29sQ291bnRcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDMsIDRdIH0sXG4gICAgXCJjb2x1bW5NaW5XaWR0aFwiXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZShcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xuZXhwb3J0IGNsYXNzIFN0eWxlc01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBTdXJ2ZXlKU1N0eWxlc1NoZWV0SWQgPSBcInN1cnZleWpzXCI7XG5cbiAgcHVibGljIHN0YXRpYyBTdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2Nzc1wiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDI3NXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1wiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X2NvbnRhaW5lclwiOlxuICAgIC8vICAgXCJtYXgtd2lkdGg6IDgwJTsgbWFyZ2luOiBhdXRvOyBwb3NpdGlvbjogcmVsYXRpdmU7IGNvbG9yOiAjNmQ3MDcyOyBwYWRkaW5nOiAwIDFlbTtcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5wYW5lbC1ib2R5XCI6XG4gICAgLy8gICBcImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxZW0gMWVtIDVlbSAxZW07IGJvcmRlci10b3A6IDJweCBzb2xpZCBsaWdodGdyYXk7XCIsXG5cbiAgICBcIi5zdl9tYWluIHNwYW5cIjogXCJ3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiBsZWdlbmRcIjogXCJib3JkZXI6IG5vbmU7IG1hcmdpbjogMDtcIixcblxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG5cIjogXCJwYWRkaW5nOiAwLjVlbSAxZW0gMS41ZW0gMWVtO1wiLFxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FjYmMgaW5wdXRbdHlwZT1jaGVja2JveF0sIC5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9cmFkaW9dXCI6XG4gICAgICBcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1hcmdpbi10b3A6IC0xcHhcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuIGZpZWxkc2V0XCI6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biAgLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lciBcIjpcbiAgICAgIFwicG9zaXRpb246IHJlbGF0aXZlOyBtYXJnaW4tcmlnaHQ6IDI1MHB4OyBtYXJnaW4tbGVmdDogNDBweDsgbWFyZ2luLXRvcDogMTBweDtcIixcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9xX3JhZGlvZ3JvdXBfY29udHJvbF9sYWJlbFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmU7IHBvc2l0aW9uOiBzdGF0aWM7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94XCI6XG4gICAgICBcIm1hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7XCIsXG5cbiAgICBcIi5zdl9yb3dcIjogXCJjbGVhcjogYm90aDtcIixcbiAgICBcIi5zdl9yb3cgLnN2X3FzdG5cIjogXCJmbG9hdDogbGVmdFwiLFxuICAgIFwiLnN2X3JvdyAuc3ZfcXN0bjpsYXN0LWNoaWxkXCI6IFwiZmxvYXQ6IG5vbmVcIixcbiAgICBcIi5zdl9xc3RuXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBvdmVyZmxvdzogYXV0bztcIixcbiAgICBcIi5wcm9ncmVzc1wiOiBcIndpZHRoOiA2MCU7XCIsXG4gICAgXCIucHJvZ3Jlc3MtYmFyXCI6IFwid2lkdGg6IGF1dG87IG1hcmdpbi1sZWZ0OiAycHg7IG1hcmdpbi1yaWdodDogMnB4O1wiLFxuICAgIFwiLnN2X3BfY29udGFpbmVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wO1wiLFxuICAgIFwiLnN2X3FibG4gLmNoZWNrYm94LW1hdGVyaWFsXCI6IFwibWFyZ2luLXJpZ2h0OiAzcHg7XCIsXG4gICAgXCIuc3ZfcWNieCAuY2hlY2tib3gtbWF0ZXJpYWxcIjogXCJtYXJnaW4tcmlnaHQ6IDVweDtcIixcbiAgICBcIi5zdl9xY2J4IC5jaGVja2JveCBsYWJlbFwiOiBcImp1c3RpZnktY29udGVudDogbGVmdDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gLnJhZGlvIGxhYmVsXCI6IFwianVzdGlmeS1jb250ZW50OiBsZWZ0OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9pbWdzZWwgPiBsYWJlbCBpbWdcIjogXCJwb2ludGVyLWV2ZW50czogbm9uZTtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IG1hcmdpbjogMDsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlO1wiLFxuICAgIFwiLnN2X3FzdG4gdGRcIjogXCJwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgXCIuc3ZfcV9tdF9pdGVtX3ZhbHVlXCI6IFwiZmxvYXQ6IGxlZnQ7XCIsXG4gICAgXCJbZGlyPVxcXCJydGxcXFwiXSAuc3ZfcV9tdF9pdGVtX3ZhbHVlXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiLnN2X3FzdG4uc3ZfcXN0bl9sZWZ0XCI6IFwibWFyZ2luLXRvcDogMC43NWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gLnRpdGxlLWxlZnRcIjogXCJmbG9hdDogbGVmdDsgbWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCJbZGlyPVxcXCJydGxcXFwiXSAuc3ZfcXN0biAudGl0bGUtbGVmdFwiOiBcImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDFlbTtcIixcbiAgICBcIi5zdl9xc3RuIC5jb250ZW50LWxlZnRcIjogXCJvdmVyZmxvdzogaGlkZGVuXCIsXG4gICAgXCIuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSAuc3ZfcV9yYWRpb2dyb3VwX290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lIC5zdl9xX2NoZWNrYm94X290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSwgLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCI6XG4gICAgICBcImxpbmUtaGVpZ2h0OiAyLjVlbTtcIixcbiAgICBcIi5mb3JtLWlubGluZSAuc3ZfcV9jaGVja2JveF9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOiBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLmZvcm0taW5saW5lIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfaW1nc2VsIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZTpub3QoOmxhc3QtY2hpbGQpXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXRcIjogXCJib3JkZXI6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIjogXCJkaXNwbGF5Om5vbmVcIixcblxuICAgIFwiLnN2X3BfdGl0bGVcIjogXCJwYWRkaW5nLWxlZnQ6IDFlbTsgcGFkZGluZy1ib3R0b206IDAuM2VtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiOiBcImN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdl9wX3RpdGxlIC5zdl9wYW5lbF9pY29uXCI6IFwiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9wX3RpdGxlIC5zdl9wYW5lbF9pY29uOjpiZWZvcmVcIjpcbiAgICAgIFwiY29udGVudDogJyc7IGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsgcGFkZGluZzogMC41ZW07IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqd2hMUzBnUjJWdVpYSmhkRzl5T2lCQlpHOWlaU0JKYkd4MWMzUnlZWFJ2Y2lBeU1pNHdMakVzSUZOV1J5QkZlSEJ2Y25RZ1VHeDFaeTFKYmlBdUlGTldSeUJXWlhKemFXOXVPaUEyTGpBd0lFSjFhV3hrSURBcElDQXRMVDROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCcFpEMGlUR0Y1WlhKZk1TSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJZ2VEMGlNSEI0SWlCNVBTSXdjSGdpRFFvSklIWnBaWGRDYjNnOUlqQWdNQ0F4TUNBeE1DSWdjM1I1YkdVOUltVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a09tNWxkeUF3SURBZ01UQWdNVEE3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNE5Danh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0RRb0pMbk4wTUh0bWFXeHNPaU0yUkRjd056STdmUTBLUEM5emRIbHNaVDROQ2p4d2IyeDVaMjl1SUdOc1lYTnpQU0p6ZERBaUlIQnZhVzUwY3owaU1pd3lJREFzTkNBMUxEa2dNVEFzTkNBNExESWdOU3cxSUNJdlBnMEtQQzl6ZG1jK0RRbz0pO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb24uc3ZfZXhwYW5kZWQ6OmJlZm9yZVwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiLFxuXG4gICAgXCIuc3ZfcV9maWxlID4gaW5wdXRbdHlwZT1maWxlXSwgLnN2X3FfZmlsZSA+IGJ1dHRvblwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9maWxlX3ByZXZpZXdcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IHBhZGRpbmc6IDVweDsgbWFyZ2luLXRvcDogMTBweDtcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlldyA+IGFcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1wiLFxuICAgIFwiLnN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCI6IFwibGluZS1oZWlnaHQ6IG5vcm1hbDtcIixcbiAgICBcIi5zdl9xX2ZpbGVfcmVtb3ZlXCI6IFwiZGlzcGxheTogYmxvY2s7IGN1cnNvcjogcG9pbnRlcjtcIixcblxuICAgIFwiLnN2X3FfbV9jZWxsX3RleHRcIjogXCJjdXJzb3I6IHBvaW50ZXI7XCIsXG5cbiAgICBcIi5zdl9xX2RkX290aGVyXCI6IFwibWFyZ2luLXRvcDogMWVtO1wiLFxuICAgIFwiLnN2X3FfZGRfb3RoZXIgaW5wdXRcIjogXCJ3aWR0aDogMTAwJTtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTEsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtMVwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMiwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC0yXCI6XG4gICAgICBcIndpZHRoOiA1MCU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTMsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtM1wiOlxuICAgICAgXCJ3aWR0aDogMzMuMzMzMzMlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC00LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sLTRcIjpcbiAgICAgIFwid2lkdGg6IDI1JTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtNSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC01XCI6XG4gICAgICBcIndpZHRoOiAyMCU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0xXCI6XG4gICAgICBcIndpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDEwMCU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTIsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tMlwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDUwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMywgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0zXCI6XG4gICAgICBcIm1heC13aWR0aDogMzMuMzMzMzMlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbHVtbi00LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sdW1uLTRcIjpcbiAgICAgIFwibWF4LXdpZHRoOiAyNSU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTUsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tNVwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDIwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfaW5wdXRcIjogXCJjb2xvcjogdHJhbnNwYXJlbnQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdlwiOlxuICAgICAgXCJvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgcGFkZGluZzogNHB4OyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IGJvcmRlci1yYWRpdXM6IDRweDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdiA+IGltZywgLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2ID4gZW1iZWRcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9xc3RuIHRhYmxlIHRyIHRkIC5zdl9xX21fY2VsbF9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDtcIixcblxuICAgIFwiZi1wYW5lbFwiOiBcInBhZGRpbmc6IDAuNWVtIDFlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBsaW5lLWhlaWdodDogMmVtO1wiLFxuXG4gICAgXCIuc3ZfcHJvZ3Jlc3NfYmFyID4gc3BhblwiOiBcIndoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX3NlbGVjdF9jb2x1bW5cIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtaW4td2lkdGg6IDEwJTtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3Ffc2VsZWN0X2NvbHVtbiA+ICo6bm90KC5zdl90ZWNobmljYWwpXCI6IFwiZGlzcGxheTogYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcXN0biAuc3ZfcV9zZWxlY3RfY29sdW1uIHRleHRhcmVhXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiAwOyBwYWRkaW5nLWxlZnQ6IDA7IGxpbmUtaGVpZ2h0OiBpbml0aWFsO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWhpZGRlblwiOiBcImRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi12aXN1YWxseWhpZGRlblwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogMXB4OyB3aWR0aDogMXB4OyBvdmVyZmxvdzogaGlkZGVuOyBjbGlwOiByZWN0KDFweCAxcHggMXB4IDFweCk7IGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcIixcblxuICAgIC8vIHBhbmVsZHluYW1pYyBwcm9ncmVzc1xuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6XG4gICAgICBcImhlaWdodDogMC4xOWVtOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgaGVpZ2h0OiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgLy8gRU8gcGFuZWxkeW5hbWljIHByb2dyZXNzXG5cbiAgICAvLyBwYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiOlxuICAgICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbi1yaWdodDogMjUwcHg7IG1hcmdpbi10b3A6IDIwcHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuXCI6IFwiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tdG9wOiAtMThweDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX2FkZC1idG4tLWxpc3QtbW9kZVwiOlxuICAgICAgXCIgIGZsb2F0OiBub25lOyBtYXJnaW4tdG9wOiAxZW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuIFwiOiBcIm1hcmdpbi10b3A6IDEuMjVlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiOlxuICAgICAgXCJib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGN1cnNvcjogcG9pbnRlcjsgd2lkdGg6IDAuN2VtOyB0b3A6IC0wLjI4ZW07IHBvc2l0aW9uOiBhYnNvbHV0ZTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCI6XG4gICAgICBcImxlZnQ6IC0xLjNlbTsgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4gXCI6XG4gICAgICBcInJpZ2h0OiAtMS4zZW07IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4uc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiY3Vyc29yOiBhdXRvO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiOlxuICAgICAgXCJmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAwLjg3ZW07IG1hcmdpbi10b3A6IDAuNjllbTsgbWFyZ2luLWxlZnQ6IDRlbVwiLFxuICAgIC8vIEVPIHBhbmVsZHluYW1pY1xuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiA2M3B4OyBoZWlnaHQ6IDI0cHg7IG1hcmdpbi1yaWdodDogMTdweDsgbWFyZ2luLWxlZnQ6IDIxcHg7IHBhZGRpbmc6IDJweCAzcHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGJvcmRlci1yYWRpdXM6IDEycHg7IGN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNHM7IHRyYW5zaXRpb24tcHJvcGVydHk6IG1hcmdpbi1sZWZ0OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDEwMCU7XCIsXG4gICAgXCIuc3ZfbWFpbiBzdi1ib29sZWFuX19sYWJlbFwiOiBcInZlcnRpY2FsLWFsaWduOiBtaWRkbGVcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1pbmRldGVybWluYXRlICAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiBjYWxjKDUwJSAtIDEwcHgpO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWNoZWNrZWQgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwibWFyZ2luLWxlZnQ6IGNhbGMoMTAwJSAtIDIwcHgpO1wiXG4gICAgLy8gRU8gYm9vbGVhblxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgTWVkaWE6IHsgW2tleTogc3RyaW5nXTogeyBtZWRpYTogc3RyaW5nOyBzdHlsZTogc3RyaW5nIH0gfSA9IHtcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC0xXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtMlwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTNcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC00XCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtNVwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCJcbiAgICB9LFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0blwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAudGl0bGUtbGVmdFwiOiB7XG4gICAgICBzdHlsZTogXCJmbG9hdDogbm9uZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGVcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdGhlYWRcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogbm9uZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0Ym9keSwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdHIsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRkXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlOm5vdCguc3ZfcV9tYXRyaXgpIHRkOmJlZm9yZVwiOiB7XG4gICAgICBzdHlsZTogXCJjb250ZW50OiBhdHRyKGhlYWRlcnMpO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnN2X3FfbWF0cml4IHRkOmFmdGVyXCI6IHtcbiAgICAgIHN0eWxlOiBcImNvbnRlbnQ6IGF0dHIoaGVhZGVycyk7IHBhZGRpbmctbGVmdDogMWVtXCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnJhZGlvIGxhYmVsLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuY2hlY2tib3ggbGFiZWxcIjoge1xuICAgICAgc3R5bGU6IFwibGluZS1oZWlnaHQ6IDEycHg7IHZlcnRpY2FsLWFsaWduOiB0b3A7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGlubGluZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY3VzdG9tX2hlYWRlclwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDEzMDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5zdl9oZWFkZXIgaDNcIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAxLjVlbTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiAxMzAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAuc3ZfaGVhZGVyIGgzIHNwYW5cIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAwLjc1ZW07XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpXCJcbiAgICB9LFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBfY3NzIC5zdi1wcm9ncmVzc19fdGV4dFwiOiB7XG4gICAgICBzdHlsZTogXCJtYXJnaW4tbGVmdDogOGVtO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KVwiXG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgVGhlbWVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9ID0ge1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmNGY0ZjRcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMxYWIzOTRcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMGFhMzg0XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiXG4gICAgfSxcbiAgICBvcmFuZ2U6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmOGY4ZjhcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiNmNzgxMTlcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjZTc3MTA5XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiNmNzgxMTlcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiXG4gICAgfSxcbiAgICBkYXJrYmx1ZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZDlkOGRkXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y2ZjdmMlwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzNjNGY2ZFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMyYzNmNWRcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCJcbiAgICB9LFxuICAgIGRhcmtyb3NlOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkZGQyY2VcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjdlZmVkXCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjNjg2NTZlXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzU4NTU1ZVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIlxuICAgIH0sXG4gICAgc3RvbmU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2NkY2NkMlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlZmVkZjRcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMwZjBmMzNcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMTkxOTU1XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwZjBmMzNcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiMwZjBmMzNcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiXG4gICAgfSxcbiAgICB3aW50ZXI6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzgyYjhkYVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkYWUxZTdcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMzYzNiNDBcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMWUxZDIwXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiXG4gICAgfSxcbiAgICB3aW50ZXJzdG9uZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjMzIzMjMyXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y4ZjhmOFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzVhYzhmYVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMwNmExZTdcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCJcbiAgICB9LFxuICAgIG1vZGVybjoge1xuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMxYWIzOTRcIixcbiAgICAgIFwiJGFkZC1idXR0b24tY29sb3JcIjogXCIjMTk0OGIzXCIsXG4gICAgICBcIiRyZW1vdmUtYnV0dG9uLWNvbG9yXCI6IFwiI2ZmMTgwMFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIlxuICAgIH0sXG4gICAgYm9vdHN0cmFwOiB7XG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzE4YTY4OVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0MDQwNDA7XCIsXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCJcbiAgICB9LFxuICAgIGJvb3RzdHJhcG1hdGVyaWFsOiB7XG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzE4YTY4OVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0MDQwNDA7XCIsXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIlxuICAgIH1cbiAgfTtcbiAgcHVibGljIHN0YXRpYyBUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9kZWZhdWx0X2Nzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaHJcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXSwgLnN2X2RlZmF1bHRfY3NzIGJ1dHRvblwiOlxuICAgICAgXCJjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ106aG92ZXIsIC5zdl9kZWZhdWx0X2NzcyBidXR0b246aG92ZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfaGVhZGVyXCI6IFwiY29sb3I6ICRoZWFkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2N1c3RvbV9oZWFkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXJcIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2JvZHlcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzc19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX3Jvb3QgPiAuc3Zfcm93XCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX3Jvb3QgPiAuc3Zfcm93Om50aC1jaGlsZChvZGQpXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3c6bnRoLWNoaWxkKGV2ZW4pXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Ffb3RoZXIgaW5wdXRcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9kcm9wZG93bl9jb250cm9sXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0ndGV4dCddXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3Mgc2VsZWN0XCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGV4dGFyZWFcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dDpub3QoW3R5cGU9J2J1dHRvbiddKTpub3QoW3R5cGU9J3Jlc2V0J10pOm5vdChbdHlwZT0nc3VibWl0J10pOm5vdChbdHlwZT0naW1hZ2UnXSk6bm90KFt0eXBlPSdjaGVja2JveCddKTpub3QoW3R5cGU9J3JhZGlvJ10pXCI6XG4gICAgICBcImJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXQ6bm90KFt0eXBlPSdidXR0b24nXSk6bm90KFt0eXBlPSdyZXNldCddKTpub3QoW3R5cGU9J3N1Ym1pdCddKTpub3QoW3R5cGU9J2ltYWdlJ10pOm5vdChbdHlwZT0nY2hlY2tib3gnXSk6bm90KFt0eXBlPSdyYWRpbyddKTpmb2N1c1wiOlxuICAgICAgXCJib3JkZXI6IDFweCBzb2xpZCAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY29udGFpbmVyIC5zdl9ib2R5IC5zdl9wX3Jvb3QgLnN2X3EgLnN2X3NlbGVjdF93cmFwcGVyIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2wgXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9vdGhlciBpbnB1dDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfdGV4dF9yb290OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9kcm9wZG93bl9jb250cm9sOmZvY3VzXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0ndGV4dCddOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICAnLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSBpbnB1dFt0eXBlPVwicmFkaW9cIl06Zm9jdXMsIC5zdl9kZWZhdWx0X2NzcyAuc3ZfY29udGFpbmVyIC5zdl9ib2R5IC5zdl9wX3Jvb3QgLnN2X3EgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmZvY3VzJzpcbiAgICAgIFwib3V0bGluZTogMXB4IGRvdHRlZCAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBzZWxlY3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRleHRhcmVhOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9zZWxlY3Rfd3JhcHBlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9zZWxlY3Rfd3JhcHBlcjo6YmVmb3JlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0uYWN0aXZlIC5zdl9xX3JhdGluZ19pdGVtX3RleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3JhdGluZ19pdGVtIC5zdl9xX3JhdGluZ19pdGVtX3RleHRcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3JhdGluZ19pdGVtIC5zdl9xX3JhdGluZ19pdGVtX3RleHQ6aG92ZXJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4IHRyXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2Ryb3Bkb3duIHRyXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyB0YWJsZS5zdl9xX21hdHJpeF9keW5hbWljIHRyXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX21fY2VsbF9zZWxlY3RlZFwiOlxuICAgICAgXCJjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9xX2ZpbGVfcmVtb3ZlOmhvdmVyXCI6IFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuMjllbTtcIixcbiAgICAvL3Byb2dyZXNzIGJhclxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIC8vcGFuZWxkeW5hbWljXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4uc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCI6IFwiY29sb3I6ICRwcm9ncmVzcy10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4sIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCI6XG4gICAgICBcImZpbGw6ICR0ZXh0LWNvbG9yXCIsXG5cbiAgICAvL2Jvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIlxuICAgIC8vZW8gYm9vbGVhblxuICB9O1xuICBwdWJsaWMgc3RhdGljIG1vZGVyblRoZW1lQ3NzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fYWRkLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRhZGQtYnV0dG9uLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRyZW1vdmUtYnV0dG9uLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW5fX3N3aXRjaFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW5fX3NsaWRlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRzbGlkZXItY29sb3I7XCIsXG4gICAgXCIuc3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCI6IFwiY29sb3I6ICRkaXNhYmxlZC1sYWJlbC1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zd2l0Y2gtY29sb3I7XCIsXG4gICAgXCIuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc2xpZGVyLWNvbG9yO1wiXG4gIH07XG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuICAgIFwiLnN2X21haW4gLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuNjZlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xc3RuX2Vycm9yX2JvdHRvbVwiOiBcIm1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlO1wiLFxuICAgIFwiLnN2X21haW4gLnByb2dyZXNzLWJhclwiOlxuICAgICAgXCJ3aWR0aDogYXV0bzsgbWFyZ2luLWxlZnQ6IDJweDsgbWFyZ2luLXJpZ2h0OiAycHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAudGFibGU+dGJvZHk+dHI+dGRcIjogXCJtaW4td2lkdGg6IDkwcHg7XCIsXG4gICAgXCIuc3ZfbWFpbiBmLXBhbmVsIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcIixcblxuICAgIC8vcHJvZ3Jlc3MgYmFyXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgLy9wYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4tLWRpc2FibGVkLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLS1kaXNhYmxlZFwiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiZmlsbDogJHRleHQtY29sb3JcIixcblxuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3N3aXRjaFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3NsaWRlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRzbGlkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCI6IFwiY29sb3I6ICRkaXNhYmxlZC1sYWJlbC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zd2l0Y2gtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIlxuICAgIC8vZW8gYm9vbGVhblxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwbWF0ZXJpYWxUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cC5pcy1mb2N1c2VkIC5mb3JtLWNvbnRyb2xcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCRtYWluLWNvbG9yLCAkbWFpbi1jb2xvciksIGxpbmVhci1ncmFkaWVudCgjRDJEMkQyLCAjRDJEMkQyKTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cC5pcy1mb2N1c2VkIGxhYmVsXCI6XG4gICAgICBcImNvbG9yOiRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6XG4gICAgICBcImhlaWdodDogMTAwJTtcIixcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVja1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGxhYmVsLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVja1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVjazpiZWZvcmVcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGxhYmVsLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVjazpiZWZvcmVcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2lyY2xlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2lyY2xlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2hlY2tcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2hlY2tcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1kZWZhdWx0LmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1kZWZhdWx0OmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1zZWNvbmRhcnkuYWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLXNlY29uZGFyeTphY3RpdmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLmJ0bi1wcmltYXJ5LCAuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgYnV0dG9uLmJ0bi1wcmltYXJ5XCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXS5idG4tcHJpbWFyeTpob3ZlciwgLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGJ1dHRvbi5idG4tcHJpbWFyeTpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xX2ltZ3NlbC5jaGVja2VkIGxhYmVsPmRpdlwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FfZmlsZV9yZW1vdmU6aG92ZXJcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmZvcm0tZ3JvdXAgaW5wdXRbdHlwZT1maWxlXVwiOlxuICAgICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IG9wYWNpdHk6IDE7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnByb2dyZXNzXCI6IFwid2lkdGg6IDYwJTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucHJvZ3Jlc3MtYmFyXCI6XG4gICAgICBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcblxuICAgIC8vcHJvZ3Jlc3MgYmFyXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgLy9wYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4tLWRpc2FibGVkLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLS1kaXNhYmxlZFwiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiZmlsbDogJHRleHQtY29sb3JcIixcblxuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3N3aXRjaFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3NsaWRlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRzbGlkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCI6IFwiY29sb3I6ICRkaXNhYmxlZC1sYWJlbC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zd2l0Y2gtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIlxuICAgIC8vZW8gYm9vbGVhblxuICB9O1xuXG4gIHByaXZhdGUgc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSBudWxsO1xuXG4gIHN0YXRpYyBmaW5kU2hlZXQoc3R5bGVTaGVldElkOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZG9jdW1lbnQuc3R5bGVTaGVldHNbaV0ub3duZXJOb2RlICYmXG4gICAgICAgICg8YW55PmRvY3VtZW50KS5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGVbXCJpZFwiXSA9PT0gc3R5bGVTaGVldElkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDxDU1NTdHlsZVNoZWV0PmRvY3VtZW50LnN0eWxlU2hlZXRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlU2hlZXRJZDtcbiAgICAvLyBBZGQgYSBtZWRpYSAoYW5kL29yIG1lZGlhIHF1ZXJ5KSBoZXJlIGlmIHlvdSdkIGxpa2UhXG4gICAgLy8gc3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgXCJzY3JlZW5cIilcbiAgICAvLyBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBcIm9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMTAyNHB4KVwiKVxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+c3R5bGUuc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwcGx5VGhlbWUoXG4gICAgdGhlbWVOYW1lOiBzdHJpbmcgPSBcImRlZmF1bHRcIixcbiAgICB0aGVtZVNlbGVjdG9yOiBzdHJpbmcgPSBcIi5zdl9tYWluXCJcbiAgKSB7XG4gICAgbGV0IFRoZW1lQ3NzOiBhbnk7XG5cbiAgICBpZiAodGhlbWVOYW1lID09PSBcIm1vZGVyblwiKSB0aGVtZVNlbGVjdG9yID0gXCIuc3Ytcm9vdC1tb2Rlcm4gXCI7XG5cbiAgICBpZiAoXG4gICAgICBbXCJib290c3RyYXBcIiwgXCJib290c3RyYXBtYXRlcmlhbFwiLCBcIm1vZGVyblwiXS5pbmRleE9mKHRoZW1lTmFtZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBUaGVtZUNzcyA9ICg8YW55PlN0eWxlc01hbmFnZXIpW3RoZW1lTmFtZSArIFwiVGhlbWVDc3NcIl07XG4gICAgICBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSB0aGVtZU5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRoZW1lQ3NzID0gU3R5bGVzTWFuYWdlci5UaGVtZUNzcztcbiAgICAgIHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IFwic3RhbmRhcmRcIjtcbiAgICB9XG5cbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICBsZXQgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmZpbmRTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KHRoZW1lTmFtZSArIHRoZW1lU2VsZWN0b3IpO1xuICAgICAgICBsZXQgdGhlbWUgPVxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbdGhlbWVOYW1lXSB8fFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbXCJkZWZhdWx0XCJdO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKFRoZW1lQ3NzKS5mb3JFYWNoKHNlbGVjdG9yID0+IHtcbiAgICAgICAgICBsZXQgY3NzUnVsZVRleHQgPSBUaGVtZUNzc1tzZWxlY3Rvcl07XG4gICAgICAgICAgT2JqZWN0LmtleXModGhlbWUpLmZvckVhY2goXG4gICAgICAgICAgICBjb2xvclZhcmlhYmxlTmFtZSA9PlxuICAgICAgICAgICAgICAoY3NzUnVsZVRleHQgPSBjc3NSdWxlVGV4dC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoXCJcXFxcXCIgKyBjb2xvclZhcmlhYmxlTmFtZSwgXCJnXCIpLFxuICAgICAgICAgICAgICAgIHRoZW1lW2NvbG9yVmFyaWFibGVOYW1lXVxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShcbiAgICAgICAgICAgIHRoZW1lU2VsZWN0b3IgKyBzZWxlY3RvciArIFwiIHsgXCIgKyBjc3NSdWxlVGV4dCArIFwiIH1cIixcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEVuYWJsZWQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChTdHlsZXNNYW5hZ2VyLkVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmZpbmRTaGVldChTdHlsZXNNYW5hZ2VyLlN1cnZleUpTU3R5bGVzU2hlZXRJZCk7XG4gICAgICBpZiAoIXRoaXMuc2hlZXQpIHtcbiAgICAgICAgdGhpcy5zaGVldCA9IFN0eWxlc01hbmFnZXIuY3JlYXRlU2hlZXQoXG4gICAgICAgICAgU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplU3R5bGVzKHRoaXMuc2hlZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplU3R5bGVzKHNoZWV0OiBDU1NTdHlsZVNoZWV0KSB7XG4gICAgaWYgKFN0eWxlc01hbmFnZXIuRW5hYmxlZCkge1xuICAgICAgT2JqZWN0LmtleXMoU3R5bGVzTWFuYWdlci5TdHlsZXMpLmZvckVhY2goc2VsZWN0b3IgPT5cbiAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShcbiAgICAgICAgICBzZWxlY3RvciArIFwiIHsgXCIgKyBTdHlsZXNNYW5hZ2VyLlN0eWxlc1tzZWxlY3Rvcl0gKyBcIiB9XCIsXG4gICAgICAgICAgMFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgT2JqZWN0LmtleXMoU3R5bGVzTWFuYWdlci5NZWRpYSkuZm9yRWFjaChzZWxlY3RvciA9PiB7XG4gICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgU3R5bGVzTWFuYWdlci5NZWRpYVtzZWxlY3Rvcl0ubWVkaWEgK1xuICAgICAgICAgICAgXCIgeyBcIiArXG4gICAgICAgICAgICBzZWxlY3RvciArXG4gICAgICAgICAgICBcIiB7IFwiICtcbiAgICAgICAgICAgIFN0eWxlc01hbmFnZXIuTWVkaWFbc2VsZWN0b3JdLnN0eWxlICtcbiAgICAgICAgICAgIFwiIH0gfVwiLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N0eWxlc21hbmFnZXIudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBKc29uRXJyb3IsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1xuICBCYXNlLFxuICBJU3VydmV5LFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleUltcGwsXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUXVlc3Rpb24sXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElQYWdlLFxuICBTdXJ2ZXlFcnJvcixcbiAgRXZlbnQsXG4gIElTdXJ2ZXlFcnJvck93bmVyLFxuICBJU3VydmV5RWxlbWVudFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQgeyBJU3VydmV5VHJpZ2dlck93bmVyLCBTdXJ2ZXlUcmlnZ2VyIH0gZnJvbSBcIi4vdHJpZ2dlclwiO1xuaW1wb3J0IHsgQ2FsY3VsYXRlZFZhbHVlIH0gZnJvbSBcIi4vY2FsY3VsYXRlZFZhbHVlXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi9wYWdlXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IGR4U3VydmV5U2VydmljZSB9IGZyb20gXCIuL2R4U3VydmV5U2VydmljZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwiLi9zdHlsZXNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBTdXJ2ZXlUaW1lciB9IGZyb20gXCIuL3N1cnZleXRpbWVyXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWxCYXNlIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7XG4gIEh0bWxDb25kaXRpb25JdGVtLFxuICBVcmxDb25kaXRpb25JdGVtLFxuICBFeHByZXNzaW9uSXRlbVxufSBmcm9tIFwiLi9leHByZXNzaW9uSXRlbXNcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIsIENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuLyoqXG4gKiBTdXJ2ZXkgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXJ2ZXkuIFBhZ2VzLCBRdWVzdGlvbnMsIGZsb3cgbG9naWMgYW5kIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleU1vZGVsIGV4dGVuZHMgQmFzZVxuICBpbXBsZW1lbnRzXG4gICAgSVN1cnZleSxcbiAgICBJU3VydmV5RGF0YSxcbiAgICBJU3VydmV5SW1wbCxcbiAgICBJU3VydmV5VHJpZ2dlck93bmVyLFxuICAgIElTdXJ2ZXlFcnJvck93bmVyLFxuICAgIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHByaXZhdGUgc3RhdGljIHN0eWxlc01hbmFnZXI6IFN0eWxlc01hbmFnZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIHBsYXRmb3JtOiBzdHJpbmcgPSBcInVua25vd25cIjtcbiAgcHVibGljIGdldCBwbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5TW9kZWwucGxhdGZvcm07XG4gIH1cbiAgLyoqXG4gICAqIFlvdSBtYXkgc2hvdyBjb21tZW50cyBpbnB1dCBmb3IgdGhlIG1vc3Qgb2YgcXVlc3Rpb25zLiBUaGUgZW50ZXJlZCB0ZXh0IGluIHRoZSBjb21tZW50IGlucHV0IHdpbGwgYmUgc2F2ZWQgYXMgJ3F1ZXN0aW9uIG5hbWUnICsgJ2NvbW1lbnRQcmVmaXgnLlxuICAgKiBAc2VlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXR0aW5ncy5jb21tZW50UHJlZml4O1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudFByZWZpeCh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLmNvbW1lbnRQcmVmaXggPSB2YWw7XG4gIH1cblxuICBwcml2YXRlIHBhZ2VzVmFsdWU6IEFycmF5PFBhZ2VNb2RlbD47XG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRQYWdlVmFsdWUoKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVudFBhZ2VWYWx1ZVwiLCBudWxsKTtcbiAgfVxuICBwcml2YXRlIHNldCBjdXJyZW50UGFnZVZhbHVlKHZhbDogUGFnZU1vZGVsKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVudFBhZ2VWYWx1ZVwiLCB2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWx1ZXNIYXNoOiBIYXNoVGFibGU8YW55PiA9IHt9O1xuICBwcml2YXRlIHZhcmlhYmxlc0hhc2g6IEhhc2hUYWJsZTxhbnk+ID0ge307XG5cbiAgcHJpdmF0ZSBsb2NhbGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFRleHRQcmVQcm9jZXNzb3I7XG4gIHByaXZhdGUgY29tcGxldGVkU3RhdGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBjb21wbGV0ZWRTdGF0ZVRleHRWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIGlzVGltZXJTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBzdXJ2ZXkgaXMgY29tcGxldGVkIGFuZCBvbkNvbXBsZXRlIGV2ZW50IGlzIGZpcmVkLiBZb3UgbWF5IHByZXZlbnQgdGhlIHN1cnZleSBmcm9tIGNvbXBsZXRpbmcgYnkgc2V0dGluZyBvcHRpb25zLmFsbG93Q29tcGxldGUgdG8gZmFsc2VcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3dDb21wbGV0ZSBzZXQgaXQgZmFsc2UgdG8gcHJldmVudCB0aGUgc3VydmV5IGZyb20gY29tcGxldGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS5cbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgb25Db21wbGV0aW5nOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB1c2VyIGNsaWNrIG9uICdDb21wbGV0ZScgYnV0dG9uIGFuZCBmaW5pc2hlZCB0aGUgc3VydmV5LiBZb3UgbWF5IHVzZSBpdCB0byBzZW5kIHRoZSBkYXRhIHRvIHlvdXIgd2ViIHNlcnZlci5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmcodGV4dCkgY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlIHN1cnZleSBpcyBzYXZpbmcgdGhlIGRhdGEgb24geW91ciBzZXJ2ZXIuIFRoZSB0ZXh0IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBzaG93IHlvdXIgbWVzc2FnZSBpbnN0ZWFkIG9mIGRlZmF1bHQuXG4gICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdFcnJvcih0ZXh0KSBjYWxsIHRoaXMgbWV0aG9kIHRvIHNob3cgdGhhdCB0aGVyZSBpcyBhbiBlcnJvciBvbiBzYXZpbmcgdGhlIGRhdGEgb24geW91ciBzZXJ2ZXIuIElmIHlvdSB3YW50IHRvIHNob3cgYSBjdXN0b20gZXJyb3IsIHVzZSBhbiBvcHRpb25hbCB0ZXh0IHBhcmFtZXRlci5cbiAgICogPGJyLz4gb3B0aW9ucy5zaG93RGF0YVNhdmluZ1N1Y2Nlc3ModGV4dCkgY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlIGRhdGEgd2VyZSBzdWNjZXNzZnVsIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdDbGVhciBjYWxsIHRoaXMgbWV0aG9kIHRvIGhpZGUgdGhlIHRleHQgYWJvdXQgdGhlIHNhdmluZyBwcm9ncmVzcy5cbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgY2xlYXJJbnZpc2libGVWYWx1ZXNcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqL1xuICBwdWJsaWMgb25Db21wbGV0ZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgdXNlciBjbGljayBvbiAnQ29tcGxldGUnIGJ1dHRvbi4gSXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHVybCB3aGVyZSBzdXJ2ZXkgd2lsbCBuYXZpZ2F0ZSB0by5cbiAgICogWW91IGhhdmUgdG8gc2V0dXAgdXAgbmF2aWdhdGVUb1VybCBwcm9wZXJ0aWVzIHRvIGxldCBzdXJ2ZXkgdG8gbmF2aWdhdGUgdG8gYW5vdGhlciB1cmwuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnVybCBjaGFuZ2UgaXQgdG8gbmF2aWdhdGUgdG8gYW5vdGhlciB1cmwuIFNldCBpdCB0byBlbXB0eSBzdHJpbmcgdG8gY2FuY2VsIHRoZSBuYXZpZ2F0aW9uIGFuZCBzaG93IHRoZSBjb21wbGV0ZWQgc3VydmV5IHBhZ2UuXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblxuICAgKi9cbiAgcHVibGljIG9uTmF2aWdhdGVUb1VybDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBzdXJ2ZXkgY2hhbmdlZCBpdCdzIHN0YXRlIGZyb20gXCJzdGFydGluZ1wiIHRvIFwicnVubmluZ1wiLiBUaGUgXCJzdGFydGluZ1wiIHN0YXRlIG1lYW5zIHRoYXQgc3VydmV5IHNob3dzIHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIFRoZSBmaXJzdFBhZ2VJc1N0YXJ0ZWQgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byB0aGUgdHJ1ZSwgaWYgeW91IHdhbnQgdG8gaGF2ZSB0aGUgc3RhcnRlZCBwYWdlIGluIHlvdXIgc3VydmV5LiBUaGUgZW5kLXVzZXIgc2hvdWxkIGNsaWNrIG9uIHRoZSBcIlN0YXJ0XCIgYnV0dG9uIHRvIHN0YXJ0IHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqL1xuICBwdWJsaWMgb25TdGFydGVkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjbGlja2luZyAnTmV4dCcgcGFnZSBpZiBzZW5kUmVzdWx0T25QYWdlTmV4dCBpcyBzZXQgdG8gdHJ1ZS4gWW91IG1heSB1c2UgaXQgdG8gc2F2ZSB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMsIGZvciBleGFtcGxlLCBpZiB5b3VyIHN1cnZleSBpcyBsYXJnZSBlbm91Z2guXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiBAc2VlIHNlbmRSZXN1bHRPblBhZ2VOZXh0XG4gICAqL1xuICBwdWJsaWMgb25QYXJ0aWFsU2VuZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGFub3RoZXIgcGFnZSBiZWNvbWVzIHRoZSBjdXJyZW50LiBUeXBpY2FsbHkgaXQgaGFwcGVucyB3aGVuIGEgdXNlciBjbGljayBvbiAnTmV4dCcgb3IgJ1ByZXYnIGJ1dHRvbnMuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb24ub2xkQ3VycmVudFBhZ2UgdGhlIHByZXZpb3VzIGN1cnJlbnQvYWN0aXZlIHBhZ2VcbiAgICogPGJyLz4gb3B0aW9uLm5ld0N1cnJlbnRQYWdlIGEgbmV3IGN1cnJlbnQvYWN0aXZlIHBhZ2VcbiAgICogPGJyLz4gb3B0aW9uLmFsbG93Q2hhbmdpbmcgc2V0IGl0IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhlIGN1cnJlbnQgcGFnZSBjaGFuZ2luZy4gSXQgaXMgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VOb1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgb25DdXJyZW50UGFnZUNoYW5nZWRcbiAgICoqL1xuICBwdWJsaWMgb25DdXJyZW50UGFnZUNoYW5naW5nOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBhbm90aGVyIHBhZ2UgYmVjb21lcyB0aGUgY3VycmVudC4gVHlwaWNhbGx5IGl0IGhhcHBlbnMgd2hlbiBhIHVzZXIgY2xpY2sgb24gJ05leHQnIG9yICdQcmV2JyBidXR0b25zLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9uLm9sZEN1cnJlbnRQYWdlIHRoZSBwcmV2aW91cyBjdXJyZW50L2FjdGl2ZSBwYWdlXG4gICAqIDxici8+IG9wdGlvbi5uZXdDdXJyZW50UGFnZSBhIG5ldyBjdXJyZW50L2FjdGl2ZSBwYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZU5vXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBwcmV2UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBvbkN1cnJlbnRQYWdlQ2hhbmdpbmdcbiAgICovXG4gIHB1YmxpYyBvbkN1cnJlbnRQYWdlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgcXVlc3Rpb24gdmFsdWUgaXMgY2hhbmdlZC4gSXQgY2FuIGJlIGRvbmUgdmlhIFVJIGJ5IGEgdXNlciBvciBwcm9ncmFtbWF0aWNhbGx5IG9uIGNhbGxpbmcgc2V0VmFsdWUgbWV0aG9kLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIHRoZSB2YWx1ZSBuYW1lIHRoYXQgaGFzIGJlaW5nIGNoYW5nZWRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIHdoaWNoIHF1ZXN0aW9uLm5hbWUgZXF1YWxzIHRvIHRoZSB2YWx1ZSBuYW1lLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgdGFrZW4uIElmIHRoZXJlIGlzIG5vIHN1Y2ggcXVlc3Rpb25zLCB0aGUgb3B0aW9ucy5xdWVzdGlvbiBpcyBudWxsLlxuICAgKiA8YnIvPiBvcHRpb25zLm9sZFZhbHVlIG9sZCwgcHJldmlvdXMgdmFsdWUuXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgYSBuZXcgdmFsdWUuIFlvdSBtYXkgY2hhbmdlIGl0XG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICogQHNlZSBvblZhbHVlQ2hhbmdlZFxuICAgKi9cbiAgcHVibGljIG9uVmFsdWVDaGFuZ2luZzogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHF1ZXN0aW9uIHZhbHVlIGlzIGNoYW5nZWQuIEl0IGNhbiBiZSBkb25lIHZpYSBVSSBieSBhIHVzZXIgb3IgcHJvZ3JhbW1hdGljYWxseSBvbiBjYWxsaW5nIHNldFZhbHVlIG1ldGhvZC5cbiAgICogUGxlYXNlIHVzZSBvbkR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQgYW5kIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZCBldmVudHMgdG8gaGFuZGxlIGNoYW5nZXMgYSBxdWVzdGlvbiBpbiB0aGUgUGFuZWwgRHluYW1pYyBhbmQgYSBjZWxsIHF1ZXN0aW9uIGluIG1hdHJpY2VzLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIHRoZSB2YWx1ZSBuYW1lIHRoYXQgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gd2hpY2ggcXVlc3Rpb24ubmFtZSBlcXVhbHMgdG8gdGhlIHZhbHVlIG5hbWUuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHF1ZXN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyB0YWtlbi4gSWYgdGhlcmUgaXMgbm8gc3VjaCBxdWVzdGlvbnMsIHRoZSBvcHRpb25zLnF1ZXN0aW9uIGlzIG51bGwuXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgYSBuZXcgdmFsdWVcbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKiBAc2VlIG9uVmFsdWVDaGFuZ2luZ1xuICAgKiBAc2VlIG9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZFxuICAgKiBAc2VlIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZFxuICAgKi9cbiAgcHVibGljIG9uVmFsdWVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2aXNpYmlsaXR5LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmlzaWJsZSBhIHF1ZXN0aW9uIHZpc2libGUgYm9vbGVhbiB2YWx1ZVxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2liaWxlXG4gICAqIEBzZWUgUXVlc3Rpb24udmlzaWJpbGVJZlxuICAgKi9cbiAgcHVibGljIG9uVmlzaWJsZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHBhZ2UgdmlzaWJpbGl0eS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFnZSBhIHBhZ2UgIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLnZpc2libGUgYSBwYWdlIHZpc2libGUgYm9vbGVhbiB2YWx1ZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmlsZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmlsZUlmXG4gICAqL1xuICBwdWJsaWMgb25QYWdlVmlzaWJsZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHBhbmVsIHZpc2liaWxpdHkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIGEgcGFuZWwgd2hpY2ggdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIDxici8+IG9wdGlvbnMudmlzaWJsZSBhIHBhbmVsIHZpc2libGUgYm9vbGVhbiB2YWx1ZVxuICAgKiBAc2VlIFBhbmVsTW9kZWwudmlzaWJpbGVcbiAgICogQHNlZSBQYW5lbE1vZGVsLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsVmlzaWJsZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcXVlc3Rpb24gaW50byBzdXJ2ZXkuXG4gICAqICdxdWVzdGlvbic6IHF1ZXN0aW9uLCAnbmFtZSc6IHF1ZXN0aW9uLm5hbWUsICdpbmRleCc6IGluZGV4LCAncGFyZW50UGFuZWwnOiBwYXJlbnRQYW5lbCwgJ3Jvb3RQYW5lbCc6IHJvb3RQYW5lbFxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIG5ld2x5IGFkZGVkIHF1ZXN0aW9uIG9iamVjdC5cbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLmluZGV4IGEgaW5kZXggb2YgdGhlIHF1ZXN0aW9uIGluIHRoZSBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpXG4gICAqIDxici8+IG9wdGlvbnMucGFyZW50UGFuZWwgYSBjb250YWluZXIgd2hlcmUgcXVlc3Rpb24gaXMgbG9jYXRlZC4gSXQgY2FuIGJlIHBhZ2Ugb3IgcGFuZWwuXG4gICAqIDxici8+IG9wdGlvbnMucm9vdFBhbmVsIHR5cGljYWxseSBpdCBpcyBhIHBhZ2UuXG4gICAqIEBzZWUgUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblF1ZXN0aW9uQWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHF1ZXN0aW9uIGZyb20gc3VydmV5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcmVtb3ZlZCBxdWVzdGlvbiBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogQHNlZSBRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25SZW1vdmVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgcGFuZWwgaW50byBzdXJ2ZXlcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSBuZXdseSBhZGRlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHBhbmVsIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5pbmRleCBhIGluZGV4IG9mIHRoZSBwYW5lbCBpbiB0aGUgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKVxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudFBhbmVsIGEgY29udGFpbmVyIHdoZXJlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuIEl0IGNhbiBiZSBwYWdlIG9yIHBhbmVsLlxuICAgKiA8YnIvPiBvcHRpb25zLnJvb3RQYW5lbCB0eXBpY2FsbHkgaXQgaXMgYSBwYWdlLlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsQWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gc3VydmV5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIGEgcmVtb3ZlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHBhbmVsIG5hbWVcbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFJlbW92ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBwYWdlIGludG8gc3VydmV5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBuZXdseSBhZGRlZCBwYW5lbCBvYmplY3QuXG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIG9uUGFnZUFkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gdmFsaWRhdGluZyB2YWx1ZSBpbiBhIHF1ZXN0aW9uLiBTZXQgeW91ciBlcnJvciB0byBvcHRpb25zLmVycm9yIGFuZCBzdXJ2ZXkgd2lsbCBzaG93IHRoZSBlcnJvciBmb3IgdGhlIHF1ZXN0aW9uIGFuZCBibG9jayBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgb3IgZ29pbmcgdG8gdGhlIG5leHQgcGFnZS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgdGhlIGN1cnJlbnQgcXVlc3Rpb24gdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvciBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgKiBAc2VlIG9uU2V0dGluZ1F1ZXN0aW9uRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZVF1ZXN0aW9uOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGVycm9ycyBhcmUgc2V0dGluZyBpbnRvIHF1ZXN0aW9uLiBZb3UgbWF5IGFkZC9yZW1vdmUvbW9kaWZ5IGVycm9ycyBmb3IgYSBxdWVzdGlvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLmVycm9ycyB0aGUgbGlzdCBvZiBlcnJvcnMuIFRoZSBsaXN0IGNhbiBiZSBlbXB0eSBpZiBieSBkZWZhdWx0IHRoZXJlIGlzIG5vIGVycm9yc1xuICAgKiBAc2VlIG9uVmFsaWRhdGVRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uU2V0dGluZ1F1ZXN0aW9uRXJyb3JzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byB2YWxpZGF0ZSBkYXRhIG9uIHlvdXIgc2VydmVyLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5kYXRhIHRoZSB2YWx1ZXMgb2YgYWxsIG5vbi1lbXB0eSBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZS4gWW91IGNhbiBnZXQgYSBxdWVzdGlvbiB2YWx1ZSBhcyBvcHRpb25zLmRhdGFbXCJteVF1ZXN0aW9uTmFtZVwiXS5cbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvcnMgc2V0IHlvdXIgZXJyb3JzIHRvIHRoaXMgb2JqZWN0IGFzOiBvcHRpb25zLmVycm9yc1tcIm15UXVlc3Rpb25OYW1lXCJdID0gXCJFcnJvciB0ZXh0XCI7LiBJdCB3aWxsIGJlIHNob3duIGFzIGEgcXVlc3Rpb24gZXJyb3IuXG4gICAqIDxici8+IG9wdGlvbnMuY29tcGxldGUoKSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdGVsbCBzdXJ2ZXkgdGhhdCB5b3VyIHNlcnZlciBjYWxsYmFjayBoYXMgYmVlbiBwcm9jZXNzZWQuXG4gICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAqIEBzZWUgb25WYWxpZGF0ZVBhbmVsXG4gICAqL1xuICBwdWJsaWMgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uczogYW55ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gbW9kaWZ5IHRoZSBodG1sIGJlZm9yZSByZW5kZXJpbmcsIGZvciBleGFtcGxlIGh0bWwgb24gJ1RoYW5rIHlvdScgcGFnZS4gT3B0aW9ucyBoYXMgb25lIHBhcmFtZXRlcjogb3B0aW9ucy5odG1sLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sIGFuIGh0bWwgdGhhdCB5b3UgbWF5IGNoYW5nZSBiZWZvcmUgdGV4dCBwcm9jZXNzaW5nIGFuZCB0aGVuIHJlbmRlcmluZy5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqIEBzZWUgbG9hZGluZ0h0bWxcbiAgICogQHNlZSBRdWVzdGlvbkh0bWxNb2RlbC5odG1sXG4gICAqL1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHZhbGlkYXRpbmcgYSBwYW5lbC4gU2V0IHlvdXIgZXJyb3IgdG8gb3B0aW9ucy5lcnJvciBhbmQgc3VydmV5IHdpbGwgc2hvdyB0aGUgZXJyb3IgZm9yIHRoZSBwYW5lbCBhbmQgYmxvY2sgY29tcGxldGluZyB0aGUgc3VydmV5IG9yIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBwYW5lbCBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMuZXJyb3IgYW4gZXJyb3Igc3RyaW5nLiBJdCBpcyBlbXB0eSBieSBkZWZhdWx0LlxuICAgKiBAc2VlIG9uVmFsaWRhdGVRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uVmFsaWRhdGVQYW5lbDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoZSBldmVudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgZXJyb3IgdGV4dC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMudGV4dCBhbiBlcnJvciB0ZXh0XG4gICAqIDxici8+IG9wdGlvbnMuZXJyb3IgYW4gaW5zdGFuY2Ugb2YgU3VydmV5RXJyb3Igb2JqZWN0XG4gICAqIDxici8+IG9wdGlvbnMubmFtZSB0aGUgZXJyb3IgbmFtZS4gVGhlIGZvbGxvd2luZyBlcnJvciBuYW1lIGFyZSBhdmFpbGFibGU6XG4gICAqIHJlcXVpcmVkLCByZXF1aXJlb25lYW5zd2VyLCByZXF1aXJlbnVtZXJpYywgZXhjZWVkc2l6ZSwgd2VicmVxdWVzdCwgd2VicmVxdWVzdGVtcHR5LCBvdGhlcmVtcHR5LFxuICAgKiB1cGxvYWRpbmdmaWxlLCByZXF1aXJlZGluYWxscm93c2Vycm9yLCBtaW5yb3djb3VudGVycm9yLCBrZXlkdXBsaWNhdGlvbmVycm9yLCBjdXN0b21cbiAgICovXG4gIHB1YmxpYyBvbkVycm9yQ3VzdG9tVGV4dDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoZSB0aGlzIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHN1cnZleSBmaW5pc2hlZCB2YWxpZGF0ZSBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZS4gSXQgY29tbW9ubHkgaGFwcGVucyB3aGVuIGEgdXNlciB0cnkgdG8gZ28gdG8gdGhlIG5leHQgcGFnZSBvciBjb21wbGV0ZSB0aGUgc3VydmV5XG4gICAqIG9wdGlvbnMucXVlc3Rpb25zIC0gdGhlIGxpc3Qgb2YgcXVlc3Rpb25zIHRoYXQgaGF2ZSBlcnJvcnNcbiAgICogb3B0aW9ucy5lcnJvcnMgLSB0aGUgbGlzdCBvZiBlcnJvcnNcbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2U6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcblxuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gbW9kaWZ5IHRoZSBodG1sIGJlZm9yZSByZW5kZXJpbmcsIGZvciBleGFtcGxlIGNvbXBsZXRlSHRtbCBvciBsb2FkaW5nSHRtbC5cbiAgICogb3B0aW9ucy5odG1sIC0gY2hhbmdlIHRoaXMgaHRtbCBwcm9wZXJ0eSBiZWZvcmUgdGhlIGxpYnJhcnkgcmVuZGVyZWQgaXRcbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqIEBzZWUgbG9hZGluZ0h0bWxcbiAgICovXG4gIHB1YmxpYyBvblByb2Nlc3NIdG1sOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIHF1ZXN0aW9uIHRpdGxlIGluIHRoZSBjb2RlLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy50aXRsZSBhIGNhbGN1YWx0ZWQgcXVlc3Rpb24gdGl0bGUsIGJhc2VkIG9uIHF1ZXN0aW9uIHRpdGxlLCBuYW1lLCBpc1JlcXVpcmVkLCB2aXNpYmxlSW5kZXggKG5vKVxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uR2V0UXVlc3Rpb25UaXRsZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gcHJvY2VzcyB0aGUgbWFya2Rvd24gdGV4dC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuZWxlbWVudCBTdXJ2ZXlKUyBlbGVtZW50IHdoZXJlIHRoZSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuIEl0IGlzIGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlIG9yIHN1cnZleVxuICAgKiA8YnIvPiBvcHRpb25zLnRleHQgYSB0ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWRcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sIGEgaHRtbC4gSXQgaXMgbnVsbCBieSBkZWZhdWx0LiBTZXQgaXQgYW5kIHN1cnZleSB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIG9wdGlvbnMudGV4dFxuICAgKi9cbiAgcHVibGljIG9uVGV4dE1hcmtkb3duOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgZmlyZXMgd2hlbiBpdCBnZXQgcmVzcG9uc2UgZnJvbSB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2Ugb24gc2F2aW5nIHN1cnZleSByZXN1bHRzLiBVc2UgaXQgdG8gZmluZCBvdXQgaWYgdGhlIHJlc3VsdHMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWwuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN1Y2Nlc3MgaXQgaXMgdHJ1ZSBpZiB0aGUgcmVzdWx0cyB3ZXJlIHNlbnQgdG8gdGhlIHNlcnZpY2Ugc3VjY2Vzc2Z1bFxuICAgKiA8YnIvPiBvcHRpb25zLnJlc3BvbnNlIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZVxuICAgKi9cbiAgcHVibGljIG9uU2VuZFJlc3VsdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIGl0IHRvIGdldCByZXN1bHRzIGFmdGVyIGNhbGxpbmcgdGhlIGdldFJlc3VsdCBtZXRob2QuIEl0IHJldHVybnMgYSBzaW1wbGUgYW5hbHl0aWMgZnJvbSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuc3VjY2VzcyBpdCBpcyB0cnVlIGlmIHRoZSByZXN1bHRzIHdlcmUgZ290IGZyb20gdGhlIHNlcnZpY2Ugc3VjY2Vzc2Z1bFxuICAgKiA8YnIvPiBvcHRpb25zLmRhdGEgdGhlIG9iamVjdCB7QW5zd2Vyc0NvdW50LCBRdWVzdGlvblJlc3VsdCA6IHt9IH0uIEFuc3dlcnNDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHBvc3RlZCBzdXJ2ZXkgcmVzdWx0cy4gUXVlc3Rpb25SZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggYWxsIHBvc3NpYmxlIHVuaXF1ZSBhbnN3ZXJzIHRvIHRoZSBxdWVzdGlvbiBhbmQgbnVtYmVyIG9mIHRoZXNlIGFuc3dlcnMuXG4gICAqIDxici8+IG9wdGlvbnMuZGF0YUxpc3QgYW4gYXJyYXkgb2Ygb2JqZWN0cyB7bmFtZSwgdmFsdWV9LCB3aGVyZSAnbmFtZScgaXMgYW4gdW5pcXVlIHZhbHVlL2Fuc3dlciB0byB0aGUgcXVlc3Rpb24gYW5kIHZhbHVlIGlzIGEgbnVtYmVyL2NvdW50IG9mIHN1Y2ggYW5zd2Vycy5cbiAgICogPGJyLz4gb3B0aW9ucy5yZXNwb25zZSB0aGUgc2VydmVyIHJlc3BvbnNlXG4gICAqIEBzZWUgZ2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgb25HZXRSZXN1bHQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB1cGxvYWRpbmcgdGhlIGZpbGUgaW4gUXVlc3Rpb25GaWxlIHdoZW4gc3RvcmVEYXRhQXNUZXh0IGlzIHNldCB0byBmYWxzZS4gWW91IG1heSB1c2UgaXQgdG8gY2hhbmdlIHRoZSBmaWxlIG5hbWUgb3IgdGVsbHMgdGhlIGxpYnJhcnkgZG8gbm90IGFjY2VwdCB0aGUgZmlsZS4gVGhlcmUgYXJlIHRocmVlIHByb3BlcnRpZXMgaW4gb3B0aW9uczogb3B0aW9ucy5uYW1lLCBvcHRpb25zLmZpbGUgYW5kIG9wdGlvbnMuYWNjZXB0LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogbmFtZTogbmFtZSwgZmlsZTogZmlsZSwgYWNjZXB0OiBhY2NlcHRcbiAgICogPGJyLz4gbmFtZSB0aGUgZmlsZSBuYW1lXG4gICAqIDxici8+IGZpbGUgdGhlIEphdmFzY3JpcHQgRmlsZSBvYmplY3RcbiAgICogPGJyLz4gYWNjZXB0IGEgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgdG8gZmFsc2UgdG8gZGVueSB0aGlzIGZpbGUgdG8gdXBsb2FkXG4gICAqIEBzZWUgdXBsb2FkRmlsZXNcbiAgICogQHNlZSBRdWVzdGlvbkZpbGVNb2RlbC5zdG9yZURhdGFBc1RleHRcbiAgICovXG4gIHB1YmxpYyBvblVwbG9hZEZpbGVzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gZG93bmxvYWRpbmcgdGhlIGZpbGUgaW4gUXVlc3Rpb25GaWxlLiBZb3UgbWF5IHVzZSBpdCB0byBwYXNzIHRoZSBmaWxlIGZvciB0aGUgcHJldmlldy4gVGhlcmUgYXJlIGZvdXIgcHJvcGVydGllcyBpbiBvcHRpb25zOiBvcHRpb25zLm5hbWUsIG9wdGlvbnMuY29udGVudCwgb3B0aW5zLmZpbGVWYWx1ZSBhbmQgb3B0aW9ucy5jYWxsYmFjay5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIG5hbWU6IG5hbWUsIGNvbnRlbnQ6IGNvbnRlbnQsIGZpbGVWYWx1ZTogZmlsZVZhbHVlXG4gICAqIDxici8+IG5hbWUgdGhlIHF1ZXN0aW9uIG5hbWVcbiAgICogPGJyLz4gY29udGVudCB0aGUgZmlsZSBjb250ZW50XG4gICAqIDxici8+IGZpbGVWYWx1ZSBzaW5nbGUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiA8YnIvPiBjYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiBkb3dubG9hZGluZyB0aGUgZmlsZSBhbmQgdGhlIGRvd25sb2FkZWQgZmlsZSBjb250ZW50XG4gICAqIEBzZWUgZG93bmxvYWRGaWxlXG4gICAqL1xuICBwdWJsaWMgb25Eb3dubG9hZEZpbGU6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjbGVhcmluZyB0aGUgdmFsdWUgaW4gUXVlc3Rpb25GaWxlLiBZb3UgbWF5IHVzZSBpdCB0byByZW1vdmUgZmlsZXMgc3RvcmVkIG9uIHlvdXIgc2VydmVyLiBUaGVyZSBhcmUgdGhyZWUgcHJvcGVydGllcyBpbiBvcHRpb25zOiBvcHRpb25zLm5hbWUsIG9wdGlvbnMudmFsdWUgYW5kIG9wdGlvbnMuY2FsbGJhY2suXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWVcbiAgICogPGJyLz4gbmFtZSB0aGUgcXVlc3Rpb24gbmFtZVxuICAgKiA8YnIvPiB2YWx1ZSB0aGUgcXVlc3Rpb24gdmFsdWVcbiAgICogPGJyLz4gZmlsZU5hbWUgb2YgdGhlIHJlbW92ZWQgZmlsZSwgcGFzcyBudWxsIHRvIGNsZWFyIGFsbCBmaWxlc1xuICAgKiA8YnIvPiBjYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiBjbGVhcmluZyB0aGUgZmlsZXMgb3BlcmF0aW9uXG4gICAqIEBzZWUgY2xlYXJGaWxlc1xuICAgKi9cbiAgcHVibGljIG9uQ2xlYXJGaWxlczogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGNob2ljZXMgZm9yIHJhZGlvZ3JvdXAsIGNoZWNrYm94IGFuZCBkcm9wZG93biBoYXMgYmVlbiBsb2FkZWQgZnJvbSB0aGUgUkVTVGZ1bCBzZXJ2aWNlIGFuZCBiZWZvcmUgdGhleSBhcmUgYXNzaWduIHRvIHRoZSBxdWVzdGlvbi5cbiAgICogWW91IG1heSBjaGFuZ2UgdGhlIGNob2ljZXMsIGJlZm9yZSBpdCB3YXMgYXNzaWduIG9yIGRpc2FibGUvZW5hYmxlZCBtYWtlIHZpc2libGUvaW52aXNpYmxlIHF1ZXN0aW9uLCBiYXNlZCBvbiBsb2FkZWQgcmVzdWx0c1xuICAgKiA8YnIvPiBxdWVzdGlvbiAtIHRoZSBxdWVzdGlvbiB3aGVyZSBsb2FkZWQgY2hvaWNlcyBhcmUgZ29pbmcgdG8gYmUgYXNzaWduZWRcbiAgICogPGJyLz4gY2hvaWNlcyAtIHRoZSBsb2FkZWQgY2hvaWNlcy4gWW91IG1heSBjaGFuZ2UgdGhlbSB0byBhc3NpZ24gdGhlIGNvcnJlY3Qgb25lXG4gICAqIDxicj4gc2VydmVyUmVzdWx0IC0gYSByZXN1bHQgdGhhdCBjb21lcyBmcm9tIHRoZSBzZXJ2ZXIgYXMgaXQgaXMuXG4gICAqL1xuICBwdWJsaWMgb25Mb2FkQ2hvaWNlc0Zyb21TZXJ2ZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBwcm9jZXNzaW5nIHRoZSB0ZXh0IHdoZW4gaXQgZmluZHMgYSB0ZXh0IGluIGJyYWNrZXRzOiB7c29tZXZhbHVlfS4gQnkgZGVmYXVsdCBpdCB1c2VzIHRoZSB2YWx1ZSBvZiBzdXJ2ZXkgcXVlc3Rpb24gdmFsdWVzIGFuZCB2YXJpYWJsZXMuXG4gICAqIEZvciBleGFtcGxlLCB5b3UgbWF5IHVzZSB0aGUgdGV4dCBwcm9jZXNzaW5nIGluIGxvYWRpbmcgY2hvaWNlcyBmcm9tIHRoZSB3ZWIuIElmIHlvdXIgY2hvaWNlc0J5VXJsLnVybCBlcXVhbHMgdG8gXCJVcmxUb1NlcnZpY2VUb0dldEFsbENpdGllcy97Y291bnRyeX0ve3N0YXRlfVwiLFxuICAgKiB5b3UgbWF5IHNldCBvbiB0aGlzIGV2ZW50IG9wdGlvbnMudmFsdWUgdG8gXCJhbGxcIiBvciBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgXCJzdGF0ZVwiIHZhbHVlL3F1ZXN0aW9uIGlzIG5vbiBzZWxlY3RlZCBieSBhIHVzZXIuXG4gICAqIDxici8+IG5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzc2luZyB2YWx1ZSwgZm9yIGV4YW1wbGUsIFwic3RhdGVcIiBpbiBvdXIgZXhhbXBsZVxuICAgKiA8YnIvPiB2YWx1ZSAtIHRoZSB2YWx1ZSBvZiB0aGUgcHJvY2Vzc2luZyB0ZXh0XG4gICAqIDxici8+IGlzRXhpc3RzIC0gYSBib29sZWFuIHZhbHVlLiBTZXQgaXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIGFuZCBzZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0LlxuICAgKi9cbiAgcHVibGljIG9uUHJvY2Vzc1RleHRWYWx1ZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSByZW5kZXJpbmcgYSBxdWVzdGlvbi4gVXNlIGl0IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHF1ZXN0aW9uIGNzcyBjbGFzc2VzLlxuICAgKiBUaGVyZSBhcmUgdHdvIHBhcmFtZXRlcnMgaW4gb3B0aW9uczogb3B0aW9ucy5xdWVzdGlvbiBhbmQgb3B0aW9ucy5jc3NDbGFzc2VzXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gZm9yIHdoaWNoIHlvdSBtYXkgY2hhbmdlIHRoZSBjc3MgY2xhc3Nlc1xuICAgKiA8YnIvPiBvcHRpb25zLmNzc0NsYXNzZXMgYW4gb2JqZWN0IHdpdGggY3NzIGNsYXNzZXMuIEZvciBleGFtcGxlIHtyb290OiBcInRhYmxlXCIsIGJ1dHRvbjogXCJidXR0b25cIn0uIFlvdSBtYXkgY2hhbmdlIHRoZW0gdG8geW91ciBvd24gY3NzIGNsYXNzZXMuXG4gICAqL1xuICBwdWJsaWMgb25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXM6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgcGFuZWwgb3IgcGFnZS4gVXNlIGl0IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhbmVsL3BhZ2UgY3NzIGNsYXNzZXMuXG4gICAqIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLnBhbmVsIGFuZCBvcHRpb25zLmNzc0NsYXNzZXNcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSBwYW5lbCBmb3Igd2hpY2ggeW91IG1heSBjaGFuZ2UgdGhlIGNzcyBjbGFzc2VzXG4gICAqIDxici8+IG9wdGlvbnMuY3NzQ2xhc3NlcyBhbiBvYmplY3Qgd2l0aCBjc3MgY2xhc3Nlcy4gRm9yIGV4YW1wbGUge3RpdGxlOiBcInN2X3BfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwic21hbGxcIn0uIFlvdSBtYXkgY2hhbmdlIHRoZW0gdG8geW91ciBvd24gY3NzIGNsYXNzZXMuXG4gICAqL1xuICBwdWJsaWMgb25VcGRhdGVQYW5lbENzc0NsYXNzZXM6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBzdXJ2ZXkgaXMgcmVuZGVyZWQgaW4gRE9NLiBvcHRpb25zLmh0bWxFbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLmh0bWxFbGVtZW50IGEgcm9vdCBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIHN1cnZleSBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyU3VydmV5OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSBwYWdlIGlzIHJlbmRyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IGh0bWwgZWxlbWVudHMuIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLmN1cnJlbnRQYWdlLCBvcHRpb25zLmh0bWxFbGVtZW50XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBwYWdlIG9iamVjdCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLiBUeXBpY2FsbHkgdGhlIGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYW4gaHRtbCBlbGVtZW50IGJpbmRlZCB3aXRoIHRoZSBwYWdlIG9iamVjdFxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJQYWdlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSBxdWVzdGlvbiBpcyByZW5kcmVkIGluIERPTS4gVXNlIGl0IHRvIG1vZGlmeSBodG1sIGVsZW1lbnRzLiBUaGVyZSBhcmUgdHdvIHBhcmFtZXRlcnMgaW4gb3B0aW9uczogb3B0aW9ucy5xdWVzdGlvbiwgb3B0aW9ucy5odG1sRWxlbWVudFxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIG9iamVjdCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYW4gaHRtbCBlbGVtZW50IGJpbmRlZCB3aXRoIHRoZSBxdWVzdGlvbiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyUXVlc3Rpb246IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhbmVsIGlzIHJlbmRyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IGh0bWwgZWxlbWVudHMuIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLnBhbmVsLCBvcHRpb25zLmh0bWxFbGVtZW50XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIGEgcGFuZWwgb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWRcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCBhbiBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIHBhbmVsIG9iamVjdFxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJQYW5lbDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIG5ldyByb3cgaW4gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeFJvd0FkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGFkZGluZyBhIG5ldyByb3cgaW4gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBvcHRpb25zLmNhbkFkZFJvdyBhbiBhbGxvd2luZyBmbGFnLlxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEJlZm9yZVJvd0FkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSByb3cgZnJvbSBNYXRyaXggRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBtYXRyaXggcXVlc3Rpb24uXG4gICAqIDxici8+IG9wdGlvbnMucm93SW5kZXggYSByZW1vdmVkIHJvdyBpbmRleC5cbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgYSByZW1vdmVkIHJvdyBvYmplY3QuXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC52aXNpYmxlUm93c1xuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Um93UmVtb3ZlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSByZW5kZXJpbmcgXCJSZW1vdmVcIiBidXR0b24gZm9yIHJlbW92aW5nIGEgcm93IGZyb20gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBvcHRpb25zLnJvd0luZGV4IGEgcm93IGluZGV4LlxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyBhIHJvdyBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3cgYSBib29sZWFuIHByb3BlcnR5LiBTZXQgaXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgcm93IHJlbW92aW5nLlxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhBbGxvd1JlbW92ZVJvdzogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGZvciBldmVyeSBjZWxsIGNyZWF0ZWQgaW4gTWF0cml4IER5bWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zLlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLmNlbGwgLSB0aGUgbWF0cml4IGNlbGxcbiAgICogPGJyLz4gb3B0aW9ucy5jZWxsUXVlc3Rpb24gLSB0aGUgcXVlc3Rpb24vZWRpdG9yIGluIHRoZSBjZWxsLiBZb3UgbWF5IGN1c3RvbWl6ZSBpdCwgY2hhbmdlIGl0J3MgcHJvcGVydGllcywgbGlrZSBjaG9pY2VzIG9yIHZpc2libGUuXG4gICAqIDxici8+IG9wdGlvbnMucm93VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcm93LiBUbyBhY2Nlc3MgdGhlIHZhbHVlIG9mIHBhdGljdWxhciBjb2x1bW4gdXNlOiBvcHRpb25zLnJvd1ZhbHVlW1wiY29sdW1uVmFsdWVcIl1cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bW4gLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMucm93IC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0XG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbENyZWF0ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBmb3IgZXZlcnkgY2VsbCBhZnRlciBpcyBoYXMgYmVlbiByZW5kZXJlZCBpbiBET00uXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgbWF0cml4IHF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuY2VsbCAtIHRoZSBtYXRyaXggY2VsbFxuICAgKiA8YnIvPiBvcHRpb25zLmNlbGxRdWVzdGlvbiAtIHRoZSBxdWVzdGlvbi9lZGl0b3IgaW4gdGhlIGNlbGwuXG4gICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYSBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIGNlbGxRdWVzdGlvbiBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bW4gLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICogQHNlZSBvbk1hdHJpeENlbGxDcmVhdGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEFmdGVyQ2VsbFJlbmRlcjogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gY2VsbCB2YWx1ZSBpcyBjaGFuZ2VkIGluIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucy5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIG5ldyB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2luZ1xuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBjZWxsIHZhbHVlIGluIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucy4gWW91IG1heSBjaGFuZ2UgdGhlIG9wdGlvbnMudmFsdWUgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgY2VsbC5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIG5ldyB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLm9sZFZhbHVlIC0gdGhlIG9sZCB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucyB2YWxpZGF0ZSB0aGUgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIGNlbGwgdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSkgLSB0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjZWxsIHF1ZXN0aW9uIGJ5IGNvbHVtbiBuYW1lLlxuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxWYWxpZGF0ZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIG5ldyBwYW5lbCBpbiBQYW5lbCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHBhbmVsIHF1ZXN0aW9uLlxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLnBhbmVsc1xuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsQWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBwYW5lbCBxdWVzdGlvbi5cbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbEluZGV4IGEgcmVtb3ZlZCBwYW5lbCBpbmRleC5cbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5wYW5lbHNcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbFJlbW92ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBldmVyeSBzZWNvbmQgaWYgdGhlIG1ldGhvZCBzdGFydFRpbWVyIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqIEBzZWUgUGFnZS50aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBvblRpbWVyOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgZGlzcGxheWluZyBhIG5ldyBpbmZvcm1hdGlvbiBpbiB0aGUgVGltZXIgUGFuZWwuIFVzZSBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogPGJyLz4gb3B0aW9ucy50ZXh0IC0gdGhlIHRpbWVyIHBhbmVsIGluZm8gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBvblRpbWVyUGFuZWxJbmZvVGV4dDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gaXRlbSB2YWx1ZSBpcyBjaGFuZ2VkIGluIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgcGFuZWwgcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCAtIHRoZSBkeW5hbWljIHBhbmVsIGl0ZW1cbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIC0gdGhlIGl0ZW0gbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIC0gYSBuZXcgdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5pdGVtSW5kZXggLSB0aGUgcGFuZWwgaXRlbSBpbmRleFxuICAgKiA8YnIvPiBvcHRpb25zLml0ZW1WYWx1ZSAtIHRoZSBwYW5lbCBpdGVtIG9iamVjdFxuICAgKiBAc2VlIG9uRHluYW1pY1BhbmVsQWRkZWRcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqL1xuICBwdWJsaWMgb25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBkZWZpbmUsIGlmIHRoZSBhbnN3ZXIgb24gdGhlIHF1ZXN0aW9uIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIG9uIHdoaWNoIHlvdSBoYXZlIHRvIGRlY2lkZSBpZiB0aGUgYW5zd2VyIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBvcHRpb25zLnJlc3VsdCByZXR1cm4gdHJ1ZSwgaWYgdGhlIGFuc3dlciBpcyBjb3JyZWN0IG9yIGZhbHNlIGlmIHRoZSBhbnN3ZXIgaXMgbm90IGNvcnJlY3QuIFVzZSBxdWVzdGlvbnMgdmFsdWUgYW5kIGNvcnJlY3RBbnN3ZXIgcHJvcGVydGllcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAqIDxici8+IG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgLSB5b3UgbWF5IGNoYW5nZSB0aGUgZGVmYXVsdCBudW1iZXIgb2YgY29ycmVjdCBvciBpbmNvcnJlY3QgYW5zd2VycyBpbiB0aGUgcXVlc3Rpb24sIGZvciBleGFtcGxlIGZvciBtYXRyaXgsIHdoZXJlIGVhY2ggcm93IGlzIGEgcXVpeiBxdWVzdGlvbi5cbiAgICogQHNlZSBRdWVzdGlvbi52YWx1ZVxuICAgKiBAc2VlIFF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJcbiAgICovXG4gIHB1YmxpYyBvbklzQW5zd2VyQ29ycmVjdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY29udHJvbCBkcmFnJmRyb3Agb3BlcmF0aW9ucyBkdXJpbmcgZGVzaWduIG1vZGUuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvdyBzZXQgaXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBkcmFnZ2luZy5cbiAgICogPGJyLz4gb3B0aW9ucy50YXJnZXQgYSB0YXJnZXQgZWxlbWVudCB0aGF0IGlzIGRyYWdnaW5nLlxuICAgKiA8YnIvPiBvcHRpb25zLnNvdXJjZSBhIHNvdXJjZSBlbGVtZW50LiBJdCBjYW4gYmUgbnVsbCwgaWYgaXQgaXMgYSBuZXcgZWxlbWVudCwgZHJhZ2dpbmcgZnJvbSB0b29sYm94LlxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudCBhIHBhZ2Ugb3IgcGFuZWwgd2hlcmUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuXG4gICAqIDxici8+IG9wdGlvbnMuaW5zZXJ0QmVmb3JlIGFuIGVsZW1lbnQgYmVmb3JlIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBkcmFnZ2luZy4gSXQgY2FuIGJlIG51bGwgaWYgcGFyZW50IGNvbnRhaW5lciAocGFnZSBvciBwYW5lbCkgaXMgZW1wdHkgb3IgZHJhZ2dpbmcgYW4gZWxlbWVudCB1bmRlciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjb250YWluZXIuXG4gICAqIDxici8+IG9wdGlvbnMuaW5zZXJ0QWZ0ZXIgYW4gZWxlbWVudCBhZnRlciB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuIEl0IGNhbiBiZSBudWxsIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGVsZW1lbnQgdG8gdGhlIHRvcCBvZiB0aGUgcGFyZW50IGNvbnRhaW5lci5cbiAgICogQHNlZSBzZXREZXNpZ25Nb2RlXG4gICAqIEBzZWUgaXNEZXNpZ25Nb2RlXG4gICAqL1xuICBwdWJsaWMgb25EcmFnRHJvcEFsbG93OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlcnJvcnMgb24gbG9hZGluZyBzdXJ2ZXkganNvbi4gSWYgdGhlIGxpc3QgaXMgZW1wdHkgYWZ0ZXIgbG9hZGluZyBhIGpzb24gdGhlbiB0aGUganNvbiBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBubyBlcnJvcnMgaW4gaXQuXG4gICAqIEBzZWUgSnNvbkVycm9yXG4gICAqL1xuICBwdWJsaWMganNvbkVycm9yczogQXJyYXk8SnNvbkVycm9yPiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFN1cnZleU1vZGVsLnN0eWxlc01hbmFnZXIgPSBuZXcgU3R5bGVzTWFuYWdlcigpO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwic3RhcnRTdXJ2ZXlcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VQcmV2XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYWdlTmV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCB0aGlzLCB0cnVlKTtcblxuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICApIHtcbiAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLnBhZ2VzVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicGFnZXNcIiwgZnVuY3Rpb24odmFsdWU6IGFueSkge1xuICAgICAgc2VsZi5kb09uUGFnZUFkZGVkKHZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidHJpZ2dlcnNcIiwgZnVuY3Rpb24odmFsdWU6IGFueSkge1xuICAgICAgdmFsdWUuc2V0T3duZXIoc2VsZik7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImNhbGN1bGF0ZWRWYWx1ZXNcIiwgZnVuY3Rpb24odmFsdWU6IGFueSkge1xuICAgICAgdmFsdWUuc2V0T3duZXIoc2VsZik7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblwiLCBmdW5jdGlvbih2YWx1ZTogYW55KSB7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IHNlbGY7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcIm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblwiLCBmdW5jdGlvbih2YWx1ZTogYW55KSB7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IHNlbGY7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcImZpcnN0UGFnZUlzU3RhcnRlZFwiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25GaXJzdFBhZ2VJc1N0YXJ0ZWRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwibW9kZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Nb2RlQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVDcmVhdGluZygpO1xuICAgIGlmIChqc29uT2JqKSB7XG4gICAgICBpZiAodHlwZW9mIGpzb25PYmogPT09IFwic3RyaW5nXCIgfHwganNvbk9iaiBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uT2JqIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqLmNsaWVudElkKSB7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBqc29uT2JqLmNsaWVudElkO1xuICAgICAgfVxuICAgICAgdGhpcy5mcm9tSlNPTihqc29uT2JqKTtcbiAgICAgIGlmICh0aGlzLnN1cnZleUlkKSB7XG4gICAgICAgIHRoaXMubG9hZFN1cnZleUZyb21TZXJ2aWNlKHRoaXMuc3VydmV5SWQsIHRoaXMuY2xpZW50SWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInN1cnZleVwiO1xuICB9XG4gIHByb3RlY3RlZCBvblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmIChuYW1lID09PSBcInF1ZXN0aW9uc09uUGFnZU1vZGVcIikge1xuICAgICAgdGhpcy5vblF1ZXN0aW9uc09uUGFnZU1vZGVDaGFuZ2VkKG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgYWxsIHBhZ2VzIGluIHRoZSBzdXJ2ZXksIGluY2x1ZGluZyBpbnZpc2libGUuXG4gICAqIEBzZWUgUGFnZU1vZGVsXG4gICAqIEBzZWUgdmlzaWJsZVBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldENzcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNzcztcbiAgfVxuICBwcml2YXRlIGNzc1ZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkge1xuICAgIGlmICghdGhpcy5jc3NWYWx1ZSkge1xuICAgICAgdGhpcy5jc3NWYWx1ZSA9IHt9O1xuICAgICAgdGhpcy5jb3B5Q3NzQ2xhc3Nlcyh0aGlzLmNzc1ZhbHVlLCBzdXJ2ZXlDc3MuZ2V0Q3NzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jc3NWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNzcyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5tZXJnZVZhbHVlcyh2YWx1ZSwgdGhpcy5jc3MpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiB0cmlnZ2VycyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIFN1cnZleVRyaWdnZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJpZ2dlcnMoKTogQXJyYXk8U3VydmV5VHJpZ2dlcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRyaWdnZXJzKHZhbDogQXJyYXk8U3VydmV5VHJpZ2dlcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBjYWxjdWxhdGVkIHZhbHVlcyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIENhbGN1bGF0ZWRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjYWxjdWxhdGVkVmFsdWVzKCk6IEFycmF5PENhbGN1bGF0ZWRWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjYWxjdWxhdGVkVmFsdWVzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2FsY3VsYXRlZFZhbHVlcyh2YWw6IEFycmF5PENhbGN1bGF0ZWRWYWx1ZT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjYWxjdWxhdGVkVmFsdWVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBzdXJ2ZXkgSnNvbiBmcm9tIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIGxvYWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleUlkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBzYXZlIHRoZSBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlTaG93RGF0YVNhdmluZ1xuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlQb3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5UG9zdElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IGFzIGluZGVudGlmaWNhdG9yIGZvciBhIHVzZXIsIGZvciBleGFtcGxlIGUtbWFpbCBvciB1bmlxdWUgY3VzdG9tZXIgaWQgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uIElmIHlvdSBhcmUgbG9hZGluZyBzdXJ2ZXkgb3IgcG9zdGluZyBzdXJ2ZXkgcmVzdWx0cyAgZnJvbS90byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSwgdGhlbiB0aGUgbGlicmFyeSBkbyBub3QgYWxsb3cgdG8gcnVuIHRoZSBzYW1lIHN1cnZleSB0aGUgc2Vjb25kIHRpbWUuIE9uIHRoZSBzZWNvbmQgcnVuLCB0aGUgdXNlciB3aWxsIHNlZSB0aGUgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2xpZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xpZW50SWRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjbGllbnRJZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsaWVudElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW1wdHksIGJlZm9yZSBzdGFydGluZyB0byBydW4gdGhlIHN1cnZleSwgdGhlIGxpYnJhcnkgY2hlY2tlcyBpZiB0aGUgY29va2llIHdpdGggdGhpcyBuYW1lIGV4aXN0cy4gSWYgaXQgaXMgdHJ1ZSwgdGhlIHN1cnZleSBnb2VzIHRvIGNvbXBsZXRlIG1vZGUgYW5kIGFuIHVzZXIgc2VlcyB0aGUgJ1RoYW5rIHlvdScgcGFnZS4gT24gY29tcGxldGluZyB0aGUgc3VydmV5IHRoZSBjb29raWUgd2l0aCB0aGlzIG5hbWUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29va2llTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29va2llTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvb2tpZU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNhdmUgcmVzdWx0cyBvbiBjb21wbGV0aW5nIGV2ZXJ5IHBhZ2UuIG9uUGFydGlhbFNlbmQgZXZlbnQgaXMgZmlyZWQuXG4gICAqIEBzZWUgb25QYXJ0aWFsU2VuZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbmRSZXN1bHRPblBhZ2VOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzZW5kUmVzdWx0T25QYWdlTmV4dCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBwcm9ncmVzcyBvbiBzYXZpbmcvc2VuZGluZyBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlTaG93RGF0YVNhdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogT24gc2hvd2luZyB0aGUgbmV4dCBvciBwcmV2aW91cyBwYWdlLCBhIGZpcnN0IGlucHV0IGlzIGZvY3VzZWQsIGlmIHRoZSBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIChkZWZhdWx0IHZhbHVlIGlzIHRydWUpIGlmIHlvdSBkbyBub3Qgd2FudCB0byBicmluZyB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgaGFzIGVycm9yIG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb2N1c09uRmlyc3RFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNPbkZpcnN0RXJyb3JcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c09uRmlyc3RFcnJvcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJmb2N1c09uRmlyc3RFcnJvclwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6ICdib3R0b20nIChkZWZhdWx0KSwgJ3RvcCcsICdib3RoJyBhbmQgJ25vbmUnLiBTZXQgaXQgdG8gJ25vbmUnIHRvIGhpZGUgJ1ByZXYnLCAnTmV4dCcgYW5kICdDb21wbGV0ZScgYnV0dG9ucy4gSXQgbWFrZXMgc2Vuc2UgaWYgeW91IGFyZSBnb2luZyB0byBjcmVhdGUgYSBjdXN0b20gbmF2aWdhdGlvbiBvciBoYXZlIGp1c3Qgb25lIHBhZ2Ugb3Igb24gc2V0dGluZyBnb05leHRQYWdlQXV0b21hdGljIHByb3BlcnR5LlxuICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICogQHNlZSBzaG93UHJldkJ1dHRvblxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TmF2aWdhdGlvbkJ1dHRvbnMoKTogc3RyaW5nIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKHZhbDogc3RyaW5nIHwgYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsID0gXCJib3R0b21cIjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbCA9IFwibm9uZVwiO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdQcmV2JyB0byBkaXNhYmxlIGZvciBlbmQtdXNlcnMgZ28gYmFjayB0byB0aGVpciBhbnN3ZXJzLlxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBzaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZCdXR0b25cIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJldkJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldkJ1dHRvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaGlkZSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSB0byBoaWRlIHBhZ2UgdGl0bGVzLlxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UGFnZVRpdGxlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VUaXRsZXNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UGFnZVRpdGxlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBPbiBmaW5pc2hpbmcgdGhlIHN1cnZleSB0aGUgJ1RoYW5rIHlvdScsIHBhZ2Ugb24gY29tcGxldGUsIGlzIHNob3duLiBTZXQgdGhlIHByb3BlcnR5IHRvIGZhbHNlLCB0byBoaWRlIHRoZSAnVGhhbmsgeW91JyBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93Q29tcGxldGVkUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93Q29tcGxldGVkUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhIHVybCB5b3Ugd2FudCB0byBuYXZpZ2F0ZSBhZnRlciBhIHVzZXIgY29tcGxldGluZyB0aGUgc3VydmV5XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hdmlnYXRlVG9VcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGVUb1VybFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hdmlnYXRlVG9VcmwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0ZVRvVXJsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHVybCBjb25kaXRpb24gaXRlbXMuIElmIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgaXRlbSByZXR1cm5zIHRydWUsIHRoZW4gc3VydmV5IHdpbGwgbmF2aWdhdGUgdG8gaXRlbSB1cmxcbiAgICogQHNlZSBVcmxDb25kaXRpb25JdGVtXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb24oKTogQXJyYXk8VXJsQ29uZGl0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb24odmFsOiBBcnJheTxVcmxDb25kaXRpb25JdGVtPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblwiLCB2YWwpO1xuICB9XG5cbiAgcHVibGljIGdldE5hdmlnYXRlVG9VcmwoKTogc3RyaW5nIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0RXhwcmVzc2lvbkl0ZW1PblJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMubmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXG4gICAgKTtcbiAgICB2YXIgdXJsID0gISFpdGVtID8gKDxVcmxDb25kaXRpb25JdGVtPml0ZW0pLnVybCA6IHRoaXMubmF2aWdhdGVUb1VybDtcbiAgICBpZiAoISF1cmwpIHtcbiAgICAgIHVybCA9IHRoaXMucHJvY2Vzc1RleHQodXJsLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBwcml2YXRlIG5hdmlnYXRlVG8oKSB7XG4gICAgdmFyIHVybCA9IHRoaXMuZ2V0TmF2aWdhdGVUb1VybCgpO1xuICAgIHZhciBvcHRpb25zID0geyB1cmw6IHVybCB9O1xuICAgIHRoaXMub25OYXZpZ2F0ZVRvVXJsLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnVybCB8fCAhd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHJldHVybjtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG9wdGlvbnMudXJsO1xuICB9XG4gIC8qKlxuICAgKiBBIGNoYXIvc3RyaW5nIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbiB0aGUgdGl0bGUgcmVxdWlyZWQgcXVlc3Rpb25zLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZFRleHRcIiwgXCIqXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gbWFrZSBhbGwgcmVxdXJpZWQgZXJyb3JzIGludmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGhpZGVSZXF1aXJlZEVycm9yczogYm9vbGVhbiA9IGZhbHNlO1xuICBiZWZvcmVTZXR0aW5nUXVlc3Rpb25FcnJvcnMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPlxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oaWRlUmVxdWlyZWRFcnJvcnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlcnJvcnNbaV0uZ2V0RXJyb3JUeXBlKCkgPT0gXCJyZXF1aXJlZFwiKSB7XG4gICAgICAgICAgZXJyb3JzW2ldLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uU2V0dGluZ1F1ZXN0aW9uRXJyb3JzLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgZXJyb3JzOiBlcnJvcnNcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgZmlyc3QgcXVlc3Rpb24gaW5kZXggaXMgMS4gWW91IG1heSBzdGFydCBpdCBmcm9tIDEwMCBvciBmcm9tICdBJywgYnkgc2V0dGluZyAxMDAgb3IgJ0EnIHRvIHRoaXMgcHJvcGVydHkuXG4gICAqIEBzZWUgUXVlc3Rpb24udGl0bGVcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uU3RhcnRJbmRleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBlbnRlcmVkIHRleHQgaW4gdGhlIG90aGVycyBpbnB1dCBpbiB0aGUgY2hlY2tib3gvcmFkaW9ncm91cC9kcm9wZG93biBhcmUgc3RvcmVkIGFzIFwicXVlc3Rpb24gbmFtZSBcIiArIFwiLUNvbW1lbnRcIi4gVGhlIHZhbHVlIGl0c2VsZiBpcyBcInF1ZXN0aW9uIG5hbWVcIjogXCJvdGhlcnNcIi4gU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIHN0b3JlIHRoZSBlbnRlcmVkIHRleHQgZGlyZWN0bHkgaW4gdGhlIFwicXVlc3Rpb24gbmFtZVwiIGtleS5cbiAgICogQHNlZSBjb21tZW50UHJlZml4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIGZvciBxdWVzdGlvbnMgbGlrZSB0ZXh0IGFuZCBjb21tZW50LCBpbmNsdWRpbmcgbWF0cml4IGNlbGwgcXVlc3Rpb25zLlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBpdCBpcyB1bmxpbWl0ZWQgbWF4TGVuZ3RoIC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcFxuICAgKiBAc2VlIG1heE90aGVyc0xlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUZXh0TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRleHRMZW5ndGhcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUZXh0TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGV4dExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBmb3IgcXVlc3Rpb24gY29tbWVudHMgYW5kIG90aGVyc1xuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBpdCBpcyB1bmxpbWl0ZWQgbWF4TGVuZ3RoIC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcFxuICAgKiBAc2VlIFF1ZXN0aW9uLmhhc0NvbW1lbnRcbiAgICogQHNlZSBRdWVzdGlvbi5oYXNPdGhlclxuICAgKiBAc2VlIG1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4T3RoZXJzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heE90aGVyc0xlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGlmIHlvdSB3YW50IHRvIGdvIHRvIHRoZSBuZXh0IHBhZ2Ugd2l0aG91dCBwcmVzc2luZyAnTmV4dCcgYnV0dG9uIHdoZW4gYWxsIHF1ZXN0aW9ucyBhcmUgYW53ZXJlZC5cbiAgICogdHJ1ZSAtIGdvIG5leHQgcGFnZSBhbmQgc3VibWl0IGF1dG9tYXRpY2FsbHlcbiAgICogXCJhdXRvZ29uZXh0XCIgLSBnbyBuZXh0IHBhZ2UgYXV0b21hdGljYWxseSBidXQgZG8gbm90IHN1Ym1pdFxuICAgKiBmYWxzZSAtIGRvIG5vdCBnbyBuZXh0IHBhZ2UgYW5kIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseVxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBnb05leHRQYWdlQXV0b21hdGljKCk6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ29OZXh0UGFnZUF1dG9tYXRpYyh2YWw6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzdWJtaXQgc3VydmV5IGF1dG9tYXRpY2FsbHkgaWYgZ29OZXh0UGFnZUF1dG9tYXRpYz10cnVlLlxuICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dDb21wbGV0ZVN1cnZleUF1dG9tYXRpYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dDb21wbGV0ZVN1cnZleUF1dG9tYXRpY1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dDb21wbGV0ZVN1cnZleUF1dG9tYXRpY1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhpcyBwcm9wZXJ0eSBmcm9tICdvbk5leHRQYWdlJyB0byAnb25WYWx1ZUNoYW5nZWQnIHRvIGNoZWNrIGVyb3JycyBvbiBldmVyeSBxdWVzdGlvbiB2YWx1ZSBjaGFuZ2luZyxcbiAgICogb3IgY2hhbmdlIGl0IHRvICdvbkNvbXBsZXRlJyB0byB2YWxpZGF0ZSBhbGwgdmlzaWJsZSBxdWVzdGlvbnMgb24gY29tcGxldGUgYnV0dG9uLiBJZiB0aGVyZSBpcyB0aGUgZXJyb3Igb24gc29tZSBwYWdlcyxcbiAgICogdGhlbiB0aGUgcGFnZSB3aXRoIHRoZSBmaXJzdCBlcnJvciBiZWNvbWVzIHRoZSBjdXJyZW50LlxuICAgKiBCeSBkZWZhdWx0LCBsaWJyYXJ5IGNoZWNrcyBlcnJvcnMgb24gY2hhbmdpbmcgY3VycmVudCBwYWdlIHRvIHRoZSBuZXh0IG9yIG9uIGNvbXBsZXRpbmcgdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hlY2tFcnJvcnNNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNoZWNrRXJyb3JzTW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoZWNrRXJyb3JzTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNoZWNrRXJyb3JzTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhpcyBwcm9wZXJ0eSBmcm9tICdvbkJsdXInIHRvICdvblR5cGluZycgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvZiB0ZXh0IHF1ZXN0aW9ucywgXCJ0ZXh0XCIgYW5kIFwiY29tbWVudFwiLFxuICAgKiBvbiBldmVyeSBrZXkgcHJlc3MuIEJ5IGRlZmF1bHQsIHRoZSB2YWx1ZSBpcyB1cGRhdGVkIGFuIGlucHV0IGxvc3RzIHRoZSBmb2N1cy5cbiAgICogUGxlYXNlIG5vdGUsIHNldHRpbmcgdG8gXCJvblR5cGluZ1wiIG1heSBsZWFkIHRvIGEgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24sIGluIGNhc2UgeW91IGhhdmUgbWFueSBleHByZXNzaW9ucyBpbiB0aGUgc3VydmV5XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRleHRVcGRhdGVNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRleHRVcGRhdGVNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dFVwZGF0ZU1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0ZXh0VXBkYXRlTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gJ25vbmUnIHRvIGluY2x1ZGUgdGhlIGludmlzaWJsZSB2YWx1ZXMgaW50byB0aGUgc3VydmV5IGRhdGEuXG4gICAqIDwvYnI+IFNldCBpdCB0byAnb25IaWRkZW4nIHRvIGNsZWFyIHRoZSBxdWVzdGlvbiB2YWx1ZSB3aGVuIGl0IGJlY29tZXMgaW52aXNpYmxlLiBJZiBhIHF1ZXN0aW9uIGhhcyB2YWx1ZSBhbmQgaXQgd2FzIGludmlzaWJsZSBpbml0aWFsbHkgdGhlbiBzdXJ2ZXkgY2xlYXJzIHRoZSB2YWx1ZSBvbiBjb21wbGV0aW5nLlxuICAgKiA8L2JyPiBMZWF2ZSBpdCBlcXVhbHMgdG8gJ29uQ29tcGxldGUnLCB0byByZW1vdmUgZnJvbSBkYXRhIHByb3BlcnR5IHZhbHVlcyBvZiBpbnZpc2libGUgcXVlc3Rpb25zIG9uIHN1cnZleSBjb21wbGV0ZS4gSW4gdGhpcyBjYXNlLCB0aGUgaW52aXNpYmxlIHF1ZXN0aW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgb24gdGhlIHNlcnZlci5cbiAgICogPC9icj4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ29uQ29tcGxldGUnLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2libGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsZWFySW52aXNpYmxlVmFsdWVzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xlYXJJbnZpc2libGVWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcIm9uQ29tcGxldGVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJub25lXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbGwgcXVlc3Rpb24gdmFsdWVzIGZyb20gdGhlIHN1cnZleSwgdGhhdCBlbmQtdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyLlxuICAgKiBGb3IgZXhhbXBsZSB0aGUgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0cyBpbiBhIHJhZGlncm91cC9kcm9wZG93bi9jaGVja2JveCBjaG9pY2VzIG9yIG1hdHJpeCByb3dzL2NvbHVtbnMuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2xlYXIgdmFsdWVzIGZvciBpbnZpc2libGUgcXVlc3Rpb25zIG9yIHZhbHVlcyB0aGF0IGRvZXNuJ3QgYXNzb2NpYXRlZCB3aXRoIHF1ZXN0aW9ucy5cbiAgICogSW4gZmFjdCB0aGlzIGZ1bmN0aW9uIGp1c3QgY2FsbCBjbGVhckluY29ycmVjdFZhbHVlcyBmdW5jdGlvbiBvZiBhbGwgcXVlc3Rpb25zIGluIHRoZSBzdXJ2ZXJ5XG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICogQHNlZSBQYWdlLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqIEBzZWUgUGFuZWwuY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlIGl0IHRvIGNoYW5nZSB0aGUgc3VydmV5IGxvY2FsZS4gQnkgZGVmYXVsdCBpdCBpcyBlbXB0eSwgJ2VuJy4gWW91IG1heSBzZXQgaXQgdG8gJ2RlJyAtIGdlcm1hbiwgJ2ZyJyAtIGZyZW5jaCBhbmQgc28gb24uIFRoZSBsaWJyYXJ5IGhhcyBidWlsdC1pbiBsb2NhbGl6YXRpb24gZm9yIHNldmVyYWwgbGFuZ3VhZ2VzLiBUaGUgbGlicmFyeSBoYXMgYSBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0IGFzIHdlbGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhY2hlID0gdW5kZWZpbmVkO1xuICAgIHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdmFsdWU7XG4gICAgdGhpcy5sb2NhbGVWYWx1ZSA9IHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvY2FsZVwiLCB0aGlzLmxvY2FsZVZhbHVlKTtcbiAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBhcnJheSBvZiBsb2NhbGVzIHRoYXQgdXNlZCBpbiB0aGUgY3VycmVudCBzdXJ2ZXlcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VkTG9jYWxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgbG9jcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgdGhpcy5hZGRVc2VkTG9jYWxlcyhsb2NzKTtcbiAgICAvL1JlcGxhY2UgdGhlIGRlZmF1bHQgbG9jYWxlIHdpdGggdGhlIHJlYWwgb25lXG4gICAgdmFyIGluZGV4ID0gbG9jcy5pbmRleE9mKFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdmFyIGRlZmF1bHRMb2MgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZTtcbiAgICAgIC8vUmVtb3ZlIHRoZSBkZWZhdWx0TG9jXG4gICAgICB2YXIgZGVmSW5kZXggPSBsb2NzLmluZGV4T2YoZGVmYXVsdExvYyk7XG4gICAgICBpZiAoZGVmSW5kZXggPiAtMSkge1xuICAgICAgICBsb2NzLnNwbGljZShkZWZJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpbmRleCA9IGxvY3MuaW5kZXhPZihcImRlZmF1bHRcIik7XG4gICAgICBsb2NzW2luZGV4XSA9IGRlZmF1bHRMb2M7XG4gICAgfVxuICAgIHJldHVybiBsb2NzO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvY2FsZUNoYW5nZWQoKSB7fVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGdldExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGU7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0KTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKTtcbiAgfVxuICBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdGV4dDogdGV4dCwgbmFtZTogZXJyb3IuZ2V0RXJyb3JUeXBlKCksIGVycm9yOiBlcnJvciB9O1xuICAgIHRoaXMub25FcnJvckN1c3RvbVRleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgcmVuZGVycyB3aGVuIHRoZXJlIGlzIG5vIGFueSB2aXNpYmxlIHBhZ2UgYW5kIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBlbXB0eVN1cnZleVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJlbXB0eVN1cnZleVwiKTtcbiAgfVxuICAvKipcbiAgICogU3VydmV5IHRpdGxlLlxuICAgKiBAc2VlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpO1xuICB9XG4gIC8qKlxuICAgKiBTdXJ2ZXkgZGVzY3JpcHRpb24uIEl0IHNob3dzIHVuZGVyIHN1cnZleSB0aXRsZVxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0Rlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCB0aGF0IHNob3dzIG9uIGNvbXBsZXRlZCAoJ1RoYW5rIHlvdScpIHBhZ2UuIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBzaG93Q29tcGxldGVkUGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBjb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVkSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlZEh0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVkSHRtbFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlZEh0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaHRtbCBjb25kaXRpb24gaXRlbXMuIElmIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgaXRlbSByZXR1cm5zIHRydWUsIHRoZW4gc3VydmV5IHdpbGwgdXNlIHRoaXMgaXRlbSBodG1sIGluc3RlYWQgb2YgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIEh0bWxDb25kaXRpb25JdGVtXG4gICAqIEBzZWUgY29tcGxldGVIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbigpOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRIdG1sT25Db25kaXRpb24odmFsOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIHJlc3VsdCB2YWx1ZVxuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKi9cbiAgcHVibGljIHJ1bkV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblJ1bm5lcihleHByZXNzaW9uKS5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHRydWUgb3IgZmFsc2VcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25SdW5uZXIoZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0RXhwcmVzc2lvbkl0ZW1PblJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gISFpdGVtID8gKDxIdG1sQ29uZGl0aW9uSXRlbT5pdGVtKS5odG1sIDogdGhpcy5jb21wbGV0ZWRIdG1sO1xuICB9XG4gIHByaXZhdGUgZ2V0RXhwcmVzc2lvbkl0ZW1PblJ1bkNvbmRpdGlvbihcbiAgICBpdGVtczogQXJyYXk8RXhwcmVzc2lvbkl0ZW0+XG4gICk6IEV4cHJlc3Npb25JdGVtIHtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpdGVtc1tpXS5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKSkge1xuICAgICAgICByZXR1cm4gaXRlbXNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3MgaWYgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEJlZm9yZUh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkQmVmb3JlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgc3VydmV5IEpzb24gZnJvbSB0aGUgZHhzdXJ2ZXkuY29tIHNlcnZpY2UuXG4gICAqIEBzZWUgc3VydmV5SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvYWRpbmdIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jTG9hZGluZ0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgdGV4dCB0aGF0IHJlbmRlcnMgb24gdGhlICdTdGFydCcgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIFRoZSBzdGFydCBidXR0b24gaXMgc2hvd24gb24gdGhlIHN0YXJ0ZWQgcGFnZS4gWW91IGhhdmUgdG8gc2V0IGZpcnN0UGFnZUlzU3RhcnRlZCBwcm9wZXJ0eSB0byB0cnVlLCB0byBoYXZlIHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwic3RhcnRTdXJ2ZXlcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwic3RhcnRTdXJ2ZXlUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0U3VydmV5VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJzdGFydFN1cnZleVwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1N0YXJ0U3VydmV5VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJzdGFydFN1cnZleVwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ1ByZXYnIGJ1dHRvbi4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlUHJldlRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhZ2VQcmV2XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VQcmV2VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlUHJldlRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZVByZXZcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NQYWdlUHJldlRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFnZVByZXZcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgdGV4dCB0aGF0IHJlbmRlcnMgb24gdGhlICdOZXh0JyBidXR0b24uIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZU5leHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYWdlTmV4dFwiLFxuICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXCJwYWdlTmV4dFRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZU5leHRUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhZ2VOZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFnZU5leHRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VOZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBBIHRleHQgdGhhdCByZW5kZXJzIG9uIHRoZSAnQ29tcGxldGUnIGJ1dHRvbi4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBjb21wbGV0ZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbXBsZXRlXCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcImNvbXBsZXRlVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZVRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NDb21wbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgdGVtcGxhdGUgZm9yIGEgcXVlc3Rpb24gdGl0bGUuXG4gICAqIEBzZWUgUXVlc3Rpb25Nb2RlbC50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlVGVtcGxhdGUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghIXZhbHVlICYmIHZhbHVlLmluZGV4T2YoXCJ7bm99XCIpICE9PSAtMSkge1xuICAgICAgdmFyIG5vSW5kZXggPSB2YWx1ZS5pbmRleE9mKFwie25vfVwiKTtcbiAgICAgIHZhciBwcmV2QnJJbmRleCA9IG5vSW5kZXg7XG4gICAgICB2YXIgbmV4dEJySW5kZXggPSBub0luZGV4ICsgNDtcbiAgICAgIHdoaWxlIChwcmV2QnJJbmRleCA+PSAwICYmIHZhbHVlW3ByZXZCckluZGV4XSAhPT0gXCJ9XCIpIHByZXZCckluZGV4LS07XG4gICAgICB3aGlsZSAobmV4dEJySW5kZXggPCB2YWx1ZS5sZW5ndGggJiYgdmFsdWVbbmV4dEJySW5kZXhdICE9PSBcIntcIilcbiAgICAgICAgbmV4dEJySW5kZXgrKztcbiAgICAgIHZhbHVlID1cbiAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDAsIHByZXZCckluZGV4ICsgMSkgKyB2YWx1ZS5zdWJzdHJpbmcobmV4dEJySW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgcXVlc3Rpb24gdGl0bGUgdGVtcGxhdGVcbiAgICogQHNlZSBxdWVzdGlvblRpdGxlVGVtcGxhdGVcbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZSA9IHRoaXMubG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlLnRleHRPckh0bWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhY2hlO1xuICB9XG4gIGdldCBsb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIpO1xuICB9XG4gIGdldFVwZGF0ZWRRdWVzdGlvblRpdGxlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZS5pc0VtcHR5KSByZXR1cm4gdGl0bGU7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgdGl0bGU6IHRpdGxlIH07XG4gICAgdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGUuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50aXRsZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gdHVybiBvZmYgdGhlIG51bWJlcmluZyBvbiBwYWdlcyB0aXRsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQYWdlTnVtYmVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VOdW1iZXJzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQYWdlTnVtYmVycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5zaG93UGFnZU51bWJlcnMpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJvZmZcIiB0byB0dXJuIG9mZiB0aGUgbnVtYmVyaW5nIG9uIHF1ZXN0aW9ucyB0aXRsZXMgb3IgXCJvbnBhZ2VcIiB0byBzdGFydCBudW1iZXJpbmcgb24gZXZlcnkgcGFnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJvblwiLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gXCJvbnBhZ2VcIiA/IFwib25QYWdlXCIgOiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJ0b3BcIiB0byBzaG93IHRoZSBwcm9ncmVzcyBiYXIgb24gdGhlIGJvdHRvbSBvciB0byBcImJvdHRvbVwiIHRvIHNob3cgaXQgb24gdGhlIGJvdHRvbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1Byb2dyZXNzQmFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcm9ncmVzc0JhcihuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1Byb2dyZXNzQmFyXCIsIG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBUeXBlIG9mIGluZm8gaW4gdGhlIHByb2dyZXNzIGJhcjogXCJwYWdlc1wiIChkZWZhdWx0KSwgXCJxdWVzdGlvbnNcIiBvciBcImNvcnJlY3RRdWVzdGlvbnNcIi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NCYXJUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzQmFyVHlwZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByb2dyZXNzQmFyVHlwZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NCYXJUeXBlXCIsIG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwidG9wXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90dG9tXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0L2h0bWwgdGhhdCByZW5kZXJzIGFzIHN1cnZleSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAnYm90dG9tJyBvciAnbGVmdCcgdG8gc2hvdyBxdWVzdGlvbiB0aXRsZSB1bmRlciB0aGUgcXVlc3Rpb24gb3Igb24gdGhlIGxlZnQuXG4gICAqIDxici8+PGI+Tm90ZTo8L2I+IFNvbWUgcXVlc3Rpb25zLCBmb3IgZXhhbXBsZSBtYXRyaXhlcywgZG8gbm90IHN1cHBvcnQgJ2xlZnQnIHZhbHVlLiBUaGUgdGl0bGUgZm9yIHRoZW0gd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAnYm90dG9tJyB0byBzaG93IHF1ZXN0aW9uIGVycm9yKHMpIHVuZGVyIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uRXJyb3JMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAndW5kZXJJbnB1dCcgdG8gc2hvdyBxdWVzdGlvbiBkZXNjcmlwdGlvbiB1bmRlciB0aGUgcXVlc3Rpb24gaW5wdXQgaW5zdGVhZCBvZiBxdWVzdGlvbiB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgbW9kZSB0byAnZGlzcGxheScgdG8gbWFrZSB0aGUgc3VydmV5IHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ2VkaXQnLlxuICAgKi9cbiAgcHVibGljIGdldCBtb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlID09IHRoaXMubW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSAhPSBcImVkaXRcIiAmJiB2YWx1ZSAhPSBcImRpc3BsYXlcIikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIiwgdmFsdWUpO1xuICB9XG4gIHByaXZhdGUgb25Nb2RlQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgIHBhZ2Uuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgcGFnZS5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgc3VydmV5IHJlc3VsdHMvZGF0YS4gWW91IG1heSBzZXQgaXQgZGlyZWN0bHkgYXMgeyAncXVlc3Rpb24gbmFtZSc6IHF1ZXN0aW9uVmFsdWUsIC4uLiB9XG4gICAqIE5vdGU6IElmIHlvdSBhcmUgc2V0dGluZyB0aGUgZGF0YSBhZnRlciBjcmVhdGlnIHRoZSBzdXJ2ZXksIHlvdSBtYXkgbmVlZCB0byBzZXQgdGhlIGN1cnJlbnRQYWdlTm8gdG8gMCwgaWYgeW91IGFyZSB1c2luZyB2aXNpYmxlSWYgcHJvcGVydGllcyBmb3IgcXVlc3Rpb25zL3BhZ2VzL3BhbmVscyB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IHBhZ2UuXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxjdWxhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FsVmFsdWUgPSB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIGNhbFZhbHVlLmluY2x1ZGVJbnRvUmVzdWx0ICYmXG4gICAgICAgICEhY2FsVmFsdWUubmFtZSAmJlxuICAgICAgICB0aGlzLmdldFZhcmlhYmxlKGNhbFZhbHVlLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICByZXN1bHRbY2FsVmFsdWUubmFtZV0gPSB0aGlzLmdldFZhcmlhYmxlKGNhbFZhbHVlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YWx1ZXNIYXNoKSB7XG4gICAgICB2YXIgZGF0YVZhbHVlID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICAgIGlmIChkYXRhVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHN1cnZleSByZXN1bHQgZGF0YSBhcyBhbiBhcnJheSBvZiBwbGFpbiBvYmplY3RzOiB3aXRoIHF1ZXN0aW9uIHRpdGxlLCBuYW1lLCB2YWx1ZSBhbmQgZGlzcGxheVZhbHVlLlxuICAgKiBGb3IgY29tcGxleCBxdWVzdGlvbnMgKGxpa2UgbWF0cml4LCBldGMuKSBpc05vZGUgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBhbmQgZGF0YSBjb250YWlucyBhcnJheSBvZiBuZXN0ZWQgb2JqZWN0cyAocm93cylcbiAgICogc2V0IG9wdGlvbnMuaW5jbHVkZUVtcHR5IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIHNraXAgZW1wdHkgYW5zd2Vyc1xuICAgKi9cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIHZhciByZXN1bHQ6IEFycmF5PGFueT4gPSBbXTtcbiAgICB0aGlzLmdldEFsbFF1ZXN0aW9ucygpLmZvckVhY2gocXVlc3Rpb24gPT4ge1xuICAgICAgdmFyIHJlc3VsdEl0ZW0gPSAoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgICBpZiAoISFyZXN1bHRJdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25WZXJzaW9uID0gMDtcbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YXJpYWJsZXNIYXNoKSB2YWx1ZXNba2V5XSA9IHRoaXMudmFyaWFibGVzSGFzaFtrZXldO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpXG4gICAgICB2YWx1ZXNba2V5XSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGtleSk7XG4gICAgdmFsdWVzW1wiY29uZGl0aW9uVmVyc2lvblwiXSA9ICsrdGhpcy5jb25kaXRpb25WZXJzaW9uO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzIH07XG4gIH1cblxuICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXNIYXNoID0ge307XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGtleSwgZGF0YVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVBbGxRdWVzdGlvbnNWYWx1ZSgpO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIHB1YmxpYyBnZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdmFsdWVzSGFzaFtrZXldO1xuICB9XG4gIHB1YmxpYyBzZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YWx1ZXNIYXNoW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZGVsZXRlRGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHZhbHVlc0hhc2hba2V5XTtcbiAgfVxuICAvLyBwcm90ZWN0ZWQgaXRlcmF0ZURhdGFWYWx1ZXNIYXNoKGZ1bmM6IChoYXNoOiBhbnksIGtleTogYW55KSA9PiB2b2lkKSB7XG4gIC8vICAgdmFyIGtleXM6IGFueVtdID0gW107XG4gIC8vICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzSGFzaCkge1xuICAvLyAgICAga2V5cy5wdXNoKGtleSk7XG4gIC8vICAgfVxuICAvLyAgIGtleXMuZm9yRWFjaChrZXkgPT4gZnVuYyh0aGlzLnZhbHVlc0hhc2gsIGtleSkpO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIGRhdGEuXG4gICAqIEBzZWUgZGF0YVxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50cygpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLmNvbW1lbnRQcmVmaXgpID4gMCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmlzaWJsZSBwYWdlcy4gSWYgYWxsIHBhZ2VzIGFyZSB2aXNpYmxlIHRoZW4gaXQgaXMgdGhlIHNhbWUgYXMgcGFnZXMgcHJvcGVydHkuXG4gICAqIEBzZWUgcGFnZXNcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucGFnZXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYWdlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBhbnkgcGFnZSBpbiB0aGUgc3VydmV5LiBUaGUgc3VydmV5IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmxlbmd0aCA9PSAwO1xuICB9XG4gIC8qKlxuICAgKiBkZXByaWNhdGVkLCBtaXNzcGVsbGluZywgdXNlIHBhZ2VDb3VudCBwcm9wZXJ0eVxuICAgKi9cbiAgZ2V0IFBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2VDb3VudDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IHBhZ2VzIGNvdW50LlxuICAgKiBAc2VlIHZpc2libGVQYWdlQ291bnRcbiAgICogQHNlZSBwYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1cnZleSB2aXNpYmxlIHBhZ2VzIGNvdW50XG4gICAqIEBzZWUgcGFnZUNvdW50XG4gICAqIEBzZWUgdmlzaWJsZVBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVQYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIFBhZ2UuIGZpcnN0UGFnZUlzU3RhcnRlZCBwcm9wZXJ0eSBzaG91bGQgYmUgZXF1YWxzIHRvIHRydWVcbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRlZFBhZ2UoKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgcGFnZSA9XG4gICAgICB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCAmJiB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLnBhZ2VzWzBdIDogbnVsbDtcbiAgICBpZiAoISFwYWdlKSB7XG4gICAgICBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IHBhZ2UuIElmIHN1cnZleSBpcyByZW5kcmVkIHRoZW4gaXQgaXMgYSBwYWdlIHRoYXQgYSB1c2VyIGNhbiBzZWUvZWRpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogYW55IHtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAodlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKSA8IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPT0gbnVsbCAmJiB2UGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgbmV3UGFnZSA9IHRoaXMuZ2V0UGFnZUJ5T2JqZWN0KHZhbHVlKTtcbiAgICBpZiAoISF2YWx1ZSAmJiAhbmV3UGFnZSkgcmV0dXJuO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAobmV3UGFnZSAhPSBudWxsICYmIHZQYWdlcy5pbmRleE9mKG5ld1BhZ2UpIDwgMCkgcmV0dXJuO1xuICAgIGlmIChuZXdQYWdlID09IHRoaXMuY3VycmVudFBhZ2VWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2VDaGFuZ2luZyhuZXdQYWdlLCBvbGRWYWx1ZSkpIHJldHVybjtcbiAgICBpZiAoISFuZXdQYWdlKSB7XG4gICAgICBuZXdQYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZVZhbHVlID0gbmV3UGFnZTtcbiAgICBpZiAoISFuZXdQYWdlKSB7XG4gICAgICBuZXdQYWdlLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICAgIG5ld1BhZ2Uuc2V0V2FzU2hvd24odHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlQ2hhbmdlZChuZXdQYWdlLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYWdlQnlPYmplY3QodmFsdWU6IGFueSk6IFBhZ2VNb2RlbCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHZhbHVlLmdldFR5cGUgJiYgdmFsdWUuZ2V0VHlwZSgpID09IFwicGFnZVwiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZylcbiAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeU5hbWUoU3RyaW5nKHZhbHVlKSk7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhciBpbmRleCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHZQYWdlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHZQYWdlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIHZpc2libGUgcGFnZXMgYXJyYXkuIEl0IHN0YXJ0cyBmcm9tIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlTm8oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlTm8odmFsdWU6IG51bWJlcikge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHZQYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW3ZhbHVlXTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gU2V0IGl0IHRvICdyYW5kb20nIHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMsICdpbml0aWFsJyB0byBrZWVwIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIuIFlvdSBjYW4gcmFuZG9taXplIHF1ZXN0aW9ucyBvbiBhIHNwZWNpZmljIHBhZ2UuXG4gICAqIEBzZWUgU3VydmV5UGFnZS5xdWVzdGlvbnNPcmRlclxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbnB1dCBmb2N1cyB0byB0aGUgZmlyc3QgcXVlc3Rpb24gd2l0aCB0aGUgaW5wdXQuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAocGFnZSkge1xuICAgICAgcGFnZS5zY3JvbGxUb1RvcCgpO1xuICAgICAgcGFnZS5mb2N1c0ZpcnN0UXVlc3Rpb24oKTtcbiAgICB9XG4gIH1cbiAgc2Nyb2xsVG9Ub3BPblBhZ2VDaGFuZ2UoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuO1xuICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICBpZiAodGhpcy5mb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWMpIHtcbiAgICAgIHBhZ2UuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1cnZleSBzdGF0ZTogJ2xvYWRpbmcnIC0gbG9hZGluZyBmcm9tIHRoZSBqc29uLCAnY29tcGxldGVkJyAtIGEgdXNlciBoYXMgY29tcGxldGVkIHRoZSBzdXJ2ZXksXG4gICAqICdzdGFydGluZycgLSB0aGUgc3RhcnRlZCBwYWdlIGlzIHNob3dpbmcsIHJ1bm5pbmcnIC0gYSB1c2VyIGFuc3dlcnMgYSBxdWVzdGlvbnMgcmlnaHQgbm93LCAnZW1wdHknIC0gdGhlcmUgaXMgbm90aGluZyB0byBzaG93IGluIHRoZSBjdXJyZW50IHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHJldHVybiBcImxvYWRpbmdcIjtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCkgcmV0dXJuIFwiY29tcGxldGVkXCI7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWRCZWZvcmUpIHJldHVybiBcImNvbXBsZXRlZGJlZm9yZVwiO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRGVzaWduTW9kZSAmJlxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICB0aGlzLmlzU3RhcnRlZFN0YXRlICYmXG4gICAgICB0aGlzLnN0YXJ0ZWRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuIFwic3RhcnRpbmdcIjtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA/IFwicnVubmluZ1wiIDogXCJlbXB0eVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzQ29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNDb21wbGV0ZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1N0YXJ0ZWRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTdGFydGVkU3RhdGVcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0IGlzU3RhcnRlZFN0YXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU3RhcnRlZFN0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNDb21wbGV0ZWRCZWZvcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQ29tcGxldGVkQmVmb3JlXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0NvbXBsZXRlZEJlZm9yZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZEJlZm9yZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0xvYWRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZFN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZTtcbiAgfVxuICBnZXQgY29tcGxldGVkU3RhdGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVUZXh0VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgaWYgKHZhbHVlID09IFwic2F2aW5nXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJlcnJvclwiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhRXJyb3JcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJzdWNjZXNzXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFTdWNjZXNzXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlID0gdGV4dDtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdGhlIHN1cnZleSBkYXRhIGFuZCBzdGF0ZS4gSWYgdGhlIHN1cnZleSBoYXMgYSAnY29tcGxldGVkJyBzdGF0ZSwgaXQgd2lsbCBoYXZlIGEgJ3J1bm5pbmcnIHN0YXRlLlxuICAgKiBAcGFyYW0gY2xlYXJEYXRhIGNsZWFyIHRoZSBkYXRhXG4gICAqIEBwYXJhbSBnb3RvRmlyc3RQYWdlIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYXMgYSBjdXJyZW50IHBhZ2UuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjbGVhckRhdGE6IGJvb2xlYW4gPSB0cnVlLCBnb3RvRmlyc3RQYWdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChjbGVhckRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnZhcmlhYmxlc0hhc2ggPSB7fTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS50aW1lU3BlbnQgPSAwO1xuICAgICAgdGhpcy5wYWdlc1tpXS5zZXRXYXNTaG93bihmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ29tcGxldGVkQmVmb3JlID0gZmFsc2U7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgaWYgKGdvdG9GaXJzdFBhZ2UgJiYgdGhpcy52aXNpYmxlUGFnZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMudmlzaWJsZVBhZ2VzWzBdO1xuICAgIH1cbiAgICBpZiAoY2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlc1dpdGhEZWZhdWx0cygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgbWVyZ2VWYWx1ZXMoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgIGlmICghZGVzdCB8fCAhc3JjKSByZXR1cm47XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgdmFyIHZhbHVlID0gc3JjW2tleV07XG4gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmICghZGVzdFtrZXldKSBkZXN0W2tleV0gPSB7fTtcbiAgICAgICAgdGhpcy5tZXJnZVZhbHVlcyh2YWx1ZSwgZGVzdFtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZhbHVlc1dpdGhEZWZhdWx0cygpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy5pc0xvYWRpbmcpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhZ2VzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tqXS51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VzdG9tV2lkZ2V0cyhwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICBwYWdlLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2VDaGFuZ2luZyhuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBvbGRDdXJyZW50UGFnZTogb2xkVmFsdWUsXG4gICAgICBuZXdDdXJyZW50UGFnZTogbmV3VmFsdWUsXG4gICAgICBhbGxvd0NoYW5naW5nOiB0cnVlXG4gICAgfTtcbiAgICB0aGlzLm9uQ3VycmVudFBhZ2VDaGFuZ2luZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93Q2hhbmdpbmc7XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRQYWdlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIG9sZEN1cnJlbnRQYWdlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld0N1cnJlbnRQYWdlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9ncmVzcyB0aGF0IGEgdXNlciBtYWRlIGJ5IGFuc3dlcmluZyBvbiB0aGUgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGdldFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJUeXBlID09PSBcInF1ZXN0aW9uc1wiKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICAgIHZhciBhbnN3ZXJlZFF1ZXN0aW9uc0NvdW50ID0gcXVlc3Rpb25zLnJlZHVjZShcbiAgICAgICAgKGE6IG51bWJlciwgYjogUXVlc3Rpb24pID0+IGEgKyAoYi5pc0VtcHR5KCkgPyAwIDogMSksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKChhbnN3ZXJlZFF1ZXN0aW9uc0NvdW50ICogMTAwKSAvIHF1ZXN0aW9ucy5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9ncmVzc0JhclR5cGUgPT09IFwiY29ycmVjdFF1ZXN0aW9uc1wiKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICAgIHZhciBjb3JyZWN0QW5zd2Vyc0NvdW50ID0gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCgoY29ycmVjdEFuc3dlcnNDb3VudCAqIDEwMCkgLyBxdWVzdGlvbnMubGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgoaW5kZXggKiAxMDApIC8gdGhpcy52aXNpYmxlUGFnZUNvdW50KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG5hdmlnYXRpb24gYnV0dG9uczogJ1ByZXYnLCAnTmV4dCcgb3IgJ0NvbXBsZXRlJyBhcmUgc2hvd24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gXCJub25lXCI7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIFwibm9uZVwiO1xuICAgIGlmIChwYWdlLm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSA9PT0gXCJzaG93XCIpIHtcbiAgICAgIHJldHVybiBcImJvdHRvbVwiO1xuICAgIH1cbiAgICBpZiAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgPT09IFwiaGlkZVwiKSB7XG4gICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dOYXZpZ2F0aW9uQnV0dG9ucztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGVkaXQgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImVkaXRcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGRpc3BsYXkgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGlzcGxheU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImRpc3BsYXlcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVXBkYXRlVmFsdWVUZXh0T25UeXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFVwZGF0ZU1vZGUgPT0gXCJvblR5cGluZ1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cnZleSBpbiB0aGUgZGVzaWduIG1vZGUuIEl0IGlzIHVzZWQgYnkgU3VydmV5SlMgRWRpdG9yXG4gICAqIEBzZWUgc2V0RGVzaWduTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzaWduTW9kZTtcbiAgfVxuICBwcml2YXRlIF9pc0Rlc2lnbk1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gc2V0IHRoZSBzdXJ2ZXkgaW50byB0aGUgZGVzaWduIG1vZGUuXG4gICAqIEBwYXJhbSB2YWx1ZSB1c2UgdHJ1ZSB0byBzZXQgdGhlIHN1cnZleSBpbnRvIHRoZSBkZXNpZ24gbW9kZS5cbiAgICovXG4gIHB1YmxpYyBzZXREZXNpZ25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZXNpZ25Nb2RlID0gdmFsdWU7XG4gICAgdGhpcy5vblF1ZXN0aW9uc09uUGFnZU1vZGVDaGFuZ2VkKFwic3RhbmRhcmRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgYWxsIGVsZW1lbnRzIGluIHRoZSBzdXJ2ZXksIHJlZ2FyZGxlc3MgdGhlaXIgdmlzaWJpbGl0eS4gSXQgaXMgZmFsc2UgYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SW52aXNpYmxlRWxlbWVudHNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKHZhbDogYm9vbGVhbikge1xuICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dJbnZpc2libGVFbGVtZW50c1wiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlQWxsRWxlbWVudHNWaXNpYmlsaXR5KHZpc1BhZ2VzKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUFsbEVsZW1lbnRzVmlzaWJpbGl0eSh2aXNQYWdlczogQXJyYXk8UGFnZU1vZGVsPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgcGFnZS51cGRhdGVFbGVtZW50VmlzaWJpbGl0eSgpO1xuICAgICAgaWYgKHZpc1BhZ2VzLmluZGV4T2YocGFnZSkgPiAtMSAhPSBwYWdlLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgdmlzaWJsZTogcGFnZS5pc1Zpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnNob3dJbnZpc2libGVFbGVtZW50cztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkgb24gdGhpcyBicm93c2VyIGFuZCB0aGVyZSBpcyBhIGNvb2tpZSBhYm91dCBpdC4gU3VydmV5IGdvZXMgdG8gJ2NvbXBsZXRlZCcgc3RhdGUgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqIEBzZWUgZGVsZXRlQ29va2llXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29va2llKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWU7XG4gICAgcmV0dXJuIGNvb2tpZXMgJiYgY29va2llcy5pbmRleE9mKHRoaXMuY29va2llTmFtZSArIFwiPXRydWVcIikgPiAtMTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBjb29raWUgd2l0aCBjb29raWVOYW1lIGluIHRoZSBicm93c2VyLiBJdCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgb24gc3VydmV5IGNvbXBsZXRlIGlmIGNvb2tpZU5hbWUgaXMgbm90IGVtcHR5LlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBoYXNDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICovXG4gIHB1YmxpYyBzZXRDb29raWUoKSB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUpIHJldHVybjtcbiAgICBkb2N1bWVudC5jb29raWUgPVxuICAgICAgdGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZTsgZXhwaXJlcz1GcmksIDMxIERlYyA5OTk5IDA6MDowIEdNVFwiO1xuICB9XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGNvb2tpZSB3aXRoIGNvb2tpZU5hbWUgaW4gdGhlIGJyb3dzZXIuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIHNldENvb2tpZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuY29va2llTmFtZSArIFwiPTtcIjtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGlnbm9yZSB2YWxpZGF0aW9uLCBsaWtlIHJlcXVyaWVkIHF1ZXN0aW9ucyBhbmQgb3RoZXJzLCBvbiBuZXh0UGFnZSBhbmQgY29tcGxldGVMYXN0UGFnZSBmdW5jdGlvbnMuXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIGlnbm9yZVZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZ28gdG8gdGhlIG5leHQgcGFnZS4gSXQgcmV0dXJucyBmYWxzZSwgaWYgaXQgaXMgdGhlIGxhc3QgcGFnZS4gSWYgdGhlcmUgaXMgYW4gZXJyb3IsIGZvciBleGFtcGxlIHJlcXVpcmVkIHF1ZXN0aW9uIGlzIGVtcHR5LCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBhcyB3ZWxsLlxuICAgKiBAc2VlIGlzQ3VycmVudFBhZ2VIYXNFcnJvcnNcbiAgICogQHNlZSBwcmV2UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICovXG4gIHB1YmxpYyBuZXh0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xhc3RQYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZG9DdXJyZW50UGFnZUNvbXBsZXRlKGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9yc09uTmF2aWdhdGUoZG9Db21wbGV0ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlnbm9yZVZhbGlkYXRpb24gfHwgIXRoaXMuaXNFZGl0TW9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PSBcIm9uQ29tcGxldGVcIikge1xuICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmhhc0Vycm9ycyh0cnVlLCB0cnVlKSkgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzQ3VycmVudFBhZ2VIYXNFcnJvcnMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaGVja0ZvckFzeW5jUXVlc3Rpb25WYWxpZGF0aW9uKGRvQ29tcGxldGUpO1xuICB9XG4gIHByaXZhdGUgYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zOiBBcnJheTxRdWVzdGlvbj47XG4gIHByaXZhdGUgY2hlY2tGb3JBc3luY1F1ZXN0aW9uVmFsaWRhdGlvbihkb0NvbXBsZXRlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jbGVhckFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucygpO1xuICAgIHZhciBxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uPiA9IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHtcbiAgICAgICAgcXVlc3Rpb25zW2ldLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gKGhhc0Vycm9yczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHRoaXMub25Db21wbGV0ZWRBc3luY1F1ZXN0aW9uVmFsaWRhdG9ycyhkb0NvbXBsZXRlLCBoYXNFcnJvcnMpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucy5wdXNoKHF1ZXN0aW9uc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucy5sZW5ndGggPiAwO1xuICB9XG4gIHByaXZhdGUgY2xlYXJBc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMoKSB7XG4gICAgaWYgKCEhdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMpIHtcbiAgICAgIHZhciBhc3luUXVlc3Rpb25zID0gdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzeW5RdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXN5blF1ZXN0aW9uc1tpXS5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zID0gW107XG4gIH1cbiAgcHJpdmF0ZSBvbkNvbXBsZXRlZEFzeW5jUXVlc3Rpb25WYWxpZGF0b3JzKFxuICAgIGRvQ29tcGxldGU6IGJvb2xlYW4sXG4gICAgaGFzRXJyb3JzOiBib29sZWFuXG4gICkge1xuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIHRoaXMuY2xlYXJBc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGFzeW5RdWVzdGlvbnMgPSB0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzeW5RdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhc3luUXVlc3Rpb25zW2ldLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGVDb3JlKGRvQ29tcGxldGUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZXJlIGlzIGFueSBlcnJvciBvbiB0aGUgY3VycmVudCBwYWdlLiBGb3IgZXhhbXBsZSwgdGhlIHJlcXVpcmVkIHF1ZXN0aW9uIGlzIGVtcHR5IG9yIGEgcXVlc3Rpb24gdmFsaWRhdGlvbiBpcyBmYWlsZWQuXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDdXJyZW50UGFnZUhhc0Vycm9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0lzQ3VycmVudFBhZ2VIYXNFcnJvcnMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbiBhbnkgdmlzaWJsZSBwYWdlXG4gICAqIEBwYXJhbSBmaXJlQ2FsbGJhY2sgc2V0IGl0IHRvIHRydWUsIHRvIHNob3cgZXJyb3JzIGluIFVJXG4gICAqIEBwYXJhbSBmb2N1c09uRmlyc3RFcnJvciBzZXQgaXQgdG8gdHJ1ZSB0byBmb2N1cyBvbiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBkb2Vzbid0IHBhc3MgdGhlIHZhbGlkYXRpb24gYW5kIG1ha2UgdGhlIHBhZ2UsIHdoZXJlIHF1ZXN0aW9uIGxvY2F0ZWQsIHRoZSBjdXJyZW50LlxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICBmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvY3VzT25GaXJzdEVycm9yOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdmFyIGZpcnN0RXJyb3JQYWdlID0gbnVsbDtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZpc1BhZ2VzW2ldLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIGZvY3VzT25GaXJzdEVycm9yKSkge1xuICAgICAgICBpZiAoIWZpcnN0RXJyb3JQYWdlKSBmaXJzdEVycm9yUGFnZSA9IHZpc1BhZ2VzW2ldO1xuICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm9jdXNPbkZpcnN0RXJyb3IgJiYgISFmaXJzdEVycm9yUGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGZpcnN0RXJyb3JQYWdlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBFbnN1cmUgdGhhdCBwYWdlcywgcGFuZWxzIGFuZCBxdWVzdGlvbnMgaGF2ZSB1bmlxdWUgcXVlc3Rpb24gbmFtZXMuXG4gICAqIFlvdSBtYXkgZW5zdXJlIHVuaXF1ZSBuYW1lcyBmb3IgaW5kaXZpZHVhbCBwYWdlIGFuZCBwYW5lbCAoYW5kIGFsbCB0aGVpciBlbGVtZW50cykgb3IgcXVlc3Rpb25cbiAgICogSWYgdGhlIHBhcmFtZXRlciBpcyB1bmRlcmZpbmVkIHRoZW4gc3VydmV5IGVuc3VyZSB0aGF0IGFsbCBpdHMgZWxlbWVudHMgYXJlIHVuaXF1ZS5cbiAgICogQHBhcmFtIGVsZW1lbnQgcGFnZSwgcGFuZWwgb3IgcXVlc3Rpb24sIGl0IGlzIG51bGwgYnkgZGVmYXVsdCwgdGhhdCBtZWFucyBhbGwgc3VydmV5IGVsZW1lbnRzIHdpbGwgYmUgY2hlY2tlZFxuICAgKi9cbiAgcHVibGljIGVuc3VyZVVuaXF1ZU5hbWVzKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50ID0gbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVuc3VyZVVuaXF1ZU5hbWUodGhpcy5wYWdlc1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlTmFtZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVOYW1lKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuaXNQYWdlKSB7XG4gICAgICB0aGlzLmVuc3VyZVVuaXF1ZVBhZ2VOYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB0aGlzLmVuc3VyZVVuaXF1ZVBhbmVsTmFtZShlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuaXNQYWdlIHx8IGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgdmFyIGVsZW1lbnRzID0gKDxJUGFuZWw+ZWxlbWVudCkuZWxlbWVudHM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlTmFtZXMoZWxlbWVudHNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuc3VyZVVuaXF1ZVF1ZXN0aW9uTmFtZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVQYWdlTmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUVsZW1lbnROYW1lKFxuICAgICAgZWxlbWVudCxcbiAgICAgIChuYW1lOiBzdHJpbmcpOiBJU3VydmV5RWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeU5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZVBhbmVsTmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUVsZW1lbnROYW1lKFxuICAgICAgZWxlbWVudCxcbiAgICAgIChuYW1lOiBzdHJpbmcpOiBJU3VydmV5RWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhbmVsQnlOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVRdWVzdGlvbk5hbWUoZWxlbWVudDogSVN1cnZleUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5lbnN1cmVVbmlxdWVFbGVtZW50TmFtZShcbiAgICAgIGVsZW1lbnQsXG4gICAgICAobmFtZTogc3RyaW5nKTogSVN1cnZleUVsZW1lbnQgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZW5zdXJlVW5pcXVlRWxlbWVudE5hbWUoXG4gICAgZWxlbWVudDogSVN1cnZleUVsZW1lbnQsXG4gICAgZ2V0RWxlbWVudEJ5TmFtZTogKG5hbWU6IHN0cmluZykgPT4gSVN1cnZleUVsZW1lbnRcbiAgKSB7XG4gICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGdldEVsZW1lbnRCeU5hbWUoZWxlbWVudC5uYW1lKTtcbiAgICBpZiAoIWV4aXN0aW5nRWxlbWVudCB8fCBleGlzdGluZ0VsZW1lbnQgPT0gZWxlbWVudCkgcmV0dXJuO1xuICAgIHZhciBuZXdOYW1lID0gdGhpcy5nZXROZXdOYW1lKGVsZW1lbnQubmFtZSk7XG4gICAgd2hpbGUgKCEhZ2V0RWxlbWVudEJ5TmFtZShuZXdOYW1lKSkge1xuICAgICAgdmFyIG5ld05hbWUgPSB0aGlzLmdldE5ld05hbWUoZWxlbWVudC5uYW1lKTtcbiAgICB9XG4gICAgZWxlbWVudC5uYW1lID0gbmV3TmFtZTtcbiAgfVxuICBwcml2YXRlIGdldE5ld05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcG9zID0gbmFtZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBvcyA+IDAgJiYgbmFtZVtwb3MgLSAxXSA+PSBcIjBcIiAmJiBuYW1lW3BvcyAtIDFdIDw9IFwiOVwiKSB7XG4gICAgICBwb3MtLTtcbiAgICB9XG4gICAgdmFyIGJhc2UgPSBuYW1lLnN1YnN0cigwLCBwb3MpO1xuICAgIHZhciBudW0gPSAwO1xuICAgIGlmIChwb3MgPCBuYW1lLmxlbmd0aCkge1xuICAgICAgbnVtID0gcGFyc2VJbnQobmFtZS5zdWJzdHIocG9zKSk7XG4gICAgfVxuICAgIG51bSsrO1xuICAgIHJldHVybiBiYXNlICsgbnVtO1xuICB9XG4gIHByaXZhdGUgY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKFxuICAgIGlzRm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0ZvY3VzZU9uRmlyc3RFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpc0ZvY3VzZU9uRmlyc3RFcnJvciA9IHRoaXMuZm9jdXNPbkZpcnN0RXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHZhciByZXMgPSB0aGlzLmN1cnJlbnRQYWdlLmhhc0Vycm9ycyh0cnVlLCBpc0ZvY3VzZU9uRmlyc3RFcnJvcik7XG4gICAgdGhpcy5maXJlVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZSgpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBmaXJlVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZSgpIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2UuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnNPblBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9ucztcbiAgICB2YXIgcXVlc3Rpb25zID0gbmV3IEFycmF5PFF1ZXN0aW9uPigpO1xuICAgIHZhciBlcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnNPblBhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zT25QYWdlW2ldO1xuICAgICAgaWYgKHEuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcXVlc3Rpb25zLnB1c2gocSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcS5lcnJvcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChxLmVycm9yc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2UuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbnM6IHF1ZXN0aW9ucyxcbiAgICAgIGVycm9yczogZXJyb3JzXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZ28gdG8gdGhlIHByZXZpb3VzIHBhZ2UuIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZSBhbHJlYWR5LiBJdCBkb2Vzbid0IHBlcmZvcm0gYW55IGNoZWNrcywgcmVxdWlyZWQgcXVlc3Rpb25zIGNhbiBiZSBlbXB0eS5cbiAgICogQHNlZSBpc0ZpcnN0UGFnZVxuICAgKi9cbiAgcHVibGljIHByZXZQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRmlyc3RQYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbaW5kZXggLSAxXTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBjb21wbGV0ZSB0aGUgc3VydmV5LCBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IG9uZS4gSXQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbiB0aGUgcGFnZS4gSWYgdGhlcmUgaXMgbm8gZXJyb3JzIG9uIHRoZSBwYWdlLCBpdCBjYWxscyBkb0NvbXBsZXRlIGFuZCByZXR1cm5zIHRydWUuXG4gICAqIEBzZWUgaXNDdXJyZW50UGFnZUhhc0Vycm9yc1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgZG9Db21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZG9DdXJyZW50UGFnZUNvbXBsZXRlKHRydWUpO1xuICB9XG4gIHByb3RlY3RlZCBkb0N1cnJlbnRQYWdlQ29tcGxldGUoZG9Db21wbGV0ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0Vycm9yc09uTmF2aWdhdGUoZG9Db21wbGV0ZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGVDb3JlKGRvQ29tcGxldGUpO1xuICB9XG4gIHByaXZhdGUgZG9DdXJyZW50UGFnZUNvbXBsZXRlQ29yZShkb0NvbXBsZXRlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZG9TZXJ2ZXJWYWxpZGF0aW9uKCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZG9Db21wbGV0ZSkge1xuICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9OZXh0UGFnZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgaWYgeW91IHdhbnQgdG8gY29tYmluZSBhbGwgeW91ciBwYWdlcyBpbiBvbmUgcGFnZS4gUGFnZXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBwYW5lbHMuXG4gICAqIFBsZWFzZSB1c2UgcXVlc3Rpb25zT25QYWdlTW9kZSBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBiZWNvbWVzIG9ic29sZXRlXG4gICAqIEBzZWUgcXVlc3Rpb25zT25QYWdlTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1NpbmdsZVBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zT25QYWdlTW9kZSA9PSBcInNpbmdsZVBhZ2VcIjtcbiAgfVxuICBwdWJsaWMgc2V0IGlzU2luZ2xlUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnF1ZXN0aW9uc09uUGFnZU1vZGUgPSB2YWwgPyBcInNpbmdsZVBhZ2VcIiA6IFwic3RhbmRhcmRcIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gJ3NpbmdsZVBhZ2UnLCBpZiB5b3Ugd2FudCB0byBjb21iaW5lIGFsbCB5b3VyIHBhZ2VzIGluIG9uZSBwYWdlLiBQYWdlcyB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIHBhbmVscy5cbiAgICogU2V0IGl0IHRvICdxdWVzdGlvblBlclBhZ2UnLCBpZiB5b3Ugd2FudCB0byBoYXZlIG9uZSBxdWVzdGlvbiBwZXIgcGFnZS4gU3VydmV5IHdpbGwgY3JlYXRlIGEgc2VwYXJhdGUgcGFnZSBmb3IgZXZlcnkgcXVlc3Rpb24uXG4gICAqIFRoaXMgcHJvcGVydHkgbWFkZSBpc1NpbmdsZVBhZ2UgcHJvcGVydHkgb2Jzb2xldGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT25QYWdlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPblBhZ2VNb2RlXCIsIFwic3RhbmRhcmRcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPblBhZ2VNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT25QYWdlTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBmaXJzdCBwYWdlIHlvdXIgc3RhcnRpbmcgcGFnZS4gVGhlIGVuZC11c2VyIGNvdWxkIG5vdCBjb21lYmFjayB0byB0aGUgc3RhcnQgcGFnZSBhbmQgaXQgaXMgbm90IGNvdW50IGluIHRoZSBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RQYWdlSXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlyc3RQYWdlSXNTdGFydGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCB2YWwpO1xuICB9XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgJiYgdGhpcy5wYWdlcy5sZW5ndGggPiAwICYmIHRoaXMucGFnZXNbMF0gPT09IHBhZ2VcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkZpcnN0UGFnZUlzU3RhcnRlZENoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgdGhpcy5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcy5wYWdlc1swXSwgIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKTtcbiAgfVxuICBvcmlnaW9uYWxQYWdlczogYW55ID0gbnVsbDtcbiAgcHJvdGVjdGVkIG9uUXVlc3Rpb25zT25QYWdlTW9kZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uc09uUGFnZU1vZGUgPT0gXCJzdGFuZGFyZFwiIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcmlnaW9uYWxQYWdlcykge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQ2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYWdlcy5zcGxpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ2lvbmFsUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnBhZ2VzLnB1c2godGhpcy5vcmlnaW9uYWxQYWdlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQ2xlYXIoKTtcbiAgICAgIGlmICghb2xkVmFsdWUgfHwgb2xkVmFsdWUgPT0gXCJzdGFuZGFyZFwiKSB7XG4gICAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB0aGlzLnBhZ2VzLnNsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgPyAxIDogMDtcbiAgICAgIHN1cGVyLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICB2YXIgbmV3UGFnZXMgPSB0aGlzLmNyZWF0ZVBhZ2VzRm9yUXVlc3Rpb25PblBhZ2VNb2RlKHN0YXJ0SW5kZXgpO1xuICAgICAgdmFyIGRlbGV0ZWRMZW4gPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIHN0YXJ0SW5kZXg7XG4gICAgICB0aGlzLnBhZ2VzLnNwbGljZShzdGFydEluZGV4LCBkZWxldGVkTGVuKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5wYWdlcy5wdXNoKG5ld1BhZ2VzW2ldKTtcbiAgICAgIH1cbiAgICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdQYWdlc1tpXS5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICAgICAgbmV3UGFnZXNbaV0uc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZG9FbGVtZW50c09uTG9hZCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVQYWdlc0ZvclF1ZXN0aW9uT25QYWdlTW9kZShcbiAgICBzdGFydEluZGV4OiBudW1iZXJcbiAgKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVQYWdlKSB7XG4gICAgICByZXR1cm4gW3RoaXMuY3JlYXRlU2luZ2xlUGFnZShzdGFydEluZGV4KV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhZ2VzRm9yRXZlcnlRdWVzdGlvbihzdGFydEluZGV4KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVNpbmdsZVBhZ2Uoc3RhcnRJbmRleDogbnVtYmVyKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgc2luZ2xlID0gdGhpcy5jcmVhdGVOZXdQYWdlKFwiYWxsXCIpO1xuICAgIHNpbmdsZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgdmFyIHBhbmVsID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICAgICAgc2luZ2xlLmFkZFBhbmVsKHBhbmVsKTtcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocGFnZSk7XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICAgIGlmICghdGhpcy5zaG93UGFnZVRpdGxlcykge1xuICAgICAgICBwYW5lbC50aXRsZSA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGU7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVQYWdlc0ZvckV2ZXJ5UXVlc3Rpb24oc3RhcnRJbmRleDogbnVtYmVyKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgdmFyIHJlczogQXJyYXk8UGFnZU1vZGVsPiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9yaWdpb25hbFBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvcmlnaW9uYWxQYWdlLmVsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBvcmlnaW9uYWxFbGVtZW50ID0gb3JpZ2lvbmFsUGFnZS5lbGVtZW50c1tqXTtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKG9yaWdpb25hbEVsZW1lbnQuZ2V0VHlwZSgpKTtcbiAgICAgICAgaWYgKCFlbGVtZW50KSBjb250aW51ZTtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmNyZWF0ZU5ld1BhZ2UoXCJwYWdlXCIgKyAocmVzLmxlbmd0aCArIDEpKTtcbiAgICAgICAgcGFnZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgICAgICByZXMucHVzaChwYWdlKTtcbiAgICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChvcmlnaW9uYWxFbGVtZW50KTtcbiAgICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBlbGVtZW50KTtcbiAgICAgICAgcGFnZS5hZGRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3Qgb25lLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UGFnZSB8fCAhdGhpcy5zaG93UHJldkJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbdGhpcy5jdXJyZW50UGFnZU5vIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKSA8PSAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHJldHVybiB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSB2UGFnZXMubGVuZ3RoIC0gMTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBjb21wbGV0ZSB0aGUgc3VydmV5LiBJdCB3cml0ZXMgY29va2llIGlmIGNvb2tpZU5hbWUgcHJvcGVydHkgaXMgbm90IGVtcHR5LCBzZXQgdGhlIHN1cnZleSBpbnRvICdjb21wbGV0ZWQnIHN0YXRlLCBmaXJlIG9uQ29tcGxldGUgZXZlbnQgYW5kIHNlbmRSZXN1bHQgaW50byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBpZiBzdXJ2ZXlQb3N0SWQgcHJvcGVydHkgaXMgbm90IGVtcHR5LiBJdCBkb2Vzbid0IHBlcmZvcm0gYW55IHZhbGlkYXRpb24sIHVubGlrZSBjb21wbGV0ZUxhc3RQYWdlIGZ1bmN0aW9uLlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgZG9Db21wbGV0ZSgpIHtcbiAgICB2YXIgb25Db21wbGV0aW5nT3B0aW9ucyA9IHsgYWxsb3dDb21wbGV0ZTogdHJ1ZSB9O1xuICAgIHRoaXMub25Db21wbGV0aW5nLmZpcmUodGhpcywgb25Db21wbGV0aW5nT3B0aW9ucyk7XG4gICAgaWYgKCFvbkNvbXBsZXRpbmdPcHRpb25zLmFsbG93Q29tcGxldGUpIHJldHVybjtcbiAgICBsZXQgcHJldmlvdXNDb29raWUgPSB0aGlzLmhhc0Nvb2tpZTtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMuc2V0Q29tcGxldGVkKCk7XG4gICAgdGhpcy5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgIHRoaXMuc2V0Q29va2llKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBvbkNvbXBsZXRlT3B0aW9ucyA9IHtcbiAgICAgIHNob3dEYXRhU2F2aW5nOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ0Vycm9yOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcImVycm9yXCIsIHRleHQpO1xuICAgICAgfSxcbiAgICAgIHNob3dEYXRhU2F2aW5nU3VjY2VzczogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzdWNjZXNzXCIsIHRleHQpO1xuICAgICAgfSxcbiAgICAgIHNob3dEYXRhU2F2aW5nQ2xlYXI6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiXCIsIFwiXCIpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbkNvbXBsZXRlLmZpcmUodGhpcywgb25Db21wbGV0ZU9wdGlvbnMpO1xuICAgIGlmICghcHJldmlvdXNDb29raWUgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHRoaXMuc2VuZFJlc3VsdCgpO1xuICAgIH1cbiAgICB0aGlzLm5hdmlnYXRlVG8oKTtcbiAgfVxuICAvKipcbiAgICogU3RhcnQgdGhlIHN1cnZleS4gQ2hhbmdlIHRoZSBtb2RlIGZyb20gXCJzdGFydGluZ1wiIHRvIFwicnVubmluZ1wiLiBZb3UgbmVlZCB0byBjYWxsIGl0LCBpZiB0aGVyZSBpcyBhIHN0YXJ0ZWQgcGFnZSBpbiB5b3VyIHN1cnZleSwgb3RoZXJ3aXNlIGl0IGRvZXMgbm90aGluZy5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRUaW1lckZyb21VSSgpO1xuICAgIHRoaXMub25TdGFydGVkLmZpcmUodGhpcywge30pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIGF0IHRoZSBjdXJyZW50IG1vbWVudCB0aGUgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIHZhbGlkYXRpbmcgb24gdGhlIHNlcnZlci5cbiAgICogQHNlZSBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGluZ09uU2VydmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMuaXNWYWxpZGF0aW5nT25TZXJ2ZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCB2YWwpO1xuICAgIHRoaXMub25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgZG9TZXJ2ZXJWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMgfHxcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucy5pc0VtcHR5XG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGRhdGE6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgc3VydmV5OiB0aGlzLFxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNvbXBsZXRlU2VydmVyVmFsaWRhdGlvbihvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKCFxdWVzdGlvbi52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpXG4gICAgICAgIG9wdGlvbnMuZGF0YVtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih0cnVlKTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcihmYWxzZSk7XG4gICAgaWYgKCFvcHRpb25zICYmICFvcHRpb25zLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gb3B0aW9ucy5zdXJ2ZXk7XG4gICAgdmFyIGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmVycm9ycykge1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBvcHRpb25zLmVycm9ycykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBzZWxmLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgICBpZiAocXVlc3Rpb24gJiYgcXVlc3Rpb25bXCJlcnJvcnNcIl0pIHtcbiAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgICAgIHF1ZXN0aW9uW1wiYWRkRXJyb3JcIl0obmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3JzW25hbWVdLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNFcnJvcnMpIHtcbiAgICAgIGlmIChzZWxmLmlzTGFzdFBhZ2UpIHNlbGYuZG9Db21wbGV0ZSgpO1xuICAgICAgZWxzZSBzZWxmLmRvTmV4dFBhZ2UoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRvTmV4dFBhZ2UoKSB7XG4gICAgdGhpcy5jaGVja09uUGFnZVRyaWdnZXJzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ29tcGxldGVkKSB7XG4gICAgICBpZiAodGhpcy5zZW5kUmVzdWx0T25QYWdlTmV4dCkge1xuICAgICAgICB0aGlzLnNlbmRSZXN1bHQodGhpcy5zdXJ2ZXlQb3N0SWQsIHRoaXMuY2xpZW50SWQsIHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgdmFyIGluZGV4ID0gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW2luZGV4ICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0Q29tcGxldGVkKCkge1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBodG1sIGZvciBjb21wbGV0ZWQgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgaHRtbCA9IHRoaXMucmVuZGVyZWRDb21wbGV0ZWRIdG1sO1xuICAgIGlmIChodG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbChodG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0aW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBodG1sIHNob3dpbmcgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgdGhlIHN1cnZleVxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZEJlZm9yZUh0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMuY29tcGxldGVkQmVmb3JlSHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleUJlZm9yZVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaHRtbCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgdGhlIGpzb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZExvYWRpbmdIdG1sKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9hZGluZ0h0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMubG9hZGluZ0h0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImxvYWRpbmdTdXJ2ZXlcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHByb2dyZXNzLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBpZiAodGhpcy5wcm9ncmVzc0JhclR5cGUgPT09IFwicXVlc3Rpb25zXCIpIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgICAgdmFyIGFuc3dlcmVkUXVlc3Rpb25zQ291bnQgPSBxdWVzdGlvbnMucmVkdWNlKFxuICAgICAgICAoYTogbnVtYmVyLCBiOiBRdWVzdGlvbikgPT4gYSArIChiLmlzRW1wdHkoKSA/IDAgOiAxKSxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInF1ZXN0aW9uc1Byb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgYW5zd2VyZWRRdWVzdGlvbnNDb3VudCxcbiAgICAgICAgcXVlc3Rpb25zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJUeXBlID09PSBcImNvcnJlY3RRdWVzdGlvbnNcIikge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgICB2YXIgY29ycmVjdEFuc3dlcnNDb3VudCA9IHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInF1ZXN0aW9uc1Byb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgY29ycmVjdEFuc3dlcnNDb3VudCxcbiAgICAgICAgcXVlc3Rpb25zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpICsgMTtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJwcm9ncmVzc1RleHRcIilbXCJmb3JtYXRcIl0oaW5kZXgsIHZQYWdlcy5sZW5ndGgpO1xuICB9XG4gIHByb3RlY3RlZCBhZnRlclJlbmRlclN1cnZleShodG1sRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyU3VydmV5LmZpcmUodGhpcywge1xuICAgICAgc3VydmV5OiB0aGlzLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVQYW5lbENzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5vbkFmdGVyUmVuZGVyUGFnZS5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUGFnZS5maXJlKHRoaXMsIHtcbiAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbi5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUGFuZWwocGFuZWw6IElFbGVtZW50LCBodG1sRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUGFuZWwuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBtYXRyaXhCZWZvcmVSb3dBZGRlZChvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLm9uTWF0cml4QmVmb3JlUm93QWRkZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhSb3dBZGRlZChxdWVzdGlvbjogSVF1ZXN0aW9uKSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd0FkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24gfSk7XG4gIH1cbiAgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXMgPSBxdWVzdGlvbnNbaV0uZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZSwgaW5kZXgpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBtYXRyaXhSb3dSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvd0luZGV4OiBudW1iZXIsIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd1JlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9XG4gIG1hdHJpeEFsbG93UmVtb3ZlUm93KFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICByb3c6IGFueVxuICApOiBib29sZWFuIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgIHJvdzogcm93LFxuICAgICAgYWxsb3c6IHRydWVcbiAgICB9O1xuICAgIHRoaXMub25NYXRyaXhBbGxvd1JlbW92ZVJvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG4gIG1hdHJpeENlbGxDcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbENyZWF0ZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhBZnRlckNlbGxSZW5kZXIuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeENlbGxWYWx1ZUNoYW5naW5nKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsaWRhdGUocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogU3VydmV5RXJyb3Ige1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbGlkYXRlLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIGR5bmFtaWNQYW5lbEFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcbiAgICB0aGlzLm9uRHluYW1pY1BhbmVsQWRkZWQuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9KTtcbiAgfVxuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxSZW1vdmVkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgcGFuZWxJbmRleDogcGFuZWxJbmRleFxuICAgIH0pO1xuICB9XG4gIGR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICBvcHRpb25zLmFsbG93ID0gdHJ1ZTtcbiAgICB0aGlzLm9uRHJhZ0Ryb3BBbGxvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCB0aGUgZmlsZSBpbnRvIHNlcnZlclxuICAgKiBAcGFyYW0gbmFtZSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBmaWxlIHVwbG9hZGluZyBmaWxlXG4gICAqIEBwYXJhbSBzdG9yZURhdGFBc1RleHQgc2V0IGl0IHRvIHRydWUgdG8gZW5jb2RlIGZpbGUgY29udGVudCBpbnRvIHRoZSBzdXJ2ZXkgcmVzdWx0c1xuICAgKiBAcGFyYW0gdXBsb2FkaW5nQ2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb24gdXBsb2FkaW5nIHRoZSBmaWxlXG4gICAqL1xuICBwdWJsaWMgdXBsb2FkRmlsZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGVzOiBGaWxlW10sXG4gICAgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgaWYgKHRoaXMub25VcGxvYWRGaWxlcy5pc0VtcHR5KSB7XG4gICAgICB1cGxvYWRpbmdDYWxsYmFjayhcImVycm9yXCIsIGZpbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblVwbG9hZEZpbGVzLmZpcmUodGhpcywge1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBmaWxlczogZmlsZXMgfHwgW10sXG4gICAgICAgIGNhbGxiYWNrOiB1cGxvYWRpbmdDYWxsYmFja1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgdGhpcy51cGxvYWRGaWxlc0NvcmUobmFtZSwgZmlsZXMsIHVwbG9hZGluZ0NhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIERvd25sb2FkIHRoZSBmaWxlIGZyb20gc2VydmVyXG4gICAqIEBwYXJhbSBuYW1lIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIGZpbGVWYWx1ZSBzaW5nbGUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb24gZG93bmxvYWRpbmcgdGhlIGZpbGUgYW5kIHRoZSBkb3dubG9hZGVkIGZpbGUgY29udGVudFxuICAgKi9cbiAgcHVibGljIGRvd25sb2FkRmlsZShcbiAgICBxdWVzdGlvbk5hbWU6IHN0cmluZyxcbiAgICBmaWxlVmFsdWU6IGFueSxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vbkRvd25sb2FkRmlsZS5pc0VtcHR5KSB7XG4gICAgICAhIWNhbGxiYWNrICYmIGNhbGxiYWNrKFwic3VjY2Vzc1wiLCBmaWxlVmFsdWUuY29udGVudCB8fCBmaWxlVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm9uRG93bmxvYWRGaWxlLmZpcmUodGhpcywge1xuICAgICAgbmFtZTogcXVlc3Rpb25OYW1lLFxuICAgICAgY29udGVudDogZmlsZVZhbHVlLmNvbnRlbnQgfHwgZmlsZVZhbHVlLFxuICAgICAgZmlsZVZhbHVlOiBmaWxlVmFsdWUsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgZmlsZXMgZnJvbSBzZXJ2ZXJcbiAgICogQHBhcmFtIG5hbWUgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIGNsZWFyaW5nIG9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGNsZWFyRmlsZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vbkNsZWFyRmlsZXMuaXNFbXB0eSkge1xuICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjayhcInN1Y2Nlc3NcIiwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2xlYXJGaWxlcy5maXJlKHRoaXMsIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgc2VydmVyUmVzdWx0OiBzZXJ2ZXJSZXN1bHRcbiAgICB9O1xuICAgIHRoaXMub25Mb2FkQ2hvaWNlc0Zyb21TZXJ2ZXIuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5jaG9pY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleVNlcnZpY2UoKTogZHhTdXJ2ZXlTZXJ2aWNlIHtcbiAgICByZXR1cm4gbmV3IGR4U3VydmV5U2VydmljZSgpO1xuICB9XG4gIHByb3RlY3RlZCB1cGxvYWRGaWxlc0NvcmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGVzOiBGaWxlW10sXG4gICAgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgdmFyIHJlc3BvbnNlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwidXBsb2FkaW5nXCIsIGZpbGUpO1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuc2VuZEZpbGUoXG4gICAgICAgIHRoaXMuc3VydmV5UG9zdElkLFxuICAgICAgICBmaWxlLFxuICAgICAgICAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7IGNvbnRlbnQ6IHJlc3BvbnNlLCBmaWxlOiBmaWxlIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT09IGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwic3VjY2Vzc1wiLCByZXNwb25zZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spXG4gICAgICAgICAgICAgIHVwbG9hZGluZ0NhbGxiYWNrKFwiZXJyb3JcIiwgeyByZXNwb25zZTogcmVzcG9uc2UsIGZpbGU6IGZpbGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGdldFBhZ2UoaW5kZXg6IG51bWJlcik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBwYWdlIGludG8gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gcGFnZVxuICAgKiBAc2VlIGFkZE5ld1BhZ2VcbiAgICovXG4gIHB1YmxpYyBhZGRQYWdlKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIGlmIChwYWdlID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBhZ2UgYW5kIGFkZHMgaXQgaW50byB0aGUgc3VydmV5LiBHZW5hcmF0ZXMgYSBuZXcgbmFtZSBpZiB0aGUgbmFtZSBwYXJhbWV0ZXIgaXMgbm90IHNldC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYWdlIG5hbWVcbiAgICogQHNlZSBhZGRQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmNyZWF0ZU5ld1BhZ2UobmFtZSk7XG4gICAgdGhpcy5hZGRQYWdlKHBhZ2UpO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHBhZ2UgZnJvbSB0aGUgc3VydmV5XG4gICAqIEBwYXJhbSBwYWdlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFnZShwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnBhZ2VzLmluZGV4T2YocGFnZSk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgIHRoaXMucGFnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlID09IHBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLnBhZ2VzWzBdIDogbnVsbDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIG5hbWVcbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmVcbiAgICAgIDogdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcztcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc1swXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyB2YWx1ZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZU5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5TmFtZVxuICAgKiBAc2VlIFF1ZXN0aW9uLnZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVF1ZXN0aW9uIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUodmFsdWVOYW1lLCBjYXNlSW5zZW5zaXRpdmUpO1xuICAgIHJldHVybiAhIXJlcyA/IHJlc1swXSA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8UXVlc3Rpb24+IHtcbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZVxuICAgICAgOiB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXM7XG4gICAgdmFyIHJlcyA9IGhhc2hbdmFsdWVOYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogR2V0IGEgbGlzdCBvZiBxdWVzdGlvbnMgYnkgdGhlaXIgbmFtZXNcbiAgICogQHBhcmFtIG5hbWVzIHRoZSBhcnJheSBvZiBuYW1lc1xuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25zQnlOYW1lcyhcbiAgICBuYW1lczogc3RyaW5nW10sXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVF1ZXN0aW9uW10ge1xuICAgIHZhciByZXN1bHQ6IElRdWVzdGlvbltdID0gW107XG4gICAgaWYgKCFuYW1lcykgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbmFtZXNbaV0pIGNvbnRpbnVlO1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lc1tpXSwgY2FzZUluc2Vuc2l0aXZlKTtcbiAgICAgIGlmIChxdWVzdGlvbikgcmVzdWx0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFnZSBvbiB3aGljaCBhbiBlbGVtZW50IChxdWVzdGlvbiBvciBwYW5lbCkgaXMgcGxhY2VkLlxuICAgKiBAcGFyYW0gZWxlbWVudCBRdWVzdGlvbiBvciBQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBQYWdlTW9kZWwge1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICBpZiAocGFnZS5jb250YWluc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2Ugb24gd2hpY2ggYSBxdWVzdGlvbiBpcyBsb2NhdGVkXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeVF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeUVsZW1lbnQocXVlc3Rpb24pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFnZSBieSBpdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQYWdlTW9kZWwge1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLnBhZ2VzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmVydHVucyBhIGxpc3Qgb2YgcGFnZXMgYnkgdGhlaXIgbmFtZXNcbiAgICogQHBhcmFtIG5hbWVzIGEgbGlzdCBvZiBwYWdlcyBuYW1lc1xuICAgKi9cbiAgcHVibGljIGdldFBhZ2VzQnlOYW1lcyhuYW1lczogc3RyaW5nW10pOiBQYWdlTW9kZWxbXSB7XG4gICAgdmFyIHJlc3VsdDogUGFnZU1vZGVsW10gPSBbXTtcbiAgICBpZiAoIW5hbWVzKSByZXR1cm4gcmVzdWx0O1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFuYW1lc1tpXSkgY29udGludWU7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMuZ2V0UGFnZUJ5TmFtZShuYW1lc1tpXSk7XG4gICAgICBpZiAocGFnZSkgcmVzdWx0LnB1c2gocGFnZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHF1ZXN0aW9ucyBpbiB0aGUgc3VydmV5XG4gICAqIEBwYXJhbSB2aXNpYmxlT25seSBzZXQgaXQgdHJ1ZSwgaWYgeW91IHdhbnQgdG8gZ2V0IG9ubHkgdmlzaWJsZSBxdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxRdWVzdGlvbnMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUXVlc3Rpb24+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUXVlc3Rpb25zVG9MaXN0KFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHZpc2libGVPbmx5LFxuICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1aXogcXVlc3Rpb25zLiBBbGwgdmlzaWJsZSBxdWVzdGlvbnMgdGhhdCBoYXMgaW5wdXQocykgd2lkZ2V0cy5cbiAgICogQHNlZSBnZXRRdWl6UXVlc3Rpb25Db3VudFxuICAgKi9cbiAgcHVibGljIGdldFF1aXpRdWVzdGlvbnMoKTogQXJyYXk8SVF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUXVlc3Rpb24+KCk7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCA/IDEgOiAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYWdlc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tqXTtcbiAgICAgICAgaWYgKHEucXVpelF1ZXN0aW9uQ291bnQgPiAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhbmVsIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFuZWwgbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbEJ5TmFtZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVBhbmVsIHtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5nZXRBbGxQYW5lbHMoKTtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbE5hbWUgPSBwYW5lbHNbaV0ubmFtZTtcbiAgICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHBhbmVsTmFtZSA9IHBhbmVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHBhbmVsTmFtZSA9PSBuYW1lKSByZXR1cm4gcGFuZWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGFuZWxzIGluIHRoZSBzdXJ2ZXlcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUGFuZWxzSW50b0xpc3QocmVzdWx0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlTW9kZWwobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHF1ZXN0aW9uT25WYWx1ZUNoYW5naW5nKHZhbHVlTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5vblZhbHVlQ2hhbmdpbmcuaXNFbXB0eSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgcXVlc3Rpb246IHRoaXMuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZSh2YWx1ZU5hbWUpLFxuICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgb2xkVmFsdWU6IHRoaXMuZ2V0VmFsdWUodmFsdWVOYW1lKVxuICAgIH07XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlUXVlc3Rpb25WYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgaWYgKCEhcXVlc3Rpb25zKSB7XG4gICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMocXVlc3Rpb25zW2ldLnZhbHVlLCBuZXdWYWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICBxdWVzdGlvbnNbaV0udXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQodmFsdWVOYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgIGlmICh0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PSBcIm9uVmFsdWVDaGFuZ2VkXCIpIHtcbiAgICAgICAgICB2YXIgb2xkRXJyb3JDb3VudCA9IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgcXVlc3Rpb24uaGFzRXJyb3JzKHRydWUpO1xuICAgICAgICAgIGlmIChvbGRFcnJvckNvdW50ID4gMCB8fCBxdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maXJlVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IHZhbHVlTmFtZSxcbiAgICAgICAgcXVlc3Rpb246IG51bGwsXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQodmFsdWVOYW1lKTtcbiAgfVxuICBwcml2YXRlIG5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uID09PSBcInByb2Nlc3NpbmdcIikgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlQWxsUXVlc3Rpb25zVmFsdWUoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSA8UXVlc3Rpb24+cXVlc3Rpb25zW2ldO1xuICAgICAgdmFyIHZhbE5hbWUgPSBxLmdldFZhbHVlTmFtZSgpO1xuICAgICAgcS51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkodGhpcy5nZXRWYWx1ZSh2YWxOYW1lKSk7XG4gICAgICBpZiAocS5yZXF1aXJlVXBkYXRlQ29tbWVudFZhbHVlKSB7XG4gICAgICAgIHEudXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkodGhpcy5nZXRDb21tZW50KHZhbE5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjaGVja09uUGFnZVRyaWdnZXJzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICB2YWx1ZXNbbmFtZV0gPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModmFsdWVzLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8UXVlc3Rpb24+ID0gW107XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24ubmFtZSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaChxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKGtleTogYW55LCBpc09uTmV4dFBhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCB8fCB0aGlzLnRyaWdnZXJzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudHJpZ2dlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy50cmlnZ2Vyc1tpXTtcbiAgICAgIGlmICh0cmlnZ2VyLmlzT25OZXh0UGFnZSA9PSBpc09uTmV4dFBhZ2UpIHtcbiAgICAgICAgdHJpZ2dlci5jaGVja0V4cHJlc3Npb24oa2V5LCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGRvRWxlbWVudHNPbkxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQgfHwgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIpIHJldHVybjtcbiAgICB2YXIgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxjdWxhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXNbaV0ucnVuRXhwcmVzc2lvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWdlc1tpXS5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNlbmQgdGhlIHN1cnZleSByZXN1bHQgaW50byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogQHBhcmFtIHBvc3RJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBwb3N0SWRcbiAgICogQHBhcmFtIGNsaWVudElkIFR5cGljYWxseSBhIGN1c3RvbWVyIGUtbWFpbCBvciBhbiBpZGVudGlmaWNhdG9yXG4gICAqIEBwYXJhbSBpc1BhcnRpYWxDb21wbGV0ZWQgU2V0IGl0IHRvIHRydWUgaWYgdGhlIHN1cnZleSBpcyBub3QgY29tcGxldGVkIHlldCBhbmQgaXQgaXMgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdHNcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICogQHNlZSBjbGllbnRJZFxuICAgKi9cbiAgcHVibGljIHNlbmRSZXN1bHQoXG4gICAgcG9zdElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGlzUGFydGlhbENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiB0aGlzLm9uUGFydGlhbFNlbmQpIHtcbiAgICAgIHRoaXMub25QYXJ0aWFsU2VuZC5maXJlKHRoaXMsIG51bGwpO1xuICAgIH1cblxuICAgIGlmICghcG9zdElkICYmIHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICBwb3N0SWQgPSB0aGlzLnN1cnZleVBvc3RJZDtcbiAgICB9XG4gICAgaWYgKCFwb3N0SWQpIHJldHVybjtcbiAgICBpZiAoY2xpZW50SWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICB9XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiAhdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5zdXJ2ZXlTaG93RGF0YVNhdmluZykge1xuICAgICAgdGhpcy5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCBcIlwiKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuc2VuZFJlc3VsdChcbiAgICAgIHBvc3RJZCxcbiAgICAgIHRoaXMuZGF0YSxcbiAgICAgIGZ1bmN0aW9uKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnksIHJlcXVlc3Q6IGFueSkge1xuICAgICAgICBpZiAoc2VsZi5zdXJ2ZXlTaG93RGF0YVNhdmluZykge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic3VjY2Vzc1wiLCBcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcImVycm9yXCIsIFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLm9uU2VuZFJlc3VsdC5maXJlKHNlbGYsIHtcbiAgICAgICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICBpc1BhcnRpYWxDb21wbGV0ZWRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UgYW5kIG9uIGNhbGxiYWNrIGZpcmVzIG9uR2V0UmVzdWx0IGV2ZW50IHdpdGggYWxsIGFuc3dlcnMgdGhhdCB5b3VyIHVzZXJzIG1hZGUgZm9yIGEgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSByZXN1bHRJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSByZXN1bHRJZFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIG9uR2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVzdWx0KHJlc3VsdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRSZXN1bHQocmVzdWx0SWQsIG5hbWUsIGZ1bmN0aW9uKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIGRhdGFMaXN0OiBhbnlbXSxcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApIHtcbiAgICAgIHNlbGYub25HZXRSZXN1bHQuZmlyZShzZWxmLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGRhdGFMaXN0OiBkYXRhTGlzdCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogTG9hZHMgdGhlIHN1cnZleSBKc29uIGZyb20gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLiBJZiBjbGllbnRJZCBpcyBub3QgbnVsbCBhbmQgdXNlciBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgdGhlIHN1cnZleSwgdGhlIHN1cnZleSB3aWxsIGdvIGludG8gXCJjb21wbGV0ZWRiZWZvcmVcIiBzdGF0ZS5cbiAgICogQHBhcmFtIHN1cnZleUlkIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIHN1cnZleUlkXG4gICAqIEBwYXJhbSBjbGllbnRJZCBpbmRlbnRpZmljYXRvciBmb3IgYSB1c2VyLCBmb3IgZXhhbXBsZSBlLW1haWwgb3IgdW5pcXVlIGN1c3RvbWVyIGlkIGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uLlxuICAgKiBAc2VlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVuZElkOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmIChzdXJ2ZXlJZCkge1xuICAgICAgdGhpcy5zdXJ2ZXlJZCA9IHN1cnZleUlkO1xuICAgIH1cbiAgICBpZiAoY2xpZW5kSWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbmRJZDtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCk7XG4gICAgaWYgKGNsaWVuZElkKSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRTdXJ2ZXlKc29uQW5kSXNDb21wbGV0ZWQoXG4gICAgICAgIHRoaXMuc3VydmV5SWQsXG4gICAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICAgIGZ1bmN0aW9uKFxuICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAganNvbjogc3RyaW5nLFxuICAgICAgICAgIGlzQ29tcGxldGVkOiBzdHJpbmcsXG4gICAgICAgICAgcmVzcG9uc2U6IGFueVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxmLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBzZWxmLmlzQ29tcGxldGVkQmVmb3JlID0gaXNDb21wbGV0ZWQgPT0gXCJjb21wbGV0ZWRcIjtcbiAgICAgICAgICAgIHNlbGYubG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLmxvYWRTdXJ2ZXkodGhpcy5zdXJ2ZXlJZCwgZnVuY3Rpb24oXG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgICAgICByZXNwb25zZTogYW55XG4gICAgICApIHtcbiAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uOiBhbnkpIHtcbiAgICBpZiAoIWpzb24pIHJldHVybjtcbiAgICB0aGlzLmZyb21KU09OKGpzb24pO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge31cbiAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge31cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlSW5kZXhlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVBhZ2VWaXNpYmxlSW5kZXhlcyh0aGlzLnNob3dQYWdlTnVtYmVycyk7XG4gICAgaWYgKHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uUGFnZVwiKSB7XG4gICAgICB2YXIgdmlzUGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmlzUGFnZXNbaV0uc2V0VmlzaWJsZUluZGV4KDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblwiID8gMCA6IC0xO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGluZGV4ICs9IHRoaXMucGFnZXNbaV0uc2V0VmlzaWJsZUluZGV4KGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVQYWdlVmlzaWJsZUluZGV4ZXMoc2hvd0luZGV4OiBib29sZWFuKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ID0gdGhpcy5wYWdlc1tpXS52aXNpYmxlID8gaW5kZXgrKyA6IC0xO1xuICAgICAgdGhpcy5wYWdlc1tpXS5udW0gPVxuICAgICAgICBzaG93SW5kZXggJiYgdGhpcy5wYWdlc1tpXS52aXNpYmxlXG4gICAgICAgICAgPyB0aGlzLnBhZ2VzW2ldLnZpc2libGVJbmRleCArIDFcbiAgICAgICAgICA6IC0xO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZnJvbUpTT04oanNvbjogYW55KSB7XG4gICAgaWYgKCFqc29uKSByZXR1cm47XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdGhpcy5qc29uRXJyb3JzID0gbnVsbDtcbiAgICB2YXIganNvbkNvbnZlcnRlciA9IG5ldyBKc29uT2JqZWN0KCk7XG4gICAganNvbkNvbnZlcnRlci50b09iamVjdChqc29uLCB0aGlzKTtcbiAgICBpZiAoanNvbkNvbnZlcnRlci5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5qc29uRXJyb3JzID0ganNvbkNvbnZlcnRlci5lcnJvcnM7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRKc29uT2JqZWN0KGpzb25PYmo6IGFueSkge1xuICAgIHRoaXMuZnJvbUpTT04oanNvbk9iaik7XG4gIH1cbiAgcHJpdmF0ZSBpc0VuZExvYWRpbmdGcm9tSnNvbjogc3RyaW5nID0gbnVsbDtcbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBcInByb2Nlc3NpbmdcIjtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgdGhpcy5vblF1ZXN0aW9uc09uUGFnZU1vZGVDaGFuZ2VkKFwic3RhbmRhcmRcIik7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKHRoaXMuaGFzQ29va2llKSB7XG4gICAgICB0aGlzLmRvQ29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IFwiY29uZGl0aW9uc1wiO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQoXCJcIik7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZUNyZWF0aW5nKCkge31cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlQ29yZSh0ZXh0VmFsdWUpO1xuICAgIGlmICghdGhpcy5vblByb2Nlc3NUZXh0VmFsdWUuaXNFbXB0eSkge1xuICAgICAgdmFyIHdhc0VtcHR5ID0gdGhpcy5pc1ZhbHVlRW1wdHkodGV4dFZhbHVlLnZhbHVlKTtcbiAgICAgIHRoaXMub25Qcm9jZXNzVGV4dFZhbHVlLmZpcmUodGhpcywgdGV4dFZhbHVlKTtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9XG4gICAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyB8fCAod2FzRW1wdHkgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZUNvcmUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiB2b2lkIHtcbiAgICB2YXIgbmFtZSA9IHRleHRWYWx1ZS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgaWYgKFtcIm5vXCIsIFwicmVxdWlyZVwiLCBcInRpdGxlXCJdLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInBhZ2Vub1wiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gcGFnZSAhPSBudWxsID8gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZihwYWdlKSArIDEgOiAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJwYWdlY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMudmlzaWJsZVBhZ2VDb3VudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwibG9jYWxlXCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSAhIXRoaXMubG9jYWxlXG4gICAgICAgID8gdGhpcy5sb2NhbGVcbiAgICAgICAgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiY29ycmVjdGVkYW5zd2Vyc1wiIHx8IG5hbWUgPT09IFwiY29ycmVjdGVkYW5zd2VyY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaW5jb3JyZWN0ZWRhbnN3ZXJzXCIgfHwgbmFtZSA9PT0gXCJpbmNvcnJlY3RlZGFuc3dlcmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldEluQ29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicXVlc3Rpb25jb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRRdWl6UXVlc3Rpb25Db3VudCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZShuYW1lLCB0aGlzLmRhdGEpO1xuICAgIHZhciB2YXJpYWJsZSA9IHRoaXMuZ2V0VmFyaWFibGUobmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB2YXJpYWJsZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEhZmlyc3ROYW1lKSBmaXJzdE5hbWUgPSBmaXJzdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoZmlyc3ROYW1lLCB0cnVlKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkgKyBuYW1lLnN1YnN0cihmaXJzdE5hbWUubGVuZ3RoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgIHZhbHVlc1tmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShmYWxzZSwgdW5kZWZpbmVkKVxuICAgICAgICA6IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldFZhbHVlKG5hbWUsIHZhbHVlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUodGV4dFZhbHVlLm5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzICE9IFwibm9uZVwiKSB7XG4gICAgICB0aGlzLmNsZWFySW52aXNpYmxlUXVlc3Rpb25WYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgaGFzVmlzaWJsZVF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUodmFsdWVOYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9ucykgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaXNWaXNpYmxlKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHF1ZXN0aW9uQ291bnRCeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgcmV0dXJuICEhcXVlc3Rpb25zID8gcXVlc3Rpb25zLmxlbmd0aCA6IDA7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2YXJpYWJsZSB2YWx1ZS4gVmFyaWFibGUsIHVubGlrZSB2YWx1ZXMsIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBzdXJ2ZXkgcmVzdWx0cy5cbiAgICogQHBhcmFtIG5hbWUgQSB2YXJpYWJsZSBuYW1lXG4gICAqIEBzZWUgU2V0VmFyaWFibGVcbiAgICovXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzID0gdGhpcy52YXJpYWJsZXNIYXNoW25hbWVdO1xuICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocmVzKSkgcmV0dXJuIHJlcztcbiAgICBpZiAobmFtZS5pbmRleE9mKFwiLlwiKSA+IC0xIHx8IG5hbWUuaW5kZXhPZihcIltcIikgPiAtMSkge1xuICAgICAgaWYgKG5ldyBQcm9jZXNzVmFsdWUoKS5oYXNWYWx1ZShuYW1lLCB0aGlzLnZhcmlhYmxlc0hhc2gpKVxuICAgICAgICByZXR1cm4gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldFZhbHVlKG5hbWUsIHRoaXMudmFyaWFibGVzSGFzaCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgYSB2YXJpYWJsZSB2YWx1ZS4gVmFyaWFibGUsIHVubGlrZSB2YWx1ZXMsIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBzdXJ2ZXkgcmVzdWx0cy5cbiAgICogQHBhcmFtIG5hbWUgQSB2YXJpYWJsZSBuYW1lXG4gICAqIEBwYXJhbSBuZXdWYWx1ZVxuICAgKiBAc2VlIEdldFZhcmlhYmxlXG4gICAqL1xuICBwdWJsaWMgc2V0VmFyaWFibGUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnZhcmlhYmxlc0hhc2hbbmFtZV0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKG5hbWUpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIC8vSVN1cnZleSBkYXRhXG4gIHByb3RlY3RlZCBnZXRVbmJpbmRWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZSBBIHF1ZXN0aW9uIG5hbWVcbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5nZXRVbmJpbmRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgYSBxdWVzdGlvbiB2YWx1ZS4gSXQgcnVucyBhbGwgdHJpZ2dlcnMgYW5kIGNvbmRpdGlvbnMgKHZpc2libGVJZiBwcm9wZXJ0aWVzKS4gR29lcyB0byB0aGUgbmV4dCBwYWdlIGlmIGdvTmV4dFBhZ2VBdXRvbWF0aWMgaXMgdHJ1ZSBhbmQgYWxsIHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSBhbnN3ZXJlZCBjb3JyZWN0bHkuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gbmV3VmFsdWVcbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgZ2V0VmFsdWVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZUlmXG4gICAqIEBzZWUgUXVlc3Rpb24udmlzaWJsZUlmXG4gICAqIEBzZWUgZ29OZXh0UGFnZUF1dG9tYXRpY1xuICAgKi9cbiAgcHVibGljIHNldFZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdRdWVzdGlvblZhbHVlOiBhbnksXG4gICAgbG9jTm90aWZpY2F0aW9uOiBhbnkgPSBmYWxzZVxuICApIHtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnF1ZXN0aW9uT25WYWx1ZUNoYW5naW5nKG5hbWUsIG5ld1F1ZXN0aW9uVmFsdWUpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNWYWx1ZUVxdWFsKG5hbWUsIG5ld1ZhbHVlKSAmJlxuICAgICAgdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBuZXdRdWVzdGlvblZhbHVlKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUpKSB7XG4gICAgICB0aGlzLmRlbGV0ZURhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvblZhbHVlKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAobG9jTm90aWZpY2F0aW9uID09PSB0cnVlKSByZXR1cm47XG4gICAgdmFyIHRyaWdnZXJLZXlzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0cmlnZ2VyS2V5c1tuYW1lXSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuY2hlY2tUcmlnZ2Vycyh0cmlnZ2VyS2V5cywgZmFsc2UpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMubm90aWZ5UXVlc3Rpb25PblZhbHVlQ2hhbmdlZChuYW1lLCBuZXdWYWx1ZSk7XG4gICAgaWYgKGxvY05vdGlmaWNhdGlvbiAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMudHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRXF1YWwobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBcIlwiIHx8IG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIG5ld1ZhbHVlID0gbnVsbDtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIGlmIChvbGRWYWx1ZSA9PT0gXCJcIiB8fCBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSBvbGRWYWx1ZSA9IG51bGw7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSBudWxsKSByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlO1xuICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PblBhZ2VBZGRlZChwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBwYWdlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgaWYgKCFwYWdlLm5hbWUpIHBhZ2UubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKHRoaXMucGFnZXMsIFwicGFnZVwiKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZChwYWdlKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcGFnZTogcGFnZSB9O1xuICAgIHRoaXMub25QYWdlQWRkZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTmV3TmFtZShlbGVtZW50czogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGtleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIGtleXNbZWxlbWVudHNbaV1bXCJuYW1lXCJdXSA9IHRydWU7XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB3aGlsZSAoa2V5c1tiYXNlTmFtZSArIGluZGV4XSkgaW5kZXgrKztcbiAgICByZXR1cm4gYmFzZU5hbWUgKyBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgdHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKFxuICAgICAgIXF1ZXN0aW9uIHx8XG4gICAgICAoISFxdWVzdGlvbiAmJlxuICAgICAgICAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRDdXJyZW50UGFnZVF1ZXN0aW9ucygpO1xuICAgIGlmIChxdWVzdGlvbnMuaW5kZXhPZihxdWVzdGlvbikgPCAwKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaGFzSW5wdXQgJiYgcXVlc3Rpb25zW2ldLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKGZhbHNlKSkge1xuICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ29OZXh0UGFnZUF1dG9tYXRpYyA9PT0gdHJ1ZSAmJlxuICAgICAgICAgIHRoaXMuYWxsb3dDb21wbGV0ZVN1cnZleUF1dG9tYXRpY1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tbWVudCB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZVxuICAgKiBAc2VlIHNldENvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YVtuYW1lICsgdGhpcy5jb21tZW50UHJlZml4XTtcbiAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IFwiXCI7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBjb21tZW50IHZhbHVlXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqIEBwYXJhbSBuZXdWYWx1ZVxuICAgKiBAc2VlIGdldENvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBzZXRDb21tZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogc3RyaW5nLFxuICAgIGxvY05vdGlmaWNhdGlvbjogYW55ID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBcIlwiO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMuZ2V0Q29tbWVudChuYW1lKSkpIHJldHVybjtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgY29tbWVudE5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKG5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWVzdGlvbnNbaV0udXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobG9jTm90aWZpY2F0aW9uICE9PSBcInRleHRcIikge1xuICAgICAgdGhpcy50cnlHb05leHRQYWdlQXV0b21hdGljKG5hbWUpO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgbmFtZTogY29tbWVudE5hbWUsXG4gICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3VydmV5IHJlc3VsdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbHVlLiBUeXBpY2FsbHkgaXQgaXMgYSBxdWVzdGlvbiBuYW1lXG4gICAqL1xuICBwdWJsaWMgY2xlYXJWYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUsIG51bGwpO1xuICAgIHRoaXMuc2V0Q29tbWVudChuYW1lLCBudWxsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgdmFsdWUgdG8gdHJ1ZSwgdG8gY2xlYXIgdmFsdWUgb24gZGlzYWJsZSBpdGVtcyBpbiBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLlxuICAgKiBCeSBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGNsZWFyZWQgb24gZGlzYWJsZWQgdGhlIGNvcnJlc3BvbmRlZCBpdGVtcy4gVGhpcyBwcm9wZXJ0eSBpcyBub3QgcGVyc2lzdGVkIGluIHN1cnZleSBqc29uIGFuZCB5b3UgaGF2ZSB0byBzZXQgaXQgaW4gY29kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjbGVhclZhbHVlT25EaXNhYmxlSXRlbXNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsZWFyVmFsdWVPbkRpc2FibGVJdGVtc1wiLCB2YWwpO1xuICB9XG4gIHF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIHZpc2libGU6IG5ld1ZhbHVlXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcXVlc3Rpb24gJiZcbiAgICAgICFxdWVzdGlvbi52aXNpYmxlICYmXG4gICAgICB0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzID09IFwib25IaWRkZW5cIlxuICAgICkge1xuICAgICAgcXVlc3Rpb24uY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZTogSVBhZ2UsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYWdlVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IHBhZ2U6IHBhZ2UsIHZpc2libGU6IG5ld1ZhbHVlIH0pO1xuICB9XG4gIHBhbmVsVmlzaWJpbGl0eUNoYW5nZWQocGFuZWw6IElQYW5lbCwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhbmVsVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IHBhbmVsOiBwYW5lbCwgdmlzaWJsZTogbmV3VmFsdWUgfSk7XG4gIH1cbiAgcXVlc3Rpb25BZGRlZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFyZW50UGFuZWw6IGFueSxcbiAgICByb290UGFuZWw6IGFueVxuICApIHtcbiAgICBpZiAoIXF1ZXN0aW9uLm5hbWUpIHtcbiAgICAgIHF1ZXN0aW9uLm5hbWUgPSB0aGlzLmdlbmVyYXRlTmV3TmFtZShcbiAgICAgICAgdGhpcy5nZXRBbGxRdWVzdGlvbnMoZmFsc2UsIHRydWUpLFxuICAgICAgICBcInF1ZXN0aW9uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghISg8UXVlc3Rpb24+cXVlc3Rpb24pLnBhZ2UpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXNBZGRlZCg8UXVlc3Rpb24+cXVlc3Rpb24pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB9XG4gICAgdGhpcy5vblF1ZXN0aW9uQWRkZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgcGFyZW50UGFuZWw6IHBhcmVudFBhbmVsLFxuICAgICAgcm9vdFBhbmVsOiByb290UGFuZWxcbiAgICB9KTtcbiAgfVxuICBxdWVzdGlvblJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNSZW1vdmVkKFxuICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZSxcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblF1ZXN0aW9uUmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWVcbiAgICB9KTtcbiAgfVxuICBxdWVzdGlvblJlbmFtZWQoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBvbGROYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWVOYW1lOiBzdHJpbmdcbiAgKTogYW55IHtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUmVtb3ZlZCg8UXVlc3Rpb24+cXVlc3Rpb24sIG9sZE5hbWUsIG9sZFZhbHVlTmFtZSk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKDxRdWVzdGlvbj5xdWVzdGlvbik7XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlcyA9IHtcbiAgICBuYW1lczoge30sXG4gICAgbmFtZXNJbnNlbnNpdGl2ZToge30sXG4gICAgdmFsdWVOYW1lczoge30sXG4gICAgdmFsdWVOYW1lc0luc2Vuc2l0aXZlOiB7fVxuICB9O1xuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzQ2xlYXIoKSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcyA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZSA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlID0ge307XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc1BhbmVsQWRkZWQocGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQocXVlc3Rpb25zW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc0FkZGVkKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcyxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmUsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzUmVtb3ZlZChcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIGlmICghIW5hbWUpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUodGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcywgcXVlc3Rpb24sIG5hbWUpO1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShcbiAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISF2YWx1ZU5hbWUpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgdmFsdWVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoQWRkZWRDb3JlKGhhc2g6IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uLCBuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoISFyZXMpIHtcbiAgICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgICAgaWYgKHJlcy5pbmRleE9mKHF1ZXN0aW9uKSA8IDApIHtcbiAgICAgICAgcmVzLnB1c2gocXVlc3Rpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoW25hbWVdID0gW3F1ZXN0aW9uXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShoYXNoOiBhbnksIHF1ZXN0aW9uOiBRdWVzdGlvbiwgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgaWYgKCFyZXMpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSByZXMuaW5kZXhPZihxdWVzdGlvbik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBpZiAocmVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBkZWxldGUgaGFzaFtuYW1lXTtcbiAgICB9XG4gIH1cbiAgcGFuZWxBZGRlZChwYW5lbDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIsIHBhcmVudFBhbmVsOiBhbnksIHJvb3RQYW5lbDogYW55KSB7XG4gICAgaWYgKCFwYW5lbC5uYW1lKSB7XG4gICAgICBwYW5lbC5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUoXG4gICAgICAgIHRoaXMuZ2V0QWxsUGFuZWxzKGZhbHNlLCB0cnVlKSxcbiAgICAgICAgXCJwYW5lbFwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZCg8UGFuZWxNb2RlbEJhc2U+KDxhbnk+cGFuZWwpKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhbmVsQWRkZWQuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBuYW1lOiBwYW5lbC5uYW1lLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgcGFyZW50UGFuZWw6IHBhcmVudFBhbmVsLFxuICAgICAgcm9vdFBhbmVsOiByb290UGFuZWxcbiAgICB9KTtcbiAgfVxuICBwYW5lbFJlbW92ZWQocGFuZWw6IElFbGVtZW50KSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFJlbW92ZWQuZmlyZSh0aGlzLCB7IHBhbmVsOiBwYW5lbCwgbmFtZTogcGFuZWwubmFtZSB9KTtcbiAgfVxuICB2YWxpZGF0ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHZhbHVlOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgIGVycm9yOiA8YW55Pm51bGxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHZhbGlkYXRlUGFuZWwocGFuZWw6IElQYW5lbCk6IFN1cnZleUVycm9yIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlUGFuZWwuaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiBwYW5lbC5uYW1lLFxuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgZXJyb3I6IDxhbnk+bnVsbFxuICAgIH07XG4gICAgdGhpcy5vblZhbGlkYXRlUGFuZWwuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5lcnJvciA/IG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yLCB0aGlzKSA6IG51bGw7XG4gIH1cbiAgcHJvY2Vzc0h0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgaHRtbDogaHRtbCB9O1xuICAgIHRoaXMub25Qcm9jZXNzSHRtbC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NUZXh0KG9wdGlvbnMuaHRtbCwgdHJ1ZSk7XG4gIH1cbiAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSkudGV4dDtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4sXG4gICAgZG9FbmNvZGluZzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIHZhciByZXMgPSB7XG4gICAgICB0ZXh0OiB0aGlzLnByb2Nlc3NUZXh0Q29yZSh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUsIGRvRW5jb2RpbmcpLFxuICAgICAgaGFzQWxsVmFsdWVzT25MYXN0UnVuOiB0cnVlXG4gICAgfTtcbiAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJvY2Vzc1RleHRDb3JlKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4sXG4gICAgZG9FbmNvZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGV4dDtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBkb0VuY29kaW5nKTtcbiAgfVxuICBnZXRTdXJ2ZXlNYXJrZG93bkh0bWwoZWxlbWVudDogQmFzZSwgdGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgZWxlbWVudDogZWxlbWVudCwgdGV4dDogdGV4dCwgaHRtbDogPGFueT5udWxsIH07XG4gICAgdGhpcy5vblRleHRNYXJrZG93bi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmh0bWw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3JyZWN0ZWQgYW5zd2VycyBvbiBxdWl6XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudENvcmUodHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVpeiBxdWVzdGlvbiBudW1iZXIuIEl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSBnZXRRdWl6UXVlc3Rpb25zLmxlbmd0aCBiZWNhdXNlIHNvbWUgd2lkZ2V0cyBsaWtlIG1hdHJpeCBtYXkgaGF2ZSBzZXZlcmFsIHF1ZXN0aW9ucy4gRm9yIGV4YW1wbGUgYnkgbnVtYmVyIG9mIHJvd3NcbiAgICogQHNlZSBnZXRRdWl6UXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVpelF1ZXN0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWl6UXVlc3Rpb25zKCk7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyArPSAoPFF1ZXN0aW9uPnF1ZXN0aW9uc1tpXSkucXVpelF1ZXN0aW9uQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpbmNvcnJlY3RlZCBhbnN3ZXJzIG9uIHF1aXpcbiAgICovXG4gIHB1YmxpYyBnZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnRDb3JlKGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIGdldENvcnJlY3RlZEFuc3dlckNvdW50Q29yZShpc0NvcnJlY3Q6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1aXpRdWVzdGlvbnMoKTtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBxdWVzdGlvbjogPElRdWVzdGlvbj5udWxsLFxuICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICAgIGNvcnJlY3RBbnN3ZXJzOiAwLFxuICAgICAgaW5jb3JyZWN0QW5zd2VyczogMFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gPFF1ZXN0aW9uPnF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBxdWl6UXVlc3Rpb25Db3VudCA9IHEucXVpelF1ZXN0aW9uQ291bnQ7XG4gICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcTtcbiAgICAgIG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgPSBxLmNvcnJlY3RBbnN3ZXJDb3VudDtcbiAgICAgIG9wdGlvbnMuaW5jb3JyZWN0QW5zd2VycyA9IHF1aXpRdWVzdGlvbkNvdW50IC0gb3B0aW9ucy5jb3JyZWN0QW5zd2VycztcbiAgICAgIG9wdGlvbnMucmVzdWx0ID0gb3B0aW9ucy5xdWVzdGlvbi5pc0Fuc3dlckNvcnJlY3QoKTtcbiAgICAgIHRoaXMub25Jc0Fuc3dlckNvcnJlY3QuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgIGlmIChpc0NvcnJlY3QpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmVzdWx0IHx8IG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgPCBxdWl6UXVlc3Rpb25Db3VudCkge1xuICAgICAgICAgIHZhciBhZGRDb3VudCA9IG9wdGlvbnMuY29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgaWYgKGFkZENvdW50ID09IDAgJiYgb3B0aW9ucy5yZXN1bHQpIGFkZENvdW50ID0gMTtcbiAgICAgICAgICBjb3VudGVyICs9IGFkZENvdW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW9wdGlvbnMucmVzdWx0IHx8IG9wdGlvbnMuaW5jb3JyZWN0QW5zd2VycyA8IHF1aXpRdWVzdGlvbkNvdW50KSB7XG4gICAgICAgICAgY291bnRlciArPSBvcHRpb25zLmluY29ycmVjdEFuc3dlcnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cbiAgZ2V0Q29ycmVjdGVkQW5zd2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gIH1cbiAgZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gJ3RvcCcgb3IgJ2JvdHRvbScgaWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgUGFuZWwgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBob3cgbXVjaCB0aW1lIHRoZSBlbmQtdXNlciBzcGVudCBvZiB0aGUgc3VydmV5L3BhZ2UuXG4gICAqIElmIHRoZSB2YWx1ZSBkb2Vzbid0IGVxdWFsICdub25lJyB0aGVuIHN1cnZleSBjYWxscyBzdGFydFRpbWVyKCkgbWV0aG9kIG9uIHN1cnZleSByZW5kZXJpbmcuXG4gICAqIEBzZWUgc2hvd1RpbWVyUGFuZWxNb2RlXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIHN0b3BUaW1lclxuICAgKi9cbiAgcHVibGljIGdldCBzaG93VGltZXJQYW5lbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbFwiLCBcIm5vbmVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGltZXJQYW5lbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1RpbWVyUGFuZWxTaG93aW5nT25Ub3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lclN0YXJ0ZWQgJiYgdGhpcy5zaG93VGltZXJQYW5lbCA9PSBcInRvcFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNUaW1lclBhbmVsU2hvd2luZ09uQm90dG9tKCkge1xuICAgIHJldHVybiB0aGlzLmlzVGltZXJTdGFydGVkICYmIHRoaXMuc2hvd1RpbWVyUGFuZWwgPT0gXCJib3R0b21cIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gJ3BhZ2UnIG9yICdzdXJ2ZXknIHRvIHNob3cgdGhlIHRpbWVyIGluZm9ybWF0aW9uIGZvciBwYWdlIG9yIHN1cnZleSBvbmx5LlxuICAgKiBVc2Ugb25UaW1lclBhbmVsSW5mb1RleHQgZXZlbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgc2hvd1RpbWVyUGFuZWxcbiAgICogQHNlZSBvblRpbWVyUGFuZWxJbmZvVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93VGltZXJQYW5lbE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsIFwiYWxsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpbWVyUGFuZWxNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0aW1lckluZm9UZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHRleHQ6IHRoaXMuZ2V0VGltZXJJbmZvVGV4dCgpIH07XG4gICAgdGhpcy5vblRpbWVyUGFuZWxJbmZvVGV4dC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHZhciBsb2MgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcywgdHJ1ZSk7XG4gICAgbG9jLnRleHQgPSBvcHRpb25zLnRleHQ7XG4gICAgcmV0dXJuIGxvYy50ZXh0T3JIdG1sO1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvVGV4dCgpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKCFwYWdlKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcGFnZVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZShwYWdlLnRpbWVTcGVudCk7XG4gICAgdmFyIHN1cnZleVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZSh0aGlzLnRpbWVTcGVudCk7XG4gICAgdmFyIHBhZ2VMaW1pdFNlYyA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICB2YXIgcGFnZUxpbWl0ID0gdGhpcy5nZXREaXNwbGF5VGltZShwYWdlTGltaXRTZWMpO1xuICAgIHZhciBzdXJ2ZXlMaW1pdCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUodGhpcy5tYXhUaW1lVG9GaW5pc2gpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInBhZ2VcIilcbiAgICAgIHJldHVybiB0aGlzLmdldFRpbWVySW5mb1BhZ2VUZXh0KHBhZ2UsIHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJzdXJ2ZXlcIilcbiAgICAgIHJldHVybiB0aGlzLmdldFRpbWVySW5mb1N1cnZleVRleHQoc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJhbGxcIikge1xuICAgICAgaWYgKHBhZ2VMaW1pdFNlYyA8PSAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudEFsbFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBwYWdlU3BlbnQsXG4gICAgICAgICAgc3VydmV5U3BlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlTGltaXRTZWMgPiAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0QWxsXCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHBhZ2VTcGVudCxcbiAgICAgICAgICBwYWdlTGltaXQsXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYWdlVGV4dCA9IHRoaXMuZ2V0VGltZXJJbmZvUGFnZVRleHQocGFnZSwgcGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICAgICAgbGV0IHN1cnZleVRleHQgPSB0aGlzLmdldFRpbWVySW5mb1N1cnZleVRleHQoc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICAgIHJldHVybiBwYWdlVGV4dCArIFwiIFwiICsgc3VydmV5VGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9QYWdlVGV4dChcbiAgICBwYWdlOiBQYWdlTW9kZWwsXG4gICAgcGFnZVNwZW50OiBzdHJpbmcsXG4gICAgcGFnZUxpbWl0OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpID4gMFxuICAgICAgPyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KVxuICAgICAgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1N1cnZleVRleHQoXG4gICAgc3VydmV5U3BlbnQ6IHN0cmluZyxcbiAgICBzdXJ2ZXlMaW1pdDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWF4VGltZVRvRmluaXNoID4gMFxuICAgICAgPyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKTtcbiAgfVxuICBwcml2YXRlIGdldERpc3BsYXlUaW1lKHZhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB2YXIgbWluID0gTWF0aC5mbG9vcih2YWwgLyA2MCk7XG4gICAgdmFyIHNlYyA9IHZhbCAlIDYwO1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmIChtaW4gPiAwKSB7XG4gICAgICByZXMgKz0gbWluICsgXCIgXCIgKyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTWluXCIpO1xuICAgIH1cbiAgICBpZiAocmVzICYmIHNlYyA9PSAwKSByZXR1cm4gcmVzO1xuICAgIGlmIChyZXMpIHJlcyArPSBcIiBcIjtcbiAgICByZXR1cm4gcmVzICsgc2VjICsgXCIgXCIgKyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU2VjXCIpO1xuICB9XG4gIHByaXZhdGUgdGltZXJGdW5jOiBhbnkgPSBudWxsO1xuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBzdGFydCB0aW1lciB0aGF0IHdpbGwgY2FsY3VsYXRlIGhvdyBtdWNoIHRpbWUgZW5kLXVzZXIgc3BlbmRzIG9uIHRoZSBzdXJ2ZXkgb3Igb24gcGFnZXNcbiAgICogQHNlZSBzdG9wVGltZXJcbiAgICogQHNlZSB0aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBzdGFydFRpbWVyKCkge1xuICAgIGlmICh0aGlzLmlzVGltZXJTdGFydGVkIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGltZXJGdW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmRvVGltZXIoKTtcbiAgICB9O1xuICAgIHRoaXMuaXNUaW1lclN0YXJ0ZWQgPSB0cnVlO1xuICAgIFN1cnZleVRpbWVyLmluc3RhbmNlLnN0YXJ0KHRoaXMudGltZXJGdW5jKTtcbiAgfVxuICBzdGFydFRpbWVyRnJvbVVJKCkge1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsICE9IFwibm9uZVwiICYmIHRoaXMuc3RhdGUgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHRpbWVyLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSB0aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBzdG9wVGltZXIoKSB7XG4gICAgaWYgKCF0aGlzLmlzVGltZXJTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5pc1RpbWVyU3RhcnRlZCA9IGZhbHNlO1xuICAgIFN1cnZleVRpbWVyLmluc3RhbmNlLnN0b3AodGhpcy50aW1lckZ1bmMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0aW1lIGluIHNlY29uZHMgZW5kLXVzZXIgc3BlbmRzIG9uIHRoZSBzdXJ2ZXlcbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgUGFnZU1vZGVsLnRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIHRpbWVTcGVudCA9IDA7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQtdXNlciBoYXMgdG8gY29tcGxldGUgdGhlIHN1cnZleS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgdGhlIGVuZC11c2VyIGhhcyB1bmxpbWl0ZWQgbnVtYmVyIG9mIHRpbWUgdG8gZmluaXNoIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIG1heFRpbWVUb0ZpbmlzaFBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFRpbWVUb0ZpbmlzaCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQtdXNlciBoYXMgdG8gY29tcGxldGUgYSBwYWdlIGluIHRoZSBzdXJ2ZXkuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIHRpbWUuIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyB2YWx1ZSBmb3IgZXZlcnkgcGFnZS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgbWF4VGltZVRvRmluaXNoXG4gICAqIEBzZWUgUGFnZU1vZGVsLm1heFRpbWVUb0ZpbmlzaFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2hQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2hQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoUGFnZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAoIXBhZ2UgfHwgcGFnZS5tYXhUaW1lVG9GaW5pc2ggPCAwKSByZXR1cm4gMDtcbiAgICByZXR1cm4gcGFnZS5tYXhUaW1lVG9GaW5pc2ggPiAwXG4gICAgICA/IHBhZ2UubWF4VGltZVRvRmluaXNoXG4gICAgICA6IHRoaXMubWF4VGltZVRvRmluaXNoUGFnZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9UaW1lcigpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHBhZ2UudGltZVNwZW50ID0gcGFnZS50aW1lU3BlbnQgKyAxO1xuICAgIH1cbiAgICB0aGlzLnRpbWVTcGVudCA9IHRoaXMudGltZVNwZW50ICsgMTtcbiAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgaWYgKHRoaXMubWF4VGltZVRvRmluaXNoID4gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA9PSB0aGlzLnRpbWVTcGVudCkge1xuICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgfVxuICAgIGlmIChwYWdlKSB7XG4gICAgICB2YXIgcGFnZUxpbWl0ID0gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpO1xuICAgICAgaWYgKHBhZ2VMaW1pdCA+IDAgJiYgcGFnZUxpbWl0ID09IHBhZ2UudGltZVNwZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9JU3VydmV5SW1wbGVtZW50b3JcbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy9JU3VydmV5VHJpZ2dlck93bmVyXG4gIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W10ge1xuICAgIHZhciByZXN1bHQ6IGFueVtdID0gW107XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmdldFBhZ2VzQnlOYW1lcyhwYWdlcykpO1xuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5nZXRRdWVzdGlvbnNCeU5hbWVzKHF1ZXN0aW9ucykpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2V0VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgaXNWYXJpYWJsZTogYm9vbGVhbikge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIGlmIChpc1ZhcmlhYmxlKSB7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICAgIHZhciBmaXJzdE5hbWUgPSBwcm9jZXNzb3IuZ2V0Rmlyc3ROYW1lKG5hbWUpO1xuICAgICAgaWYgKGZpcnN0TmFtZSA9PSBuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFZhbHVlKGZpcnN0TmFtZSkpIHJldHVybjtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldFVuYmluZFZhbHVlKHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKSk7XG4gICAgICAgIHByb2Nlc3Nvci5zZXRWYWx1ZShkYXRhLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoZmlyc3ROYW1lLCBkYXRhW2ZpcnN0TmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb3B5VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgZnJvbU5hbWU6IHN0cmluZykge1xuICAgIGlmICghbmFtZSB8fCAhZnJvbU5hbWUpIHJldHVybjtcbiAgICB2YXIgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgIHZhciB2YWx1ZSA9IHByb2Nlc3Nvci5nZXRWYWx1ZShmcm9tTmFtZSwgdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpKTtcbiAgICB0aGlzLnNldFRyaWdnZXJWYWx1ZShuYW1lLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIGZvY3VzUXVlc3Rpb24obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lLCB0cnVlKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8ICFxdWVzdGlvbi5pc1Zpc2libGUgfHwgIXF1ZXN0aW9uLnBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcXVlc3Rpb24ucGFnZTtcbiAgICBxdWVzdGlvbi5mb2N1cygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXlcIiwgW1xuICB7XG4gICAgbmFtZTogXCJsb2NhbGVcIixcbiAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldExvY2FsZXMoKTtcbiAgICB9LFxuICAgIG9uR2V0VmFsdWU6IChvYmo6IGFueSk6IGFueSA9PiB7XG4gICAgICByZXR1cm4gb2JqLmxvY2FsZSA9PSBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSA/IG51bGwgOiBvYmoubG9jYWxlO1xuICAgIH1cbiAgfSxcbiAgeyBuYW1lOiBcInRpdGxlXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gIHsgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiIH0sXG4gIHsgbmFtZTogXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJmb2N1c09uRmlyc3RFcnJvcjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcImNvbXBsZXRlZEh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVkSHRtbFwiIH0sXG4gIHtcbiAgICBuYW1lOiBcImNvbXBsZXRlZEJlZm9yZUh0bWw6aHRtbFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZWRCZWZvcmVIdG1sXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uOmh0bWxjb25kaXRpb25zXCIsXG4gICAgY2xhc3NOYW1lOiBcImh0bWxjb25kaXRpb25pdGVtXCJcbiAgfSxcbiAgeyBuYW1lOiBcImxvYWRpbmdIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xvYWRpbmdIdG1sXCIgfSxcbiAgeyBuYW1lOiBcInBhZ2VzXCIsIGNsYXNzTmFtZTogXCJwYWdlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc1wiLFxuICAgIGFsdGVybmF0aXZlTmFtZTogXCJlbGVtZW50c1wiLFxuICAgIGJhc2VDbGFzc05hbWU6IFwicXVlc3Rpb25cIixcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBpc0xpZ2h0U2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICBvbkdldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udmVydGVyOiBhbnkpIHtcbiAgICAgIHZhciBwYWdlID0gb2JqLmFkZE5ld1BhZ2UoXCJcIik7XG4gICAgICBqc29uQ29udmVydGVyLnRvT2JqZWN0KHsgcXVlc3Rpb25zOiB2YWx1ZSB9LCBwYWdlKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInRyaWdnZXJzOnRyaWdnZXJzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl0cmlnZ2VyXCIsXG4gICAgY2xhc3NOYW1lUGFydDogXCJ0cmlnZ2VyXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY2FsY3VsYXRlZFZhbHVlczpjYWxjdWxhdGVkdmFsdWVzXCIsXG4gICAgY2xhc3NOYW1lOiBcImNhbGN1bGF0ZWR2YWx1ZVwiXG4gIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlJZFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7IG5hbWU6IFwic3VydmV5UG9zdElkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlTaG93RGF0YVNhdmluZzpib29sZWFuXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIFwiY29va2llTmFtZVwiLFxuICBcInNlbmRSZXN1bHRPblBhZ2VOZXh0OmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsXG4gICAgZGVmYXVsdDogXCJib3R0b21cIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwiYm90aFwiXVxuICB9LFxuICB7IG5hbWU6IFwic2hvd1ByZXZCdXR0b246Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93VGl0bGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93UGFnZVRpdGxlczpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInNob3dDb21wbGV0ZWRQYWdlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICBcIm5hdmlnYXRlVG9VcmxcIixcbiAge1xuICAgIG5hbWU6IFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uOnVybGNvbmRpdGlvbnNcIixcbiAgICBjbGFzc05hbWU6IFwidXJsY29uZGl0aW9uaXRlbVwiLFxuICAgIHZpc2libGU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgZGVmYXVsdDogXCJpbml0aWFsXCIsXG4gICAgY2hvaWNlczogW1wiaW5pdGlhbFwiLCBcInJhbmRvbVwiXVxuICB9LFxuICBcInNob3dQYWdlTnVtYmVyczpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIixcbiAgICBkZWZhdWx0OiBcIm9uXCIsXG4gICAgY2hvaWNlczogW1wib25cIiwgXCJvblBhZ2VcIiwgXCJvZmZcIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJ0b3BcIixcbiAgICBjaG9pY2VzOiBbXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCJdXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwidW5kZXJUaXRsZVwiLFxuICAgIGNob2ljZXM6IFtcInVuZGVySW5wdXRcIiwgXCJ1bmRlclRpdGxlXCJdXG4gIH0sXG4gIHsgbmFtZTogXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgZGVmYXVsdDogXCJ0b3BcIiwgY2hvaWNlczogW1widG9wXCIsIFwiYm90dG9tXCJdIH0sXG4gIHtcbiAgICBuYW1lOiBcInNob3dQcm9ncmVzc0JhclwiLFxuICAgIGRlZmF1bHQ6IFwib2ZmXCIsXG4gICAgY2hvaWNlczogW1wib2ZmXCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwiYm90aFwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJwcm9ncmVzc0JhclR5cGVcIixcbiAgICBkZWZhdWx0OiBcInBhZ2VzXCIsXG4gICAgY2hvaWNlczogW1wicGFnZXNcIiwgXCJxdWVzdGlvbnNcIiwgXCJjb3JyZWN0UXVlc3Rpb25zXCJdXG4gIH0sXG4gIHsgbmFtZTogXCJtb2RlXCIsIGRlZmF1bHQ6IFwiZWRpdFwiLCBjaG9pY2VzOiBbXCJlZGl0XCIsIFwiZGlzcGxheVwiXSB9LFxuICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJtYXhUZXh0TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICB7IG5hbWU6IFwibWF4T3RoZXJzTGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICBcImdvTmV4dFBhZ2VBdXRvbWF0aWM6Ym9vbGVhblwiLFxuICB7XG4gICAgbmFtZTogXCJjbGVhckludmlzaWJsZVZhbHVlc1wiLFxuICAgIGRlZmF1bHQ6IFwib25Db21wbGV0ZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJvbkNvbXBsZXRlXCIsIFwib25IaWRkZW5cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY2hlY2tFcnJvcnNNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJvbk5leHRQYWdlXCIsXG4gICAgY2hvaWNlczogW1wib25OZXh0UGFnZVwiLCBcIm9uVmFsdWVDaGFuZ2VkXCIsIFwib25Db21wbGV0ZVwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJ0ZXh0VXBkYXRlTW9kZVwiLFxuICAgIGRlZmF1bHQ6IFwib25CbHVyXCIsXG4gICAgY2hvaWNlczogW1wib25CbHVyXCIsIFwib25UeXBpbmdcIl1cbiAgfSxcbiAgeyBuYW1lOiBcInN0YXJ0U3VydmV5VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jU3RhcnRTdXJ2ZXlUZXh0XCIgfSxcbiAgeyBuYW1lOiBcInBhZ2VQcmV2VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFnZVByZXZUZXh0XCIgfSxcbiAgeyBuYW1lOiBcInBhZ2VOZXh0VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFnZU5leHRUZXh0XCIgfSxcbiAgeyBuYW1lOiBcImNvbXBsZXRlVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVUZXh0XCIgfSxcbiAgeyBuYW1lOiBcInJlcXVpcmVkVGV4dFwiLCBkZWZhdWx0OiBcIipcIiB9LFxuICBcInF1ZXN0aW9uU3RhcnRJbmRleFwiLFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlXCJcbiAgfSxcbiAgeyBuYW1lOiBcImZpcnN0UGFnZUlzU3RhcnRlZDpib29sZWFuXCIsIGRlZmF1bHQ6IGZhbHNlIH0sXG4gIHtcbiAgICBuYW1lOiBcImlzU2luZ2xlUGFnZTpib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgaXNTZXJpYWxpemFibGU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc09uUGFnZU1vZGVcIixcbiAgICBkZWZhdWx0OiBcInN0YW5kYXJkXCIsXG4gICAgY2hvaWNlczogW1wic2luZ2xlUGFnZVwiLCBcInN0YW5kYXJkXCIsIFwicXVlc3Rpb25QZXJQYWdlXCJdXG4gIH0sXG4gIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2g6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2hQYWdlOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93VGltZXJQYW5lbFwiLFxuICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJ0b3BcIiwgXCJib3R0b21cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJhbGxcIixcbiAgICBjaG9pY2VzOiBbXCJhbGxcIiwgXCJwYWdlXCIsIFwic3VydmV5XCJdXG4gIH1cbl0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsImltcG9ydCB7IEJhc2UsIFN1cnZleUVycm9yLCBJU3VydmV5RXJyb3JPd25lciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yLCBSZXF1cmVOdW1lcmljRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBhbnksIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsKSB7fVxufVxuLyoqXG4gKiBCYXNlIFN1cnZleUpTIHZhbGlkYXRvciBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVZhbGlkYXRvciBleHRlbmRzIEJhc2Uge1xuICBwdWJsaWMgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXI7XG4gIHB1YmxpYyBvbkFzeW5jQ29tcGxldGVkOiAocmVzdWx0OiBWYWxpZGF0b3JSZXN1bHQpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRlQWxsVmFsdWVzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0ZXh0XCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50ZXh0KSByZXR1cm4gdGhpcy50ZXh0O1xuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRFcnJvclRleHQobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBpc1J1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyID8gdGhpcy5lcnJvck93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXIgPyB0aGlzLmVycm9yT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDtcbiAgfVxuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyID8gdGhpcy5lcnJvck93bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDdXN0b21FcnJvcihuYW1lOiBzdHJpbmcpOiBTdXJ2ZXlFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChuYW1lKSwgdGhpcy5lcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRUeXBlKCkucmVwbGFjZShcInZhbGlkYXRvclwiLCBcIlwiKTtcbiAgICBpZiAoISF0aGlzLnRleHQpIHtcbiAgICAgIHJlcyArPSBcIiwgXCIgKyB0aGlzLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRvck93bmVyIHtcbiAgZ2V0VmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+O1xuICB2YWxpZGF0ZWRWYWx1ZTogYW55O1xuICBnZXRWYWxpZGF0b3JUaXRsZSgpOiBzdHJpbmc7XG4gIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnk7XG4gIGdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55O1xufVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJ1bm5lciB7XG4gIHByaXZhdGUgYXN5bmNWYWxpZGF0b3JzOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+O1xuICBwdWJsaWMgb25Bc3luY0NvbXBsZXRlZDogKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSA9PiB2b2lkO1xuICBwdWJsaWMgcnVuKG93bmVyOiBJVmFsaWRhdG9yT3duZXIpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmFsdWVzID0gbnVsbDtcbiAgICB2YXIgcHJvcGVydGllcyA9IG51bGw7XG4gICAgdGhpcy5wcmVwYXJlQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgdmFyIGFzeW5jUmVzdWx0czogQXJyYXk8U3VydmV5RXJyb3I+ID0gW107XG4gICAgdmFyIHZhbGlkYXRvcnMgPSBvd25lci5nZXRWYWxpZGF0b3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsaWRhdG9yID0gdmFsaWRhdG9yc1tpXTtcbiAgICAgIGlmICghdmFsdWVzICYmIHZhbGlkYXRvci5pc1ZhbGlkYXRlQWxsVmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IG93bmVyLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpO1xuICAgICAgICBwcm9wZXJ0aWVzID0gb3duZXIuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkYXRvci5pc0FzeW5jKSB7XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0b3JzLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgdmFsaWRhdG9yLm9uQXN5bmNDb21wbGV0ZWQgPSAocmVzdWx0OiBWYWxpZGF0b3JSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoISFyZXN1bHQgJiYgISFyZXN1bHQuZXJyb3IpIGFzeW5jUmVzdWx0cy5wdXNoKHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgaWYgKCF0aGlzLm9uQXN5bmNDb21wbGV0ZWQpIHJldHVybjtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXN5bmNWYWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hc3luY1ZhbGlkYXRvcnNbaV0uaXNSdW5uaW5nKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25Bc3luY0NvbXBsZXRlZChhc3luY1Jlc3VsdHMpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICB2YWxpZGF0b3JzID0gb3duZXIuZ2V0VmFsaWRhdG9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbGlkYXRvciA9IHZhbGlkYXRvcnNbaV07XG5cbiAgICAgIHZhciB2YWxpZGF0b3JSZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoXG4gICAgICAgIG93bmVyLnZhbGlkYXRlZFZhbHVlLFxuICAgICAgICBvd25lci5nZXRWYWxpZGF0b3JUaXRsZSgpLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICAgICk7XG4gICAgICBpZiAoISF2YWxpZGF0b3JSZXN1bHQgJiYgISF2YWxpZGF0b3JSZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmVzLnB1c2godmFsaWRhdG9yUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuYXN5bmNWYWxpZGF0b3JzLmxlbmd0aCA9PSAwICYmICEhdGhpcy5vbkFzeW5jQ29tcGxldGVkKVxuICAgICAgdGhpcy5vbkFzeW5jQ29tcGxldGVkKFtdKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJlcGFyZUFzeW5jVmFsaWRhdG9ycygpIHtcbiAgICBpZiAoISF0aGlzLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFzeW5jVmFsaWRhdG9yc1tpXS5vbkFzeW5jQ29tcGxldGVkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3luY1ZhbGlkYXRvcnMgPSBbXTtcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSBudW1lcmljIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWVyaWNWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluVmFsdWU6IG51bWJlciA9IG51bGwsIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJudW1lcmljdmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIGlmICghSGVscGVycy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXcgUmVxdXJlTnVtZXJpY0Vycm9yKG51bGwsIHRoaXMuZXJyb3JPd25lcilcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1pblZhbHVlID4gcmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4VmFsdWUgIT09IG51bGwgJiYgdGhpcy5tYXhWYWx1ZSA8IHJlc3VsdC52YWx1ZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyBudWxsIDogcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHZhciB2TmFtZSA9IG5hbWUgPyBuYW1lIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInZhbHVlXCIpO1xuICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsICYmIHRoaXMubWF4VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNaW5NYXhcIilcbiAgICAgICAgW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAgIC5nZXRTdHJpbmcoXCJudW1lcmljTWluXCIpXG4gICAgICAgICAgW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1pblZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNYXhcIilcbiAgICAgICAgW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1heFZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVmFsaWRhdGUgdGV4dCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1pbkxlbmd0aDogbnVtYmVyID0gMCxcbiAgICBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgPSAwLFxuICAgIHB1YmxpYyBhbGxvd0RpZ2l0cyA9IHRydWVcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRleHR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHZhbHVlICE9PSBcIlwiICYmIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmFsbG93RGlnaXRzKSB7XG4gICAgICB2YXIgcmVnID0gL15bQS1aYS16XFxzXSokLztcbiAgICAgIGlmICghcmVnLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4TGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdGhpcy5tYXhMZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbk1heExlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgsIHRoaXMubWF4TGVuZ3RoKTtcbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbkxlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgpO1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWF4TGVuZ3RoXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhMZW5ndGgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbnN3ZXJDb3VudFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtaW5Db3VudDogbnVtYmVyID0gbnVsbCwgcHVibGljIG1heENvdW50OiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yICE9IEFycmF5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY291bnQgPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKHRoaXMubWluQ291bnQgJiYgY291bnQgPCB0aGlzLm1pbkNvdW50KSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtaW5TZWxlY3RFcnJvclwiKVxuICAgICAgICAgICAgW1wiZm9ybWF0XCJdKHRoaXMubWluQ291bnQpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heENvdW50ICYmIGNvdW50ID4gdGhpcy5tYXhDb3VudCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuZ2V0U3RyaW5nKFwibWF4U2VsZWN0RXJyb3JcIilcbiAgICAgICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1heENvdW50KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxufVxuLyoqXG4gKiBVc2UgaXQgdG8gdmFsaWRhdGUgdGhlIHRleHQgYnkgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2V4VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlZ2V4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJlZ2V4dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICghdGhpcy5yZWdleCB8fCBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAodGhpcy5yZWdleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmhhc0Vycm9yKHJlLCB2YWx1ZVtpXSwgbmFtZSk7XG4gICAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc0Vycm9yKHJlLCB2YWx1ZSwgbmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvcihyZTogUmVnRXhwLCB2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmIChyZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIGUtbWFpbCBhZGRyZXNzIGluIHRoZSB0ZXh0IGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIHByaXZhdGUgcmUgPSAvXigoW148PigpXFxbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChbXjw+KCk9W1xcXVxcLiw7Olxcc0BcXFwiXStcXC4pK1tePD4oKT1bXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJlbWFpbHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaW52YWxpZEVtYWlsXCIpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBlcnJvciBpZiBleHByZXNzaW9uIHJldHVybnMgZmFsc2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25WYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1J1bm5pbmdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJleHByZXNzaW9udmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRlQWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZW5zdXJlQ29uZGl0aW9uUnVubmVyKCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25SdW5uZXIuaXNBc3luYztcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUnVubmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmVuc3VyZUNvbmRpdGlvblJ1bm5lcigpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gcmVzID0+IHtcbiAgICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICghIXRoaXMub25Bc3luY0NvbXBsZXRlZCkge1xuICAgICAgICB0aGlzLm9uQXN5bmNDb21wbGV0ZWQodGhpcy5nZW5lcmF0ZUVycm9yKHJlcywgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSB0cnVlO1xuICAgIHZhciByZXMgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAodGhpcy5jb25kaXRpb25SdW5uZXIuaXNBc3luYykgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5pc1J1bm5pbmdWYWx1ZSA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRXJyb3IocmVzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRXJyb3IocmVzOiBib29sZWFuLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImludmFsaWRFeHByZXNzaW9uXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5leHByZXNzaW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW5zdXJlQ29uZGl0aW9uUnVubmVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5leHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcInN1cnZleXZhbGlkYXRvclwiLCBbXG4gIHsgbmFtZTogXCJ0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCIgfVxuXSk7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm51bWVyaWN2YWxpZGF0b3JcIixcbiAgW1wibWluVmFsdWU6bnVtYmVyXCIsIFwibWF4VmFsdWU6bnVtYmVyXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidGV4dHZhbGlkYXRvclwiLFxuICBbXCJtaW5MZW5ndGg6bnVtYmVyXCIsIFwibWF4TGVuZ3RoOm51bWJlclwiLCBcImFsbG93RGlnaXRzOmJvb2xlYW5cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgVGV4dFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJhbnN3ZXJjb3VudHZhbGlkYXRvclwiLFxuICBbXCJtaW5Db3VudDpudW1iZXJcIiwgXCJtYXhDb3VudDpudW1iZXJcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQW5zd2VyQ291bnRWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmVnZXh2YWxpZGF0b3JcIixcbiAgW1wicmVnZXhcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVnZXhWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZW1haWx2YWxpZGF0b3JcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRW1haWxWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9udmFsaWRhdG9yXCIsXG4gIFtcImV4cHJlc3Npb246Y29uZGl0aW9uXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25WYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy92YWxpZGF0b3IudHMiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuLi9wYWdlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsQmFzZSB9IGZyb20gXCIuLi9wYW5lbFwiO1xuaW1wb3J0IHsgU3VydmV5UGFuZWxCYXNlIH0gZnJvbSBcIi4vcGFuZWwtYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UGFnZSBleHRlbmRzIFN1cnZleVBhbmVsQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFBhbmVsQmFzZSgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucGFnZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhZ2UoKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbEJhc2UgYXMgUGFnZU1vZGVsO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKHRoaXMucGFnZSA9PSBudWxsIHx8IHRoaXMuc3VydmV5ID09IG51bGwgfHwgdGhpcy5jcmVhdG9yID09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB2YXIgdGl0bGUgPSB0aGlzLnJlbmRlclRpdGxlKCk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gdGhpcy5yZW5kZXJEZXNjcmlwdGlvbigpO1xuICAgIHZhciByb3dzID0gdGhpcy5yZW5kZXJSb3dzKHRoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj1cInJvb3RcIiBjbGFzc05hbWU9e3RoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMucGFnZS5yb290fT5cbiAgICAgICAge3RpdGxlfVxuICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgIHtyb3dzfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGUoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHJldHVybiBudWxsO1xuICAgIHZhciB0ZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKHRoaXMucGFnZS5sb2NUaXRsZSk7XG4gICAgcmV0dXJuIDxoNCBjbGFzc05hbWU9e3RoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMucGFnZVRpdGxlfT57dGV4dH08L2g0PjtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRGVzY3JpcHRpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHJldHVybiBudWxsO1xuICAgIHZhciB0ZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKHRoaXMucGFnZS5sb2NEZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnBhbmVsQmFzZS5jc3NDbGFzc2VzLnBhZ2VEZXNjcmlwdGlvbn0+e3RleHR9PC9kaXY+O1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcGFnZS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJlYWN0U3VydmV5TW9kZWwgfSBmcm9tIFwiLi9yZWFjdHN1cnZleW1vZGVsXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQYWdlIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgU3VydmV5TmF2aWdhdGlvbiB9IGZyb20gXCIuL3JlYWN0U3VydmV5TmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IFN1cnZleVByb2dyZXNzIH0gZnJvbSBcIi4vcmVhY3RTdXJ2ZXlQcm9ncmVzc1wiO1xuaW1wb3J0IHsgU3VydmV5VGltZXJQYW5lbCB9IGZyb20gXCIuL3JlYWN0dGltZXJwYW5lbFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEJhc2UsIFN1cnZleUxvY1N0cmluZyB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuLi9zdHlsZXNtYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXkgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50QmFzZSBpbXBsZW1lbnRzIElTdXJ2ZXlDcmVhdG9yIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgY3NzVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuY3VycmVudFR5cGU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgY3NzVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgU3R5bGVzTWFuYWdlci5hcHBseVRoZW1lKHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgc3VydmV5OiBSZWFjdFN1cnZleU1vZGVsO1xuICBwcml2YXRlIGlzQ3VycmVudFBhZ2VDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgb25DdXJyZW50UGFnZUNoYW5nZWRIYW5kbGVyID0gKHNlbmRlcjogYW55LCBvcHRpb25zOiBhbnkpOiBhbnkgPT4ge1xuICAgIHRoaXMuaXNDdXJyZW50UGFnZUNoYW5nZWQgPSB0cnVlO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVUcnlBZ2FpbkNsaWNrID0gdGhpcy5oYW5kbGVUcnlBZ2FpbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jcmVhdGVTdXJ2ZXkocHJvcHMpO1xuICAgIHRoaXMudXBkYXRlU3VydmV5KHByb3BzLCB7fSk7XG4gICAgLy9zZXQgdGhlIGZpcnN0IHBhZ2VcbiAgICB2YXIgZHVtbXkgPSB0aGlzLnN1cnZleS5jdXJyZW50UGFnZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLnN1cnZleTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBhbnksIHByZXZTdGF0ZTogYW55KSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKTtcbiAgICBpZiAodGhpcy5pc0N1cnJlbnRQYWdlQ2hhbmdlZCkge1xuICAgICAgdGhpcy5pc0N1cnJlbnRQYWdlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zdXJ2ZXkuc2Nyb2xsVG9Ub3BPblBhZ2VDaGFuZ2UoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdXJ2ZXkodGhpcy5wcm9wcywgcHJldlByb3BzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIHZhciBlbCA9IHRoaXMucmVmc1tcInJvb3RcIl07XG4gICAgaWYgKGVsICYmIHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5kb0FmdGVyUmVuZGVyU3VydmV5KGVsKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnN0b3BUaW1lcigpO1xuICAgICAgdGhpcy5zdXJ2ZXkub25DdXJyZW50UGFnZUNoYW5nZWQucmVtb3ZlKHRoaXMub25DdXJyZW50UGFnZUNoYW5nZWRIYW5kbGVyKTtcbiAgICB9XG4gIH1cbiAgZG9SZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciByZW5kZXJSZXN1bHQ7XG4gICAgaWYgKHRoaXMuc3VydmV5LnN0YXRlID09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgIHJlbmRlclJlc3VsdCA9IHRoaXMucmVuZGVyQ29tcGxldGVkKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN1cnZleS5zdGF0ZSA9PSBcImNvbXBsZXRlZGJlZm9yZVwiKSB7XG4gICAgICByZW5kZXJSZXN1bHQgPSB0aGlzLnJlbmRlckNvbXBsZXRlZEJlZm9yZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgIHJlbmRlclJlc3VsdCA9IHRoaXMucmVuZGVyTG9hZGluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJzdGFydGluZ1wiKSB7XG4gICAgICByZW5kZXJSZXN1bHQgPSB0aGlzLnJlbmRlclN0YXJ0UGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW5kZXJSZXN1bHQgPSB0aGlzLnJlbmRlclN1cnZleSgpO1xuICAgIH1cbiAgICB2YXIgdGl0bGUgPSB0aGlzLnJlbmRlclRpdGxlKCk7XG4gICAgdmFyIG9uU3VibWl0ID0gZnVuY3Rpb24oZXZlbnQ6IFJlYWN0LkZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgcmVmPVwicm9vdFwiIGNsYXNzTmFtZT17dGhpcy5jc3Mucm9vdH0+XG4gICAgICAgIDxmb3JtIG9uU3VibWl0PXtvblN1Ym1pdH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdl9jdXN0b21faGVhZGVyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MuY29udGFpbmVyfT5cbiAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgIHtyZW5kZXJSZXN1bHR9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5kb1JlbmRlcigpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmNzcztcbiAgfVxuICBwdWJsaWMgc2V0IGNzcyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zdXJ2ZXkuY3NzID0gdmFsdWU7XG4gIH1cbiAgaGFuZGxlVHJ5QWdhaW5DbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5zdXJ2ZXkuZG9Db21wbGV0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJDb21wbGV0ZWQoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkuc2hvd0NvbXBsZXRlZFBhZ2UpIHJldHVybiBudWxsO1xuICAgIHZhciBjb21wbGV0ZWRTdGF0ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuc3VydmV5LmNvbXBsZXRlZFN0YXRlKSB7XG4gICAgICB2YXIgdHJ5QWdhaW5CdXR0b24gPSBudWxsO1xuICAgICAgaWYgKHRoaXMuc3VydmV5LmNvbXBsZXRlZFN0YXRlID09IFwiZXJyb3JcIikge1xuICAgICAgICB2YXIgYnRuVGV4dCA9IHRoaXMuc3VydmV5LmdldExvY1N0cmluZyhcInNhdmVBZ2FpbkJ1dHRvblwiKTtcbiAgICAgICAgdHJ5QWdhaW5CdXR0b24gPSAoXG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPXtcImJ1dHRvblwifVxuICAgICAgICAgICAgdmFsdWU9e2J0blRleHR9XG4gICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuY3NzLnNhdmVEYXRhLnNhdmVBZ2FpbkJ1dHRvbn1cbiAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlVHJ5QWdhaW5DbGlja31cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdmFyIGNzcyA9IHRoaXMuY3NzLnNhdmVEYXRhW3RoaXMuc3VydmV5LmNvbXBsZXRlZFN0YXRlXTtcbiAgICAgIGNvbXBsZXRlZFN0YXRlID0gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3Muc2F2ZURhdGEucm9vdH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc30+XG4gICAgICAgICAgICA8c3Bhbj57dGhpcy5zdXJ2ZXkuY29tcGxldGVkU3RhdGVUZXh0fTwvc3Bhbj5cbiAgICAgICAgICAgIHt0cnlBZ2FpbkJ1dHRvbn1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMuc3VydmV5LnByb2Nlc3NlZENvbXBsZXRlZEh0bWwgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9XG4gICAgICAgICAgY2xhc3NOYW1lPXtbdGhpcy5jc3MuYm9keSwgdGhpcy5jc3MuY29tcGxldGVkUGFnZV0uam9pbihcIiBcIil9XG4gICAgICAgIC8+XG4gICAgICAgIHtjb21wbGV0ZWRTdGF0ZX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNvbXBsZXRlZEJlZm9yZSgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiB0aGlzLnN1cnZleS5wcm9jZXNzZWRDb21wbGV0ZWRCZWZvcmVIdG1sIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWxWYWx1ZX0gY2xhc3NOYW1lPXt0aGlzLmNzcy5ib2R5fSAvPlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckxvYWRpbmcoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBodG1sVmFsdWUgPSB7IF9faHRtbDogdGhpcy5zdXJ2ZXkucHJvY2Vzc2VkTG9hZGluZ0h0bWwgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSBjbGFzc05hbWU9e3RoaXMuY3NzLmJvZHl9IC8+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyU3RhcnRQYWdlKCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgc3RhcnRlZFBhZ2UgPSB0aGlzLnN1cnZleS5zdGFydGVkUGFnZVxuICAgICAgPyB0aGlzLnJlbmRlclBhZ2UodGhpcy5zdXJ2ZXkuc3RhcnRlZFBhZ2UpXG4gICAgICA6IG51bGw7XG4gICAgdmFyIHBhZ2VJZCA9IHRoaXMuc3VydmV5LnN0YXJ0ZWRQYWdlID8gdGhpcy5zdXJ2ZXkuc3RhcnRlZFBhZ2UuaWQgOiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGlkPXtwYWdlSWR9IGNsYXNzTmFtZT17dGhpcy5jc3MuYm9keX0+XG4gICAgICAgICAge3RoaXMucmVuZGVyTmF2aWdhdGlvbihcInRvcFwiKX1cbiAgICAgICAgICB7c3RhcnRlZFBhZ2V9XG4gICAgICAgICAge3RoaXMucmVuZGVyTmF2aWdhdGlvbihcImJvdHRvbVwiKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJTdXJ2ZXkoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjdXJyZW50UGFnZSA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlXG4gICAgICA/IHRoaXMucmVuZGVyUGFnZSh0aGlzLnN1cnZleS5jdXJyZW50UGFnZSlcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgcGFnZUlkID0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UgPyB0aGlzLnN1cnZleS5jdXJyZW50UGFnZS5pZCA6IFwiXCI7XG4gICAgdmFyIHRvcFByb2dyZXNzID0gdGhpcy5zdXJ2ZXkuaXNTaG93UHJvZ3Jlc3NCYXJPblRvcFxuICAgICAgPyB0aGlzLnJlbmRlclByb2dyZXNzKHRydWUpXG4gICAgICA6IG51bGw7XG4gICAgdmFyIGJvdHRvbVByb2dyZXNzID0gdGhpcy5zdXJ2ZXkuaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbVxuICAgICAgPyB0aGlzLnJlbmRlclByb2dyZXNzKGZhbHNlKVxuICAgICAgOiBudWxsO1xuICAgIGlmICghY3VycmVudFBhZ2UpIHtcbiAgICAgIGN1cnJlbnRQYWdlID0gdGhpcy5yZW5kZXJFbXB0eVN1cnZleSgpO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBpZD17cGFnZUlkfVxuICAgICAgICBjbGFzc05hbWU9eyFjdXJyZW50UGFnZSA/IHRoaXMuY3NzLmJvZHlFbXB0eSA6IHRoaXMuY3NzLmJvZHl9XG4gICAgICA+XG4gICAgICAgIHt0b3BQcm9ncmVzc31cbiAgICAgICAge3RoaXMucmVuZGVyVGltZXJQYW5lbChcInRvcFwiKX1cbiAgICAgICAge3RoaXMucmVuZGVyTmF2aWdhdGlvbihcInRvcFwiKX1cbiAgICAgICAge2N1cnJlbnRQYWdlfVxuICAgICAgICB7dGhpcy5yZW5kZXJUaW1lclBhbmVsKFwiYm90dG9tXCIpfVxuICAgICAgICB7Ym90dG9tUHJvZ3Jlc3N9XG4gICAgICAgIHt0aGlzLnJlbmRlck5hdmlnYXRpb24oXCJib3R0b21cIil9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJUaXRsZSgpOiBKU1guRWxlbWVudCB7XG4gICAgbGV0IHRpdGxlID0gbnVsbDtcbiAgICBsZXQgZGVzY3JpcHRpb24gPSBudWxsO1xuICAgIGlmICh0aGlzLnN1cnZleS50aXRsZSAmJiB0aGlzLnN1cnZleS5zaG93VGl0bGUpIHtcbiAgICAgIHRpdGxlID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKHRoaXMuc3VydmV5LmxvY1RpdGxlKTtcbiAgICAgIGRlc2NyaXB0aW9uID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKFxuICAgICAgICB0aGlzLnN1cnZleS5sb2NEZXNjcmlwdGlvblxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRpdGxlID8gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLmhlYWRlcn0+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9e3RoaXMuY3NzLnRpdGxlfT57dGl0bGV9PC9oMz5cbiAgICAgICAgPGg1IGNsYXNzTmFtZT17dGhpcy5jc3MuZGVzY3JpcHRpb259PntkZXNjcmlwdGlvbn08L2g1PlxuICAgICAgPC9kaXY+XG4gICAgKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclRpbWVyUGFuZWwobG9jYXRpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLnN1cnZleS5zaG93VGltZXJQYW5lbCAhPSBsb2NhdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIDxTdXJ2ZXlUaW1lclBhbmVsIHN1cnZleT17dGhpcy5zdXJ2ZXl9IC8+O1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJQYWdlKHBhZ2U6IFBhZ2VNb2RlbCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1cnZleVBhZ2VcbiAgICAgICAgc3VydmV5PXt0aGlzLnN1cnZleX1cbiAgICAgICAgcGFnZT17cGFnZX1cbiAgICAgICAgY3NzPXt0aGlzLmNzc31cbiAgICAgICAgY3JlYXRvcj17dGhpc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUHJvZ3Jlc3MoaXNUb3A6IGJvb2xlYW4pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxTdXJ2ZXlQcm9ncmVzcyBzdXJ2ZXk9e3RoaXMuc3VydmV5fSBjc3M9e3RoaXMuY3NzfSBpc1RvcD17aXNUb3B9IC8+O1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJOYXZpZ2F0aW9uKG5hdlBvc2l0aW9uOiBzdHJpbmcpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgIT09IFwiYm90aFwiICYmXG4gICAgICAodGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPT09IFwibm9uZVwiIHx8XG4gICAgICAgIHRoaXMuc3VydmV5LmlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nICE9PSBuYXZQb3NpdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gPFN1cnZleU5hdmlnYXRpb24gc3VydmV5PXt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30gLz47XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVtcHR5U3VydmV5KCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPHNwYW4+e3RoaXMuc3VydmV5LmVtcHR5U3VydmV5VGV4dH08L3NwYW4+O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkobmV3UHJvcHM6IGFueSkge1xuICAgIGlmICghbmV3UHJvcHMpIG5ld1Byb3BzID0ge307XG4gICAgaWYgKG5ld1Byb3BzKSB7XG4gICAgICBpZiAobmV3UHJvcHMubW9kZWwpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkgPSBuZXdQcm9wcy5tb2RlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXdQcm9wcy5qc29uKSB7XG4gICAgICAgICAgdGhpcy5zdXJ2ZXkgPSBuZXcgUmVhY3RTdXJ2ZXlNb2RlbChuZXdQcm9wcy5qc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cnZleSA9IG5ldyBSZWFjdFN1cnZleU1vZGVsKCk7XG4gICAgfVxuICAgIGlmICghIW5ld1Byb3BzLmNzcykge1xuICAgICAgdGhpcy5zdXJ2ZXkubWVyZ2VDc3MobmV3UHJvcHMuY3NzLCB0aGlzLmNzcyk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3VydmV5RXZlbnRzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVN1cnZleShuZXdQcm9wczogYW55LCBvbGRQcm9wczogYW55KSB7XG4gICAgaWYgKCFuZXdQcm9wcykgcmV0dXJuO1xuICAgIG9sZFByb3BzID0gb2xkUHJvcHMgfHwge307XG4gICAgZm9yICh2YXIga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICBpZiAoa2V5ID09IFwibW9kZWxcIiB8fCBrZXkgPT0gXCJjaGlsZHJlblwiIHx8IGtleSA9PSBcImNzc1wiIHx8IGtleSA9PSBcImpzb25cIilcbiAgICAgICAgY29udGludWU7XG4gICAgICBpZiAobmV3UHJvcHNba2V5XSA9PT0gb2xkUHJvcHNba2V5XSkgY29udGludWU7XG5cbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIm9uXCIpID09IDAgJiYgdGhpcy5zdXJ2ZXlba2V5XSAmJiB0aGlzLnN1cnZleVtrZXldLmFkZCkge1xuICAgICAgICBpZiAoISFvbGRQcm9wc1trZXldKSB7XG4gICAgICAgICAgdGhpcy5zdXJ2ZXlba2V5XS5yZW1vdmUob2xkUHJvcHNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdXJ2ZXlba2V5XS5hZGQobmV3UHJvcHNba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1cnZleVtrZXldID0gbmV3UHJvcHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHNldFN1cnZleUV2ZW50cygpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLnN1cnZleS5yZW5kZXJDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNvdW50ZXIgPVxuICAgICAgICAhIXNlbGYuc3RhdGUgJiYgISFzZWxmLnN0YXRlLm1vZGVsQ2hhbmdlZCA/IHNlbGYuc3RhdGUubW9kZWxDaGFuZ2VkIDogMDtcbiAgICAgIHNlbGYuc2V0U3RhdGUoeyBtb2RlbENoYW5nZWQ6IGNvdW50ZXIgKyAxIH0pO1xuICAgIH07XG4gICAgdGhpcy5zdXJ2ZXkub25QYXJ0aWFsU2VuZC5hZGQoc2VuZGVyID0+IHtcbiAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zdXJ2ZXkub25DdXJyZW50UGFnZUNoYW5nZWQuYWRkKHRoaXMub25DdXJyZW50UGFnZUNoYW5nZWRIYW5kbGVyKTtcbiAgfVxuXG4gIC8vSVN1cnZleUNyZWF0b3JcbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb24pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIFJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKFxuICAgICAgcXVlc3Rpb24uZ2V0VGVtcGxhdGUoKSxcbiAgICAgIHtcbiAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICBpc0Rpc3BsYXlNb2RlOiBxdWVzdGlvbi5pc1JlYWRPbmx5LFxuICAgICAgICBjcmVhdG9yOiB0aGlzXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyRXJyb3IoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZXJyb3I6IFN1cnZleUVycm9yLFxuICAgIGNzc0NsYXNzZXM6IGFueVxuICApOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYga2V5PXtrZXl9PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuZXJyb3IuaWNvbn0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmVycm9yLml0ZW19PlxuICAgICAgICAgIDxTdXJ2ZXlMb2NTdHJpbmcgbG9jU3RyPXtlcnJvci5sb2NUZXh0fSAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHB1YmxpYyBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICB9XG4gIHB1YmxpYyBxdWVzdGlvbkVycm9yTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXkudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFN1cnZleU5hdmlnYXRpb25CYXNlIH0gZnJvbSBcIi4vcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5TmF2aWdhdGlvbiBleHRlbmRzIFN1cnZleU5hdmlnYXRpb25CYXNlIHtcbiAgcHJpdmF0ZSBtb3VzZURvd25QYWdlOiBhbnkgPSBudWxsO1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlUHJldkNsaWNrID0gdGhpcy5oYW5kbGVQcmV2Q2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZU5leHRDbGljayA9IHRoaXMuaGFuZGxlTmV4dENsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVOZXh0TW91c2VEb3duID0gdGhpcy5oYW5kbGVOZXh0TW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVDb21wbGV0ZUNsaWNrID0gdGhpcy5oYW5kbGVDb21wbGV0ZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVTdGFydENsaWNrID0gdGhpcy5oYW5kbGVTdGFydENsaWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgaGFuZGxlUHJldkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnN1cnZleS5wcmV2UGFnZSgpO1xuICB9XG4gIGhhbmRsZU5leHRDbGljayhldmVudDogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5tb3VzZURvd25QYWdlICYmIHRoaXMubW91c2VEb3duUGFnZSAhPT0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5tb3VzZURvd25QYWdlID0gbnVsbDtcbiAgICB0aGlzLnN1cnZleS5uZXh0UGFnZSgpO1xuICB9XG4gIGhhbmRsZU5leHRNb3VzZURvd24oZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubW91c2VEb3duUGFnZSA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlO1xuICAgIHZhciBlbDogYW55ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAoISFlbCAmJiAhIWVsW1wiYmx1clwiXSkgZWxbXCJibHVyXCJdKCk7XG4gIH1cbiAgaGFuZGxlQ29tcGxldGVDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5zdXJ2ZXkuY29tcGxldGVMYXN0UGFnZSgpO1xuICB9XG4gIGhhbmRsZVN0YXJ0Q2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc3VydmV5LnN0YXJ0KCk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8IHRoaXMuc3VydmV5LmlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nID09PSBcIm5vbmVcIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHZhciBpc1N0YXJ0ZWRQYWdlID0gdGhpcy5zdXJ2ZXkuc3RhdGUgPT09IFwic3RhcnRpbmdcIjtcbiAgICB2YXIgcHJldkJ1dHRvbiA9XG4gICAgICAhaXNTdGFydGVkUGFnZSAmJiAhdGhpcy5zdXJ2ZXkuaXNGaXJzdFBhZ2UgJiYgdGhpcy5zdXJ2ZXkuaXNTaG93UHJldkJ1dHRvblxuICAgICAgICA/IHRoaXMucmVuZGVyQnV0dG9uKFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcmV2Q2xpY2ssXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkucGFnZVByZXZUZXh0LFxuICAgICAgICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5wcmV2XG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGw7XG4gICAgdmFyIG5leHRCdXR0b24gPVxuICAgICAgIWlzU3RhcnRlZFBhZ2UgJiYgIXRoaXMuc3VydmV5LmlzTGFzdFBhZ2VcbiAgICAgICAgPyB0aGlzLnJlbmRlckJ1dHRvbihcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV4dENsaWNrLFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXh0TW91c2VEb3duLFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkucGFnZU5leHRUZXh0LFxuICAgICAgICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5uZXh0XG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGw7XG4gICAgdmFyIGNvbXBsZXRlQnV0dG9uID1cbiAgICAgICFpc1N0YXJ0ZWRQYWdlICYmIHRoaXMuc3VydmV5LmlzTGFzdFBhZ2UgJiYgdGhpcy5zdXJ2ZXkuaXNFZGl0TW9kZVxuICAgICAgICA/IHRoaXMucmVuZGVyQnV0dG9uKFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb21wbGV0ZUNsaWNrLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LmNvbXBsZXRlVGV4dCxcbiAgICAgICAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24uY29tcGxldGVcbiAgICAgICAgICApXG4gICAgICAgIDogbnVsbDtcbiAgICB2YXIgc3RhcnRCdXR0b24gPSBpc1N0YXJ0ZWRQYWdlXG4gICAgICA/IHRoaXMucmVuZGVyQnV0dG9uKFxuICAgICAgICAgIHRoaXMuaGFuZGxlU3RhcnRDbGljayxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHRoaXMuc3VydmV5LnN0YXJ0U3VydmV5VGV4dCxcbiAgICAgICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLnN0YXJ0XG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLmZvb3Rlcn0+XG4gICAgICAgIHtzdGFydEJ1dHRvbn1cbiAgICAgICAge3ByZXZCdXR0b259XG4gICAgICAgIHtuZXh0QnV0dG9ufVxuICAgICAgICB7Y29tcGxldGVCdXR0b259XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJCdXR0b24oXG4gICAgY2xpY2s6IGFueSxcbiAgICBtb3VzZURvd246IGFueSxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgYnRuQ2xhc3NOYW1lOiBzdHJpbmdcbiAgKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBzdHlsZSA9IHsgbWFyZ2luUmlnaHQ6IFwiNXB4XCIgfTtcbiAgICB2YXIgY2xhc3NOYW1lID1cbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24gKyAoYnRuQ2xhc3NOYW1lID8gXCIgXCIgKyBidG5DbGFzc05hbWUgOiBcIlwiKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbk1vdXNlRG93bj17bW91c2VEb3dufVxuICAgICAgICBvbkNsaWNrPXtjbGlja31cbiAgICAgICAgdmFsdWU9e3RleHR9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb24udHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFN1cnZleU5hdmlnYXRpb25CYXNlIH0gZnJvbSBcIi4vcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvZ3Jlc3MgZXh0ZW5kcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc1RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1RvcDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmdldFByb2dyZXNzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkucHJvZ3Jlc3NUZXh0O1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHN0eWxlID0gdGhpcy5pc1RvcCA/IHt9IDogeyBtYXJnaW5Ub3A6IFwiMWVtXCIgfTtcbiAgICB2YXIgcHJvZ3Jlc3NTdHlsZSA9IHtcbiAgICAgIHdpZHRoOiB0aGlzLnByb2dyZXNzICsgXCIlXCJcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MucHJvZ3Jlc3N9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17cHJvZ3Jlc3NTdHlsZX1cbiAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuY3NzLnByb2dyZXNzQmFyfVxuICAgICAgICAgIHJvbGU9XCJwcm9ncmVzc2JhclwiXG4gICAgICAgICAgYXJpYS12YWx1ZW1pbj17MH1cbiAgICAgICAgICBhcmlhLXZhbHVlbWF4PXsxMDB9XG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgdGhpcy5jc3MucHJvZ3Jlc3NUZXh0ICsgXCIgXCIgKyB0aGlzLmNzcy5wcm9ncmVzc1RleHRJbkJhclxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0aGlzLnByb2dyZXNzVGV4dH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICB0aGlzLmNzcy5wcm9ncmVzc1RleHQgKyBcIiBcIiArIHRoaXMuY3NzLnByb2dyZXNzVGV4dFVuZGVyQmFyXG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAge3RoaXMucHJvZ3Jlc3NUZXh0fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlQcm9ncmVzcy50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5VGltZXJQYW5lbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgc3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zdXJ2ZXk7XG4gIH1cbiAgdXBkYXRlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyB0aW1lU3BlbnQ6IHRoaXMuc3VydmV5LnRpbWVTcGVudCB9KTtcbiAgfTtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5zdXJ2ZXkub25UaW1lci5hZGQodGhpcy51cGRhdGUpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuc3VydmV5Lm9uVGltZXIucmVtb3ZlKHRoaXMudXBkYXRlKTtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiA8ZGl2Pnt0aGlzLnN1cnZleS50aW1lckluZm9UZXh0fTwvZGl2PjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0dGltZXJwYW5lbC50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uLCBJU3VydmV5Q3JlYXRvciB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Sb3dNb2RlbCwgUGFuZWxNb2RlbCB9IGZyb20gXCIuLi9wYW5lbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IElFbGVtZW50LCBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFJlYWN0RWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVJvdyBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLnJvdztcbiAgfVxuICBwcml2YXRlIGdldCByb3coKTogUXVlc3Rpb25Sb3dNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucm93O1xuICB9XG4gIHByaXZhdGUgZ2V0IHN1cnZleSgpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc3VydmV5O1xuICB9XG4gIHByaXZhdGUgZ2V0IGNyZWF0b3IoKTogSVN1cnZleUNyZWF0b3Ige1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNyZWF0b3I7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jc3M7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAodGhpcy5yb3cgPT0gbnVsbCB8fCB0aGlzLnN1cnZleSA9PSBudWxsIHx8IHRoaXMuY3JlYXRvciA9PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucm93LnZpc2libGUpIHtcbiAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMucm93LmVsZW1lbnRzLm1hcChlbGVtZW50ID0+XG4gICAgICAgIHRoaXMuY3JlYXRlRWxlbWVudChlbGVtZW50KVxuICAgICAgKTtcbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3Mucm93fT57ZWxlbWVudHN9PC9kaXY+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTtcbiAgICBpZiAoIVJlYWN0RWxlbWVudEZhY3RvcnkuSW5zdGFuY2UuaXNFbGVtZW50UmVnaXNnZXJlZChlbGVtZW50VHlwZSkpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gXCJxdWVzdGlvblwiO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3RFbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlLCB7XG4gICAgICBrZXk6IGVsZW1lbnQubmFtZSxcbiAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBjcmVhdG9yOiB0aGlzLmNyZWF0b3IsXG4gICAgICBzdXJ2ZXk6IHRoaXMuc3VydmV5LFxuICAgICAgY3NzOiB0aGlzLmNzc1xuICAgIH0pO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3Qvcm93LnRzeCIsImltcG9ydCB7IEJhc2UsIFN1cnZleUVycm9yLCBJVGV4dFByb2Nlc3NvciwgSVF1ZXN0aW9uIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyLCBKc29uT2JqZWN0UHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBXZWJSZXF1ZXN0RXJyb3IsIFdlYlJlcXVlc3RFbXB0eUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuY2xhc3MgWG1sUGFyc2VyIHtcbiAgcHJpdmF0ZSBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIHB1YmxpYyBhc3NpZ25WYWx1ZSh0YXJnZXQ6IGFueSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV1dLmNvbmNhdCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgT2JqZWN0LmtleXModmFsdWUpWzBdID09PSBuYW1lXG4gICAgKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZVtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB4bWwySnNvbih4bWxOb2RlOiBhbnksIHJlc3VsdDogYW55KSB7XG4gICAgaWYgKHhtbE5vZGUuY2hpbGRyZW4gJiYgeG1sTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhtbE5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkTm9kZSA9IHhtbE5vZGUuY2hpbGRyZW5baV07XG4gICAgICAgIGxldCBjaGlsZE9iamVjdCA9IHt9O1xuICAgICAgICB0aGlzLnhtbDJKc29uKGNoaWxkTm9kZSwgY2hpbGRPYmplY3QpO1xuICAgICAgICB0aGlzLmFzc2lnblZhbHVlKHJlc3VsdCwgY2hpbGROb2RlLm5vZGVOYW1lLCBjaGlsZE9iamVjdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzaWduVmFsdWUocmVzdWx0LCB4bWxOb2RlLm5vZGVOYW1lLCB4bWxOb2RlLnRleHRDb250ZW50KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHBhcnNlWG1sU3RyaW5nKHhtbFN0cmluZzogc3RyaW5nKSB7XG4gICAgbGV0IHhtbFJvb3QgPSB0aGlzLnBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sU3RyaW5nLCBcInRleHQveG1sXCIpO1xuICAgIGxldCBqc29uID0ge307XG4gICAgdGhpcy54bWwySnNvbih4bWxSb290LCBqc29uKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxufVxuXG4vKipcbiAqIEEgZGVmaW5pdGlvbiBmb3IgZmlsbGluZyBjaG9pY2VzIGZvciBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zIGZyb20gcmVzZnVsbCBzZXJ2aWNlcy5cbiAqIFRoZSBydW4gbWV0aG9kIGNhbGwgYSByZXN0ZnVsbCBzZXJ2aWNlIGFuZCByZXN1bHRzIGNhbiBiZSBnZXQgb24gZ2V0UmVzdWx0Q2FsbGJhY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBDaG9pY2VzUmVzdGZ1bGwgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgRW5jb2RlUGFyYW1ldGVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2V0dGluZ3Mud2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgRW5jb2RlUGFyYW1ldGVycyh2YWw6IGJvb2xlYW4pIHtcbiAgICBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNsZWFyQ2FjaGUoKSB7XG4gICAgQ2hvaWNlc1Jlc3RmdWxsLml0ZW1zUmVzdWx0ID0ge307XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgaXRlbXNSZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBzZW5kaW5nU2FtZVJlcXVlc3RzOiB7XG4gICAgW2luZGV4OiBzdHJpbmddOiBBcnJheTxDaG9pY2VzUmVzdGZ1bGw+O1xuICB9ID0ge307XG4gIHByaXZhdGUgc3RhdGljIGFkZFNhbWVSZXF1ZXN0KG9iajogQ2hvaWNlc1Jlc3RmdWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIGhhc2ggPSBvYmoub2JqSGFzaDtcbiAgICB2YXIgcmVzID0gQ2hvaWNlc1Jlc3RmdWxsLnNlbmRpbmdTYW1lUmVxdWVzdHNbaGFzaF07XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsbC5zZW5kaW5nU2FtZVJlcXVlc3RzW29iai5vYmpIYXNoXSA9IFtdO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXMucHVzaChvYmopO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIHVucmVnaXN0ZXJTYW1lUmVxdWVzdHMob2JqOiBDaG9pY2VzUmVzdGZ1bGwsIGl0ZW1zOiBhbnkpIHtcbiAgICB2YXIgcmVzID0gQ2hvaWNlc1Jlc3RmdWxsLnNlbmRpbmdTYW1lUmVxdWVzdHNbb2JqLm9iakhhc2hdO1xuICAgIGRlbGV0ZSBDaG9pY2VzUmVzdGZ1bGwuc2VuZGluZ1NhbWVSZXF1ZXN0c1tvYmoub2JqSGFzaF07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghIXJlc1tpXS5nZXRSZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXNbaV0uZ2V0UmVzdWx0Q2FsbGJhY2soaXRlbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIG9uQmVmb3JlU2VuZFJlcXVlc3Q6IChcbiAgICBzZW5kZXI6IENob2ljZXNSZXN0ZnVsbCxcbiAgICBvcHRpb25zOiB7IHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IH1cbiAgKSA9PiB2b2lkO1xuICBwcml2YXRlIHN0YXRpYyBnZXRDYWNoZWRJdGVtc1Jlc3VsdChvYmo6IENob2ljZXNSZXN0ZnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBoYXNoID0gb2JqLm9iakhhc2g7XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsbC5pdGVtc1Jlc3VsdFtoYXNoXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChvYmouZ2V0UmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgIG9iai5nZXRSZXN1bHRDYWxsYmFjayhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGxhc3RPYmpIYXNoOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGlzUnVubmluZ1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRVcmw6IHN0cmluZyA9IFwiXCI7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgZ2V0UmVzdWx0Q2FsbGJhY2s6IChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgPT4gdm9pZDtcbiAgcHVibGljIGJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyB1cGRhdGVSZXN1bHRDYWxsYmFjazogKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICkgPT4gQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHVibGljIGdldEl0ZW1WYWx1ZUNhbGxiYWNrOiAoaXRlbTogYW55KSA9PiBhbnk7XG4gIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsO1xuICBwdWJsaWMgb3duZXI6IElRdWVzdGlvbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgcnVuKHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yID0gbnVsbCkge1xuICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2spIHJldHVybjtcbiAgICB0aGlzLnByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3Nvcik7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFVybCkge1xuICAgICAgdGhpcy5kb0VtcHR5UmVzdWx0Q2FsbGJhY2soe30pO1xuICAgICAgdGhpcy5sYXN0T2JqSGFzaCA9IHRoaXMub2JqSGFzaDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFzdE9iakhhc2ggPT09IHRoaXMub2JqSGFzaCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdE9iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgaWYgKHRoaXMudXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpKSByZXR1cm47XG4gICAgaWYgKENob2ljZXNSZXN0ZnVsbC5hZGRTYW1lUmVxdWVzdCh0aGlzKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VuZFJlcXVlc3QoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUnVubmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzV2FpdGluZ0ZvclBhcmFtZXRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudXJsICYmICF0aGlzLnByb2Nlc3NlZFVybDtcbiAgfVxuICBwcm90ZWN0ZWQgdXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQ2hvaWNlc1Jlc3RmdWxsLmdldENhY2hlZEl0ZW1zUmVzdWx0KHRoaXMpO1xuICB9XG4gIHByaXZhdGUgZG9FbXB0eVJlc3VsdENhbGxiYWNrKHNlcnZlclJlc3VsdDogYW55KSB7XG4gICAgdmFyIGl0ZW1zOiBBcnJheTxhbnk+ID0gW107XG4gICAgaWYgKHRoaXMudXBkYXRlUmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgIGl0ZW1zID0gdGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjayhpdGVtcywgc2VydmVyUmVzdWx0KTtcbiAgICB9XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzZWRUZXh0KHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yKSB7XG4gICAgaWYgKHRleHRQcm9jZXNzb3IpIHtcbiAgICAgIHZhciBwVXJsID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KFxuICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzXG4gICAgICApO1xuICAgICAgdmFyIHBQYXRoID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KFxuICAgICAgICB0aGlzLnBhdGgsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVyc1xuICAgICAgKTtcbiAgICAgIGlmICghcFVybC5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gfHwgIXBQYXRoLmhhc0FsbFZhbHVlc09uTGFzdFJ1bikge1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IFwiXCI7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IHBVcmwudGV4dDtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gcFBhdGgudGV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSB0aGlzLnVybDtcbiAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IHRoaXMucGF0aDtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHBhcnNlUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xuICAgIGxldCBwYXJzZWRSZXNwb25zZTtcbiAgICBpZiAoXG4gICAgICAhIXJlc3BvbnNlICYmXG4gICAgICB0eXBlb2YgcmVzcG9uc2UuaW5kZXhPZiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICByZXNwb25zZS5pbmRleE9mKFwiPFwiKSA9PT0gMFxuICAgICkge1xuICAgICAgdmFyIHBhcnNlciA9IG5ldyBYbWxQYXJzZXIoKTtcbiAgICAgIHBhcnNlZFJlc3BvbnNlID0gcGFyc2VyLnBhcnNlWG1sU3RyaW5nKHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkUmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IChyZXNwb25zZSB8fCBcIlwiKVxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5tYXAoKHM6IGFueSkgPT4gcy50cmltKFwiIFwiKSlcbiAgICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+ICEhcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRSZXNwb25zZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2VuZFJlcXVlc3QoKSB7XG4gICAgdGhpcy5pc1J1bm5pbmdWYWx1ZSA9IHRydWU7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIHRoaXMucHJvY2Vzc2VkVXJsKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5pc1J1bm5pbmdWYWx1ZSA9IGZhbHNlO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBzZWxmLm9uTG9hZChzZWxmLnBhcnNlUmVzcG9uc2UoeGhyLnJlc3BvbnNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLm9uRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9wdGlvbnMgPSB7IHJlcXVlc3Q6IHhociB9O1xuICAgIGlmICghIUNob2ljZXNSZXN0ZnVsbC5vbkJlZm9yZVNlbmRSZXF1ZXN0KSB7XG4gICAgICBDaG9pY2VzUmVzdGZ1bGwub25CZWZvcmVTZW5kUmVxdWVzdCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5iZWZvcmVTZW5kUmVxdWVzdCgpO1xuICAgIG9wdGlvbnMucmVxdWVzdC5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaG9pY2VzQnlVcmxcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnVybCAmJiAhdGhpcy5wYXRoICYmICF0aGlzLnZhbHVlTmFtZSAmJiAhdGhpcy50aXRsZU5hbWU7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydGllc1tpXS5uYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgKyBcIk5hbWVcIjtcbiAgfVxuICBwcml2YXRlIGdldEN1c3RvbVByb3BlcnRpZXMoKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXModGhpcy5pdGVtVmFsdWVUeXBlKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ2YWx1ZVwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcInZpc2libGVJZlwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJlbmFibGVJZlwiXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEoanNvbjogYW55KSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGlmIChqc29uLnVybCkgdGhpcy51cmwgPSBqc29uLnVybDtcbiAgICBpZiAoanNvbi5wYXRoKSB0aGlzLnBhdGggPSBqc29uLnBhdGg7XG4gICAgaWYgKGpzb24udmFsdWVOYW1lKSB0aGlzLnZhbHVlTmFtZSA9IGpzb24udmFsdWVOYW1lO1xuICAgIGlmIChqc29uLnRpdGxlTmFtZSkgdGhpcy50aXRsZU5hbWUgPSBqc29uLnRpdGxlTmFtZTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoanNvbltwcm9wZXJ0aWVzW2ldXSkgKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0gPSBqc29uW3Byb3BlcnRpZXNbaV1dO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGF0YSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLnVybCkgcmVzW1widXJsXCJdID0gdGhpcy51cmw7XG4gICAgaWYgKHRoaXMucGF0aCkgcmVzW1wicGF0aFwiXSA9IHRoaXMucGF0aDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJlc1tcInZhbHVlTmFtZVwiXSA9IHRoaXMudmFsdWVOYW1lO1xuICAgIGlmICh0aGlzLnRpdGxlTmFtZSkgcmVzW1widGl0bGVOYW1lXCJdID0gdGhpcy50aXRsZU5hbWU7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dKVxuICAgICAgICByZXNbcHJvcGVydGllc1tpXV0gPSAoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB1cmwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBhbGxvd0VtcHR5UmVzcG9uc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93RW1wdHlSZXNwb25zZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0VtcHR5UmVzcG9uc2UodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dFbXB0eVJlc3BvbnNlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtVmFsdWVUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICB2YXIgcHJvcCA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMub3duZXIuZ2V0VHlwZSgpLCBcImNob2ljZXNcIik7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICBpZiAocHJvcC50eXBlID09IFwiaXRlbXZhbHVlW11cIikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgcmV0dXJuIHByb3AudHlwZTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgdGhpcy52YWx1ZU5hbWUgPSBcIlwiO1xuICAgIHRoaXMudGl0bGVOYW1lID0gXCJcIjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0pICg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dID0gXCJcIjtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJlZm9yZVNlbmRSZXF1ZXN0KCkge1xuICAgIGlmICghIXRoaXMuYmVmb3JlU2VuZFJlcXVlc3RDYWxsYmFjaykge1xuICAgICAgdGhpcy5iZWZvcmVTZW5kUmVxdWVzdENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkxvYWQocmVzdWx0OiBhbnkpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgdXBkYXRlZFJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdCk7XG4gICAgaWYgKHVwZGF0ZWRSZXN1bHQgJiYgdXBkYXRlZFJlc3VsdFtcImxlbmd0aFwiXSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVkUmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtVmFsdWUgPSB1cGRhdGVkUmVzdWx0W2ldO1xuICAgICAgICBpZiAoIWl0ZW1WYWx1ZSkgY29udGludWU7XG4gICAgICAgIHZhciB2YWx1ZSA9ICEhdGhpcy5nZXRJdGVtVmFsdWVDYWxsYmFja1xuICAgICAgICAgID8gdGhpcy5nZXRJdGVtVmFsdWVDYWxsYmFjayhpdGVtVmFsdWUpXG4gICAgICAgICAgOiB0aGlzLmdldFZhbHVlKGl0ZW1WYWx1ZSk7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbVZhbHVlKTtcbiAgICAgICAgdmFyIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKHZhbHVlLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuc2V0Q3VzdG9tUHJvcGVydGllcyhpdGVtLCBpdGVtVmFsdWUpO1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuYWxsb3dFbXB0eVJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBuZXcgV2ViUmVxdWVzdEVtcHR5RXJyb3IobnVsbCwgdGhpcy5vd25lcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKSB7XG4gICAgICBpdGVtcyA9IHRoaXMudXBkYXRlUmVzdWx0Q2FsbGJhY2soaXRlbXMsIHJlc3VsdCk7XG4gICAgfVxuICAgIENob2ljZXNSZXN0ZnVsbC5pdGVtc1Jlc3VsdFt0aGlzLm9iakhhc2hdID0gaXRlbXM7XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gICAgQ2hvaWNlc1Jlc3RmdWxsLnVucmVnaXN0ZXJTYW1lUmVxdWVzdHModGhpcywgaXRlbXMpO1xuICB9XG4gIHByaXZhdGUgc2V0Q3VzdG9tUHJvcGVydGllcyhpdGVtOiBJdGVtVmFsdWUsIGl0ZW1WYWx1ZTogYW55KSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbHVlQ29yZShcbiAgICAgICAgaXRlbVZhbHVlLFxuICAgICAgICB0aGlzLmdldFByb3BlcnR5QmluZGluZyhwcm9wLm5hbWUpXG4gICAgICApO1xuICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSB7XG4gICAgICAgICg8YW55Pml0ZW0pW3Byb3AubmFtZV0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydHlCaW5kaW5nKHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCg8YW55PnRoaXMpW3RoaXMuZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSldKVxuICAgICAgcmV0dXJuICg8YW55PnRoaXMpW3RoaXMuZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSldO1xuICAgIGlmICgoPGFueT50aGlzKVtwcm9wZXJ0eU5hbWVdKSByZXR1cm4gKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXTtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICB9XG4gIHByaXZhdGUgb25FcnJvcihzdGF0dXM6IHN0cmluZywgcmVzcG9uc2U6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3IgPSBuZXcgV2ViUmVxdWVzdEVycm9yKHN0YXR1cywgcmVzcG9uc2UsIHRoaXMub3duZXIpO1xuICAgIHRoaXMuZG9FbXB0eVJlc3VsdENhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICBDaG9pY2VzUmVzdGZ1bGwudW5yZWdpc3RlclNhbWVSZXF1ZXN0cyh0aGlzLCBbXSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoIXRoaXMucHJvY2Vzc2VkUGF0aCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YXIgcGF0aGVzID0gdGhpcy5nZXRQYXRoZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0W3BhdGhlc1tpXV07XG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYXRoZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHBhdGhlcyA9IFtdO1xuICAgIGlmICh0aGlzLnByb2Nlc3NlZFBhdGguaW5kZXhPZihcIjtcIikgPiAtMSkge1xuICAgICAgcGF0aGVzID0gdGhpcy5wYXRoLnNwbGl0KFwiO1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aGVzID0gdGhpcy5wcm9jZXNzZWRQYXRoLnNwbGl0KFwiLFwiKTtcbiAgICB9XG4gICAgaWYgKHBhdGhlcy5sZW5ndGggPT0gMCkgcGF0aGVzLnB1c2godGhpcy5wcm9jZXNzZWRQYXRoKTtcbiAgICByZXR1cm4gcGF0aGVzO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWUoaXRlbTogYW55KTogYW55IHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRoaXMuZ2V0VmFsdWVDb3JlKGl0ZW0sIHRoaXMudmFsdWVOYW1lKTtcbiAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGl0ZW07XG4gICAgdmFyIGxlbiA9IE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aDtcbiAgICBpZiAobGVuIDwgMSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGl0ZW1bT2JqZWN0LmtleXMoaXRlbSlbMF1dO1xuICB9XG4gIHByaXZhdGUgZ2V0VGl0bGUoaXRlbTogYW55KTogYW55IHtcbiAgICB2YXIgdGl0bGUgPSB0aGlzLnRpdGxlTmFtZSA/IHRoaXMudGl0bGVOYW1lIDogXCJ0aXRsZVwiO1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aXRsZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUNvcmUoaXRlbTogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSA8IDApIHJldHVybiBpdGVtW3Byb3BlcnR5XTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnR5LnNwbGl0KFwiLlwiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBpdGVtW3Byb3BlcnRpZXNbaV1dO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcHJpdmF0ZSBnZXQgb2JqSGFzaCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMudmFsdWVOYW1lICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMudGl0bGVOYW1lXG4gICAgKTtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjaG9pY2VzQnlVcmxcIixcbiAgW1xuICAgIFwidXJsXCIsXG4gICAgXCJwYXRoXCIsXG4gICAgXCJ2YWx1ZU5hbWVcIixcbiAgICBcInRpdGxlTmFtZVwiLFxuICAgIHsgbmFtZTogXCJhbGxvd0VtcHR5UmVzcG9uc2U6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ2hvaWNlc1Jlc3RmdWxsKCk7XG4gIH1cbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY2hvaWNlc1Jlc3RmdWxsLnRzIiwiaW1wb3J0IHsgT3BlcmFuZCwgQ29uc3QgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgU3ludGF4RXJyb3IsIHBhcnNlIH0gZnJvbSBcIi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvblBhcnNlclwiO1xuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uc1BhcnNlckVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGF0OiBudW1iZXIsIHB1YmxpYyBjb2RlOiBzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25zUGFyc2VyIHtcbiAgcHJpdmF0ZSBjb25kaXRpb25FcnJvcjogQ29uZGl0aW9uc1BhcnNlckVycm9yO1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZXJDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IE9wZXJhbmQgfSA9IHt9O1xuXG4gIHByaXZhdGUgcGF0Y2hFeHByZXNzaW9uKHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvPT4vZywgXCI+PVwiKVxuICAgICAgLnJlcGxhY2UoLz08L2csIFwiPD1cIilcbiAgICAgIC5yZXBsYWNlKC88Pi9nLCBcIiE9XCIpXG4gICAgICAucmVwbGFjZSgvPT0vZywgXCI9IFwiKVxuICAgICAgLnJlcGxhY2UoL2VxdWFscy9nLCBcImVxdWFsIFwiKVxuICAgICAgLnJlcGxhY2UoL25vdGVxdWFscy9nLCBcIm5vdGVxdWFsIFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVDb25kaXRpb24odGV4dDogc3RyaW5nKTogT3BlcmFuZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFeHByZXNzaW9uKHRleHQpO1xuICB9XG5cbiAgcHVibGljIHBhcnNlRXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcpOiBPcGVyYW5kIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlc3VsdCA9IENvbmRpdGlvbnNQYXJzZXIucGFyc2VyQ2FjaGVbdGV4dF07XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcGFyc2UodGhpcy5wYXRjaEV4cHJlc3Npb24odGV4dCkpO1xuICAgICAgICBpZiAoIXJlc3VsdC5oYXNBc3luY0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICBDb25kaXRpb25zUGFyc2VyLnBhcnNlckNhY2hlW3RleHRdID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb25FcnJvciA9IG5ldyBDb25kaXRpb25zUGFyc2VyRXJyb3IoXG4gICAgICAgICAgZS5sb2NhdGlvbi5zdGFydC5vZmZzZXQsXG4gICAgICAgICAgZS5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBlcnJvcigpOiBDb25kaXRpb25zUGFyc2VyRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbkVycm9yO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsImltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbi8qKlxuICogVGhlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdG8gd29yayB3aXRoIHd3dy5keHN1cnZleS5jb20gc2VydmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIGR4U3VydmV5U2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHNlcnZpY2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3Muc3VydmV5U2VydmljZVVybDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBzZXJ2aWNlVXJsKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3Muc3VydmV5U2VydmljZVVybCA9IHZhbDtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBsb2FkU3VydmV5KFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0U3VydmV5P3N1cnZleUlkPVwiICsgc3VydmV5SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgeGhyLnJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleUpzb25BbmRJc0NvbXBsZXRlZChcbiAgICBzdXJ2ZXlJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgc3VydmV5SnNvbjogYW55LFxuICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcbiAgICAgIFwiR0VUXCIsXG4gICAgICBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArXG4gICAgICAgIFwiL2dldFN1cnZleUFuZElzQ29tcGxldGVkP3N1cnZleUlkPVwiICtcbiAgICAgICAgc3VydmV5SWQgK1xuICAgICAgICBcIiZjbGllbnRJZD1cIiArXG4gICAgICAgIGNsaWVudElkXG4gICAgKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgdmFyIHN1cnZleUpzb24gPSByZXN1bHQgPyByZXN1bHQuc3VydmV5IDogbnVsbDtcbiAgICAgIHZhciBpc0NvbXBsZXRlZCA9IHJlc3VsdCA/IHJlc3VsdC5pc0NvbXBsZXRlZCA6IG51bGw7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHN1cnZleUpzb24sIGlzQ29tcGxldGVkLCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyxcbiAgICByZXN1bHQ6IEpTT04sXG4gICAgb25TZW5kUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSwgcmVxdWVzdD86IGFueSkgPT4gdm9pZCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvcG9zdC9cIik7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHZhciBkYXRhID0geyBwb3N0SWQ6IHBvc3RJZCwgc3VydmV5UmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH07XG4gICAgaWYgKGNsaWVudElkKSAoPGFueT5kYXRhKVtcImNsaWVudElkXCJdID0gY2xpZW50SWQ7XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCkgKDxhbnk+ZGF0YSlbXCJpc1BhcnRpYWxDb21wbGV0ZWRcIl0gPSB0cnVlO1xuICAgIHZhciBkYXRhU3RyaW5naWZ5OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xuICAgICAgb25TZW5kUmVzdWx0KHhoci5zdGF0dXMgPT09IDIwMCwgeGhyLnJlc3BvbnNlLCB4aHIpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gIH1cbiAgcHVibGljIHNlbmRGaWxlKFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFvblNlbmRGaWxlKSByZXR1cm47XG4gICAgICBvblNlbmRGaWxlKHhoci5zdGF0dXMgPT0gMjAwLCBKU09OLnBhcnNlKHhoci5yZXNwb25zZSkpO1xuICAgIH07XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvdXBsb2FkL1wiLCB0cnVlKTtcbiAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcInBvc3RJZFwiLCBwb3N0SWQpO1xuICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVzdWx0KFxuICAgIHJlc3VsdElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uR2V0UmVzdWx0OiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgZGF0YTogYW55LFxuICAgICAgZGF0YUxpc3Q6IEFycmF5PGFueT4sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJm5hbWU9XCIgKyBuYW1lO1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0UmVzdWx0P1wiICsgZGF0YSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgdmFyIGxpc3QgPSBudWxsO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0LlF1ZXN0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGVsID0geyBuYW1lOiBrZXksIHZhbHVlOiByZXN1bHQuUXVlc3Rpb25SZXN1bHRba2V5XSB9O1xuICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uR2V0UmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIGxpc3QsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBpc0NvbXBsZXRlZChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Jc0NvbXBsZXRlZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJmNsaWVudElkPVwiICsgY2xpZW50SWQ7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9pc0NvbXBsZXRlZD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuLy9pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVuZ2xpc2hTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90aGVyIChkZXNjcmliZSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5vbmVcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWN0IEFsbFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gb2YgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWNvcmQgezB9IG9mIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiQW5zd2VyZWQgezB9L3sxfSBxdWVzdGlvbnNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGhhbmsgeW91IGZvciBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJPdXIgcmVjb3JkcyBzaG93IHRoYXQgeW91IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgdGhpcyBzdXJ2ZXkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTG9hZGluZyBTdXJ2ZXkuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hvb3NlLi4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGFuc3dlciB0aGUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBsZWFzZSBhbnN3ZXIgYXQgbGVhc3Qgb25lIHF1ZXN0aW9uLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBsZWFzZSBhbnN3ZXIgcXVlc3Rpb25zIGluIGFsbCByb3dzLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVGhlIHZhbHVlIHNob3VsZCBiZSBudW1lcmljLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbGVzcyB0aGFuIHswfSBjaGFyYWN0ZXJzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBtb3JlIHRoYW4gezB9IGFuZCBsZXNzIHRoYW4gezF9IGNoYXJhY3RlcnMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUGxlYXNlIGZpbGwgaW4gYXQgbGVhc3QgezB9IHJvd3MuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3QgYXQgbGVhc3QgezB9IHZhcmlhbnRzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQbGVhc2Ugc2VsZWN0IG5vIG1vcmUgdGhhbiB7MH0gdmFyaWFudHMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX0gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJUaGUgZXhwcmVzc2lvbjogezB9IHNob3VsZCByZXR1cm4gJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZXJyb3IgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSBkYXRhIG9yIHRoZSAncGF0aCcgcHJvcGVydHkgaXMgaW5jb3JyZWN0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVGhlIGZpbGUgc2l6ZSBzaG91bGQgbm90IGV4Y2VlZCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQbGVhc2UgZW50ZXIgdGhlIG90aGVyIHZhbHVlLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiWW91ciBmaWxlIGlzIHVwbG9hZGluZy4gUGxlYXNlIHdhaXQgc2V2ZXJhbCBzZWNvbmRzIGFuZCB0cnkgYWdhaW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkxvYWRpbmcuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJDaG9vc2UgZmlsZShzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTm8gZmlsZSBjaG9zZW5cIixcbiAgY29uZmlybURlbGV0ZTogXCJEbyB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHJlY29yZD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUaGlzIHZhbHVlIHNob3VsZCBiZSB1bmlxdWUuXCIsXG4gIGFkZENvbHVtbjogXCJBZGQgY29sdW1uXCIsXG4gIGFkZFJvdzogXCJBZGQgcm93XCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVcIixcbiAgYWRkUGFuZWw6IFwiQWRkIG5ld1wiLFxuICByZW1vdmVQYW5lbDogXCJSZW1vdmVcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5cIixcbiAgbWF0cml4X3JvdzogXCJSb3dcIixcbiAgc2F2aW5nRGF0YTogXCJUaGUgcmVzdWx0cyBhcmUgc2F2aW5nIG9uIHRoZSBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkFuIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB0aGUgcmVzdWx0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGhlIHJlc3VsdHMgd2VyZSBzYXZlZCBzdWNjZXNzZnVsbHkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUcnkgYWdhaW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UgYW5kIHsxfSBpbiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZSBhbmQgezJ9IG9mIHszfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBpbiB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkNsZWFuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJDbGVhclwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJDaG9vc2UgZmlsZVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJSZW1vdmUgdGhpcyBmaWxlXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiWWVzXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOb1wiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBmaWxlOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCB0byByZW1vdmUgYWxsIGZpbGVzP1wiXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbi8vc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuLy9zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlblwiXSA9IFwiRW5nbGlzaFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBiYXNlIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWw8VFJvdywgVENvbHVtbj4gZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByb3RlY3RlZCBmaWx0ZXJlZENvbHVtbnM6IEFycmF5PFRDb2x1bW4+O1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRSb3dzOiBBcnJheTxJdGVtVmFsdWU+O1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVkVmlzaWJsZVJvd3M6IEFycmF5PFRSb3c+ID0gbnVsbDtcbiAgcHJvdGVjdGVkIGdlbmVyYXRlZFRvdGFsUm93OiBUUm93ID0gbnVsbDtcbiAgcHVibGljIHZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY29sdW1uc1wiKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IG51bGw7XG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSBudWxsO1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY3JlYXRlQ29sdW1uVmFsdWVzKCk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwicm93c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gaGlkZSB0YWJsZSBoZWFkZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dIZWFkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93SGVhZGVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dIZWFkZXJcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgY29sdW1ucy4gQSBjb2x1bW4gaGFzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHRleHRcbiAgICovXG4gIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zXCIpO1xuICB9XG4gIHNldCBjb2x1bW5zKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlQ29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gISF0aGlzLmZpbHRlcmVkQ29sdW1ucyA/IHRoaXMuZmlsdGVyZWRDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiByb3dzLiBBIHJvdyBoYXMgYSB2YWx1ZSBhbmQgYW4gb3B0aW9uYWwgdGV4dFxuICAgKi9cbiAgZ2V0IHJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cbiAgc2V0IHJvd3MobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB2YXIgbmV3Um93cyA9IHRoaXMucHJvY2Vzc1Jvd3NPblNldChuZXdWYWx1ZSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCBuZXdSb3dzKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHByb2Nlc3NSb3dzT25TZXQobmV3Um93czogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiBuZXdSb3dzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxUUm93PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcm93cyBhcyBtb2RlbCBvYmplY3RzLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8VFJvdz4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVSb3dzKCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggcm93IGl0ZW0gYW5kIGlmIGZvciB0aGlzIGl0ZW0gaXQgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBpdGVtIGlzIHZpc2libGUgb3RoZXJ3aXNlIHRoZSBpdGVtIGJlY29tZXMgaW52aXNpYmxlLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgcm93c1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93c1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNvbHVtbiBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgcm93c1Zpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5zVmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNWaXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5zVmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1Zpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5JdGVtc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAhdGhpcy5kYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucnVuSXRlbXNDb25kaXRpb24oXG4gICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgcHJvdGVjdGVkIHNob3VsZFJ1bkNvbHVtbkV4cHJlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Jvd3NBc0l0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBydW5JdGVtc0NvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBvbGRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgaWYgKCEhdGhpcy5maWx0ZXJlZFJvd3MgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSkge1xuICAgICAgb2xkVmlzaWJsZVJvd3MgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb2xkVmlzaWJsZVJvd3MucHVzaCh0aGlzLmZpbHRlcmVkUm93c1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBoYXNDaGFuZ2VzID1cbiAgICAgIHRoaXMuaGFzUm93c0FzSXRlbXMoKSAmJiB0aGlzLnJ1bkNvbmRpdGlvbnNGb3JSb3dzKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaGFzQ2hhbmdlcyA9IHRoaXMucnVuQ29uZGl0aW9uc0ZvckNvbHVtbnModmFsdWVzLCBwcm9wZXJ0aWVzKSB8fCBoYXNDaGFuZ2VzO1xuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICBpZiAoISF0aGlzLmZpbHRlcmVkQ29sdW1ucyB8fCAhIXRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICghIW9sZFZpc2libGVSb3dzKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZU5ld1Zpc2libGVSb3dzVmFsdWVzKG9sZFZpc2libGVSb3dzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VzO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0ZvclJvd3MoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgcnVubmVyID0gISF0aGlzLnJvd3NWaXNpYmxlSWZcbiAgICAgID8gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnJvd3NWaXNpYmxlSWYpXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICB2YXIgaGFzQ2hhbmdlZCA9IEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXMoXG4gICAgICB0aGlzLnJvd3MsXG4gICAgICB0aGlzLmZpbHRlcmVkUm93cyxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICApO1xuICAgIGlmICh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggPT09IHRoaXMucm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQ7XG4gIH1cbiAgcHJpdmF0ZSBydW5Db25kaXRpb25zRm9yQ29sdW1ucyhcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBydW5uZXIgPSAhIXRoaXMuY29sdW1uc1Zpc2libGVJZlxuICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuY29sdW1uc1Zpc2libGVJZilcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IFtdO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuY29sdW1ucyxcbiAgICAgIDxhbnk+dGhpcy5maWx0ZXJlZENvbHVtbnMsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgdGhpcy5zaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKClcbiAgICApO1xuICAgIGlmICh0aGlzLmZpbHRlcmVkQ29sdW1ucy5sZW5ndGggPT09IHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQ7XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbCA9IG51bGw7XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIHZhciBjb2x1bW5zID0gISF0aGlzLmZpbHRlcmVkQ29sdW1ucyA/IHRoaXMuZmlsdGVyZWRDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkgJiZcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKGNvbHVtbnMsIHZhbFtrZXldKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChuZXdWYWwgPT0gbnVsbCkgbmV3VmFsID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbClba2V5XSA9IHZhbFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJJbnZpc2libGVWYWx1ZXNJblJvd3MoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm47XG4gICAgdmFyIG5ld0RhdGEgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHJvd3NbaV0udmFsdWU7XG4gICAgICBpZiAoISFuZXdEYXRhW2tleV0gJiYgIXJvd3NbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdEYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3RGF0YSwgdGhpcy52YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLnZhbHVlID0gbmV3RGF0YTtcbiAgfVxuICBwcml2YXRlIHJlc3RvcmVOZXdWaXNpYmxlUm93c1ZhbHVlcyhvbGRWaXNpYmxlUm93czogYW55KSB7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgdmFyIHZhbCA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgIHZhciBuZXdWYWx1ZSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkgJiZcbiAgICAgICAgIUl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShvbGRWaXNpYmxlUm93cywga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9IHt9O1xuICAgICAgICAoPGFueT5uZXdWYWx1ZSlba2V5XSA9IHZhbFtrZXldO1xuICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4YmFzZVwiLFxuICBbXG4gICAgXCJjb2x1bW5zVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICB7IG5hbWU6IFwic2hvd0hlYWRlcjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfVxuICBdLFxuICB1bmRlZmluZWQsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tYXJ0aXhCYXNlLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElFbGVtZW50LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBTdXJ2ZXlFbGVtZW50XG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IERyYWdEcm9wSW5mbywgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuXG4vKipcbiAqIFRoZSBwYWdlIG9iamVjdC4gSXQgaGFzIGVsZW1lbnRzIGNvbGxlY3Rpb24sIHRoYXQgY29udGFpbnMgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTW9kZWwgZXh0ZW5kcyBQYW5lbE1vZGVsQmFzZSBpbXBsZW1lbnRzIElQYWdlIHtcbiAgcHJpdmF0ZSBoYXNTaG93blZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubG9jVGl0bGUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICBpZiAoc2VsZi5udW0gPiAwKSByZXR1cm4gc2VsZi5udW0gKyBcIi4gXCIgKyB0ZXh0O1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhZ2VcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNQYWdlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZkZyb21MaXN0KHRoaXMuc3VydmV5LnBhZ2VzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7XG4gICAgaWYgKHRoaXMud2FzU2hvd24pIHJldHVybjtcbiAgICBzdXBlci5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBwYWdlLiBJdCBoYXMgdmFsdWVzIGZyb20gMCB0byB2aXNpYmxlIHBhZ2UgY291bnQgLSAxLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnZpc2libGVQYWdlc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLnBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUluZGV4KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaXMgc3RhcnRlZCBwYWdlIGluIHRoZSBzdXJ2ZXkuIEl0IGNhbiBiZSBzaG93biBvbiB0aGUgc3RhcnQgb25seSBhbmQgdGhlIGVuZC11c2VyIGNvdWxkIG5vdCBjb21lYmFjayB0byBpdCBhZnRlciBpdCBwYXNzZWQgaXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNQYWdlU3RhcnRlZCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY3NzID0gdGhpcy5jc3M7XG4gICAgdmFyIGNsYXNzZXMgPSB7IHBhZ2U6IHt9LCBwYWdlVGl0bGU6IFwiXCIsIHBhZ2VEZXNjcmlwdGlvbjogXCJcIiwgcm93OiBcIlwiIH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLnBhZ2UsIGNzcy5wYWdlKTtcbiAgICBpZighIWNzcy5wYWdlVGl0bGUpIHtcbiAgICAgIGNsYXNzZXMucGFnZVRpdGxlID0gY3NzLnBhZ2VUaXRsZTtcbiAgICB9XG4gICAgaWYoISFjc3MucGFnZURlc2NyaXB0aW9uKSB7XG4gICAgICBjbGFzc2VzLnBhZ2VEZXNjcmlwdGlvbiA9IGNzcy5wYWdlRGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmKCEhY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSBjc3Mucm93O1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBnZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SXNQYWdlVmlzaWJsZShleGNlcHRpb25RdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIGdldCBudW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm51bVwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBudW0odmFsOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5udW0gPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIHZhbCk7XG4gICAgdGhpcy5vbk51bUNoYW5nZWQodmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJoaWRlXCIgdG8gbWFrZSBcIlByZXZcIiwgXCJOZXh0XCIgYW5kIFwiQ29tcGxldGVcIiBidXR0b25zIGFyZSBpbnZpc2libGUgZm9yIHRoaXMgcGFnZS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJzaG93XCIgdG8gbWFrZSB0aGVzZSBidXR0b25zIHZpc2libGUsIGV2ZW4gaWYgc3VydmV5IHNob3dOYXZpZ2F0aW9uQnV0dG9ucyBwcm9wZXJ0eSBpcyBmYWxzZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlLnNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gc2hvd24gdG8gdGhlIGVuZC11c2VyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNTaG93blZhbHVlO1xuICB9XG4gIGdldCBoYXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53YXNTaG93bjtcbiAgfVxuICBwdWJsaWMgc2V0V2FzU2hvd24odmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmhhc1Nob3duVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmhhc1Nob3duVmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKHZhbCA9PSB0cnVlICYmIHRoaXMuYXJlUXVlc3Rpb25zUmFuZG9taXplZCkge1xuICAgICAgdGhpcy5yYW5kb21pemVFbGVtZW50cygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzUmFuZG9taXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByYW5kb21pemVFbGVtZW50cygpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1JhbmRvbWl6aW5nID0gdHJ1ZTtcbiAgICB2YXIgb2xkRWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgICB2YXIgbmV3RWxlbWVudHMgPSBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PElFbGVtZW50PihvbGRFbGVtZW50cyk7XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoMCwgdGhpcy5lbGVtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChuZXdFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSYW5kb21pemluZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgcmV0dXJucyB0cnVlLCBpZiB0aGUgZWxlbWVudHMgYXJlIHJhbmRvbWl6ZWQgb24gdGhlIHBhZ2VcbiAgICogQHNlZSBoYXNTaG93blxuICAgKiBAc2VlIHF1ZXN0aW9uc09yZGVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJlUXVlc3Rpb25zUmFuZG9taXplZCgpOiBib29sZWFuIHtcbiAgICB2YXIgb3JkZXIgPVxuICAgICAgdGhpcy5xdWVzdGlvbnNPcmRlciA9PSBcImRlZmF1bHRcIiAmJiB0aGlzLnN1cnZleVxuICAgICAgICA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uc09yZGVyXG4gICAgICAgIDogdGhpcy5xdWVzdGlvbnNPcmRlcjtcbiAgICByZXR1cm4gb3JkZXIgPT0gXCJyYW5kb21cIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gU2V0IGl0IHRvICdyYW5kb20nIHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMsICdpbml0aWFsJyB0byBrZWVwIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIgb3IgJ2RlZmF1bHQnIHRvIHVzZSB0aGUgU3VydmV5IHF1ZXN0aW9uc09yZGVyIHByb3BlcnR5XG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICogQHNlZSBhcmVRdWVzdGlvbnNSYW5kb21pemVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBzY3JvbGwgdG8gdGhlIHBhZ2UgdG9wLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvVG9wKCkge1xuICAgIFN1cnZleUVsZW1lbnQuU2Nyb2xsRWxlbWVudFRvVG9wKHRoaXMuaWQpO1xuICB9XG4gIC8qKlxuICAgKiBUaW1lIGluIHNlY29uZHMgZW5kLXVzZXIgc3BlbnQgb24gdGhpcyBwYWdlXG4gICAqL1xuICBwdWJsaWMgdGltZVNwZW50ID0gMDtcbiAgLy8gcHVibGljIGdldCB0aW1lU3BlbnQoKTogbnVtYmVyIHtcbiAgLy8gICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIDApO1xuICAvLyB9XG4gIC8vIHB1YmxpYyBzZXQgdGltZVNwZW50KHZhbDogbnVtYmVyKSB7XG4gIC8vICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIHZhbCk7XG4gIC8vIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhbmVscyBpbiB0aGUgcGFnZVxuICAgKi9cbiAgcHVibGljIGdldFBhbmVscyhcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxJUGFuZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElQYW5lbD4oKTtcbiAgICB0aGlzLmFkZFBhbmVsc0ludG9MaXN0KHJlc3VsdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZC11c2VyIGhhcyB0byBjb21wbGV0ZSB0aGUgcGFnZS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgdGhlIGVuZC11c2VyIGhhcyB1bmxpbWl0ZWQgbnVtYmVyIG9mIHRpbWUgdG8gZmluaXNoIHRoZSBwYWdlLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHt9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzUmFuZG9taXppbmcpIHJldHVybjtcbiAgICBzdXBlci5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm87XG4gIHB1YmxpYyBkcmFnRHJvcFN0YXJ0KFxuICAgIHNyYzogSUVsZW1lbnQsXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMVxuICApIHtcbiAgICB0aGlzLmRyYWdEcm9wSW5mbyA9IG5ldyBEcmFnRHJvcEluZm8oc3JjLCB0YXJnZXQsIG5lc3RlZFBhbmVsRGVwdGgpO1xuICB9XG4gIHB1YmxpYyBkcmFnRHJvcE1vdmVUbyhcbiAgICBkZXN0aW5hdGlvbjogSVN1cnZleUVsZW1lbnQsXG4gICAgaXNCb3R0b206IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpc0VkZ2U6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BJbmZvKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IGlzQm90dG9tO1xuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSA9IGlzRWRnZTtcbiAgICB0aGlzLmNvcnJlY3REcmFnRHJvcEluZm8odGhpcy5kcmFnRHJvcEluZm8pO1xuICAgIGlmICghdGhpcy5kcmFnRHJvcENhbkRyb3BUYWdlcnQoKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdGhpcy5kcmFnRHJvcENhbkRyb3BTb3VyY2UoKSB8fCAhdGhpcy5kcmFnRHJvcEFsbG93RnJvbVN1cnZleSgpKSB7XG4gICAgICBpZiAoISF0aGlzLmRyYWdEcm9wSW5mby5zb3VyY2UpIHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZHJhZ0Ryb3BGaW5kUm93KHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCwgcm93KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldCh0aGlzLmRyYWdEcm9wSW5mbyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjb3JyZWN0RHJhZ0Ryb3BJbmZvKGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKSB7XG4gICAgaWYgKCFkcmFnRHJvcEluZm8uZGVzdGluYXRpb24pIHJldHVybjtcbiAgICB2YXIgcGFuZWwgPSAoPElFbGVtZW50PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbikuaXNQYW5lbFxuICAgICAgPyA8SVBhbmVsPig8YW55PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbilcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoIXBhbmVsKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgIWRyYWdEcm9wSW5mby50YXJnZXQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHBhbmVsLmdldENoaWxkcmVuTGF5b3V0VHlwZSgpKVxuICAgICkge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzRWRnZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgdmFyIGRlc3QgPSB0aGlzLmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoIWRlc3QgfHwgIXRoaXMuc3VydmV5KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgaW5zZXJ0QmVmb3JlOiBJRWxlbWVudCA9IG51bGw7XG4gICAgdmFyIGluc2VydEFmdGVyOiBJRWxlbWVudCA9IG51bGw7XG4gICAgdmFyIHBhcmVudCA9XG4gICAgICBkZXN0LmlzUGFnZSB8fCAoIXRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSAmJiAoPElFbGVtZW50PmRlc3QpLmlzUGFuZWwpXG4gICAgICAgID8gZGVzdFxuICAgICAgICA6ICg8SUVsZW1lbnQ+ZGVzdCkucGFyZW50O1xuICAgIGlmICghZGVzdC5pc1BhZ2UpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSAoPElFbGVtZW50PmRlc3QpLnBhcmVudDtcbiAgICAgIGlmICghIWNvbnRhaW5lcikge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSAoPFBhbmVsTW9kZWxCYXNlPmNvbnRhaW5lcikuZWxlbWVudHM7XG4gICAgICAgIHZhciBpbmRleCA9IGVsZW1lbnRzLmluZGV4T2YoPElFbGVtZW50PmRlc3QpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGluc2VydEJlZm9yZSA9IDxJRWxlbWVudD5kZXN0O1xuICAgICAgICAgIGluc2VydEFmdGVyID0gPElFbGVtZW50PmRlc3Q7XG4gICAgICAgICAgaWYgKHRoaXMuZHJhZ0Ryb3BJbmZvLmlzQm90dG9tKSB7XG4gICAgICAgICAgICBpbnNlcnRCZWZvcmUgPVxuICAgICAgICAgICAgICBpbmRleCA8IGVsZW1lbnRzLmxlbmd0aCAtIDEgPyBlbGVtZW50c1tpbmRleCArIDFdIDogbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBpbmRleCA+IDAgPyBlbGVtZW50c1tpbmRleCAtIDFdIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICB0YXJnZXQ6IHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgIHNvdXJjZTogdGhpcy5kcmFnRHJvcEluZm8uc291cmNlLFxuICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICBpbnNlcnRBZnRlcjogaW5zZXJ0QWZ0ZXIsXG4gICAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmRyYWdBbmREcm9wQWxsb3cob3B0aW9ucyk7XG4gIH1cbiAgcHVibGljIGRyYWdEcm9wRmluaXNoKGlzQ2FuY2VsOiBib29sZWFuID0gZmFsc2UpOiBJRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSW5mbykgcmV0dXJuO1xuICAgIHZhciB0YXJnZXQgPSB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQ7XG4gICAgdmFyIHJvdyA9IHRoaXMuZHJhZ0Ryb3BGaW5kUm93KHRhcmdldCk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gdGhpcy5kcmFnRHJvcEdldEVsZW1lbnRJbmRleCh0YXJnZXQsIHJvdyk7XG4gICAgdGhpcy51cGRhdGVSb3dzUmVtb3ZlRWxlbWVudEZyb21Sb3codGFyZ2V0LCByb3cpO1xuICAgIGlmICghaXNDYW5jZWwgJiYgISFyb3cpIHtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmRyYWdEcm9wSW5mby5zb3VyY2U7XG4gICAgICB2YXIgaXNTYW1lUGFuZWwgPSBmYWxzZTtcbiAgICAgIGlmICghIXNyYyAmJiAhIXNyYy5wYXJlbnQpIHtcbiAgICAgICAgaXNTYW1lUGFuZWwgPSByb3cucGFuZWwgPT0gc3JjLnBhcmVudDtcbiAgICAgICAgaWYgKGlzU2FtZVBhbmVsKSB7XG4gICAgICAgICAgcm93LnBhbmVsLmRyYWdEcm9wTW92ZUVsZW1lbnQoc3JjLCB0YXJnZXQsIHRhcmdldEluZGV4KTtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNyYy5wYXJlbnQucmVtb3ZlRWxlbWVudChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0SW5kZXggPiAtMSkge1xuICAgICAgICByb3cucGFuZWwuYWRkRWxlbWVudCh0YXJnZXQsIHRhcmdldEluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEluZm8gPSBudWxsO1xuICAgIHJldHVybiAhaXNDYW5jZWwgPyB0YXJnZXQgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BHZXRFbGVtZW50SW5kZXgoXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXJvdykgcmV0dXJuIC0xO1xuICAgIHZhciBpbmRleCA9IHJvdy5lbGVtZW50cy5pbmRleE9mKHRhcmdldCk7XG4gICAgaWYgKHJvdy5pbmRleCA9PSAwKSByZXR1cm4gaW5kZXg7XG4gICAgdmFyIHByZXZSb3cgPSByb3cucGFuZWwucm93c1tyb3cuaW5kZXggLSAxXTtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Um93LmVsZW1lbnRzW3ByZXZSb3cuZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGluZGV4ICsgcm93LnBhbmVsLmVsZW1lbnRzLmluZGV4T2YocHJldkVsZW1lbnQpICsgMTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcFRhZ2VydCgpOiBib29sZWFuIHtcbiAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoIWRlc3RpbmF0aW9uIHx8IGRlc3RpbmF0aW9uLmlzUGFnZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BDYW5Ecm9wQ29yZShcbiAgICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgIDxJRWxlbWVudD5kZXN0aW5hdGlvblxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BTb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZTtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gPElFbGVtZW50PnRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIGlmICghdGhpcy5kcmFnRHJvcENhbkRyb3BDb3JlKHNvdXJjZSwgZGVzdGluYXRpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BDYW5Ecm9wTm90TmV4dChcbiAgICAgIHNvdXJjZSxcbiAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8uaXNFZGdlLFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8uaXNCb3R0b21cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wQ29yZShcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIGRlc3RpbmF0aW9uOiBJRWxlbWVudFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRlc3RpbmF0aW9uKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5kcmFnRHJvcElzU2FtZUVsZW1lbnQoZGVzdGluYXRpb24sIHRhcmdldCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGFyZ2V0LmlzUGFuZWwpIHtcbiAgICAgIHZhciBwbmwgPSA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+dGFyZ2V0KTtcbiAgICAgIGlmIChcbiAgICAgICAgcG5sLmNvbnRhaW5zRWxlbWVudChkZXN0aW5hdGlvbikgfHxcbiAgICAgICAgISFwbmwuZ2V0RWxlbWVudEJ5TmFtZShkZXN0aW5hdGlvbi5uYW1lKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wTm90TmV4dChcbiAgICBzb3VyY2U6IElFbGVtZW50LFxuICAgIGRlc3RpbmF0aW9uOiBJRWxlbWVudCxcbiAgICBpc0VkZ2U6IGJvb2xlYW4sXG4gICAgaXNCb3R0b206IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkZXN0aW5hdGlvbiB8fCAoZGVzdGluYXRpb24uaXNQYW5lbCAmJiAhaXNFZGdlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNvdXJjZS5wYXJlbnQgIT09IGRlc3RpbmF0aW9uLnBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHBubCA9IDxQYW5lbE1vZGVsQmFzZT5zb3VyY2UucGFyZW50O1xuICAgIHZhciBzcmNJbmRleCA9IHBubC5lbGVtZW50cy5pbmRleE9mKHNvdXJjZSk7XG4gICAgdmFyIGRlc3RJbmRleCA9IHBubC5lbGVtZW50cy5pbmRleE9mKGRlc3RpbmF0aW9uKTtcbiAgICBpZiAoZGVzdEluZGV4IDwgc3JjSW5kZXggJiYgIWlzQm90dG9tKSBkZXN0SW5kZXgtLTtcbiAgICBpZiAoaXNCb3R0b20pIGRlc3RJbmRleCsrO1xuICAgIHJldHVybiBzcmNJbmRleCA8IGRlc3RJbmRleFxuICAgICAgPyBkZXN0SW5kZXggLSBzcmNJbmRleCA+IDFcbiAgICAgIDogc3JjSW5kZXggLSBkZXN0SW5kZXggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmFnRHJvcElzU2FtZUVsZW1lbnQoZWwxOiBJRWxlbWVudCwgZWwyOiBJRWxlbWVudCkge1xuICAgIHJldHVybiBlbDEgPT0gZWwyIHx8IGVsMS5uYW1lID09IGVsMi5uYW1lO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFnZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW5oZXJpdFwiLFxuICAgICAgY2hvaWNlczogW1wiaW5oZXJpdFwiLCBcInNob3dcIiwgXCJoaWRlXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFnZU1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGFnZS50cyIsImltcG9ydCB7IEJhc2UsIElRdWVzdGlvbiwgRXZlbnQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gIHB1YmxpYyBodG1sVGVtcGxhdGU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHdpZGdldEpzb246IGFueSkge1xuICAgIHRoaXMuaHRtbFRlbXBsYXRlID0gd2lkZ2V0SnNvbi5odG1sVGVtcGxhdGUgPyB3aWRnZXRKc29uLmh0bWxUZW1wbGF0ZSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGVsOiBhbnkpIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKSB0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIocXVlc3Rpb24sIGVsKTtcbiAgfVxuICBwdWJsaWMgd2lsbFVubW91bnQocXVlc3Rpb246IElRdWVzdGlvbiwgZWw6IGFueSkge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24ud2lsbFVubW91bnQpIHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudChxdWVzdGlvbiwgZWwpO1xuICB9XG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUocXVlc3Rpb246IElRdWVzdGlvbiwgdmFsdWU6IGFueSA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi5nZXREaXNwbGF5VmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmdldERpc3BsYXlWYWx1ZShxdWVzdGlvbiwgdmFsdWUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBpc0ZpdChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmlzRml0KVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0ZpdChxdWVzdGlvbik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzTGlicmFyeUxvYWRlZCgpICYmIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzTGlicmFyeUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpID09IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0RlZmF1bHRSZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXI7XG4gIH1cbiAgcHVibGljIGdldCBwZGZRdWVzdGlvblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnBkZlF1ZXN0aW9uVHlwZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBkZlJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnBkZlJlbmRlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gPSBuZXcgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbigpO1xuICBwcml2YXRlIHdpZGdldHNWYWx1ZXM6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiA9IFtdO1xuICBwcml2YXRlIHdpZGdldHNBY3RpdmF0ZWRCeSA9IHt9O1xuXG4gIHB1YmxpYyBvbkN1c3RvbVdpZGdldEFkZGVkOiBFdmVudDxcbiAgICAoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChjdXN0b21XaWRnZXQ6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0KSA9PiBhbnksIGFueT4oKTtcblxuICBwdWJsaWMgZ2V0IHdpZGdldHMoKTogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgdmFyIG5hbWUgPSB3aWRnZXRKc29uLm5hbWU7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gXCJ3aWRnZXRfXCIgKyB0aGlzLndpZGdldHMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbVdpZGdldCA9IG5ldyBRdWVzdGlvbkN1c3RvbVdpZGdldChuYW1lLCB3aWRnZXRKc29uKTtcbiAgICB0aGlzLndpZGdldHNWYWx1ZXMucHVzaChjdXN0b21XaWRnZXQpO1xuICAgICg8YW55PnRoaXMpLndpZGdldHNBY3RpdmF0ZWRCeVtuYW1lXSA9IGFjdGl2YXRlZEJ5O1xuICAgIGN1c3RvbVdpZGdldC5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIHRoaXMub25DdXN0b21XaWRnZXRBZGRlZC5maXJlKGN1c3RvbVdpZGdldCwgbnVsbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHdheSB0aGUgY3VzdG9tIHdpZ2V0IGlzIGFjdGl2YXRlZC4gSXQgY2FuIGJlIGFjdGl2YXRlZCBieSBhIHByb3BlcnR5IChcInByb3BlcnR5XCIpLCBxdWVzdGlvbiB0eXBlIChcInR5cGVcIikgb3IgYnkgbmV3L2N1c3RvbSBxdWVzdGlvbiB0eXBlIChcImN1c3RvbXR5cGVcIikuXG4gICAqIEBwYXJhbSB3aWRnZXROYW1lIHRoZSBjdXN0b20gd2lkZ2V0IG5hbWVcbiAgICogQHNlZSBzZXRBY3RpdmF0ZWRCeVxuICAgKi9cbiAgcHVibGljIGdldEFjdGl2YXRlZEJ5KHdpZGdldE5hbWU6IHN0cmluZykge1xuICAgIHZhciByZXMgPSAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV07XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwicHJvcGVydHlcIjtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgd2F5IHRoZSBjdXN0b20gd2lnZXQgaXMgYWN0aXZhdGVkLiBUaGUgYWN0aXZhdGlvbiB0eXBlcyBhcmU6IHByb3BlcnR5IChcInByb3BlcnR5XCIpLCBxdWVzdGlvbiB0eXBlIChcInR5cGVcIikgb3IgbmV3L2N1c3RvbSBxdWVzdGlvbiB0eXBlIChcImN1c3RvbXR5cGVcIikuIEEgY3VzdG9tIHdpZ2V0IG1heSBzdXBwb3J0IGFsbCBvciBvbmx5IHNvbWUgb2YgdGhpcyBhY3RpdmF0aW9uIHR5cGVzLlxuICAgKiBAcGFyYW0gd2lkZ2V0TmFtZVxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQnkgdGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHZhcmlhbnRzOiBcInByb3BlcnR5XCIsIFwidHlwZVwiIGFuZCBcImN1c3RvbXR5cGVcIlxuICAgKi9cbiAgcHVibGljIHNldEFjdGl2YXRlZEJ5KHdpZGdldE5hbWU6IHN0cmluZywgYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICghd2lkZ2V0TmFtZSB8fCAhYWN0aXZhdGVkQnkpIHJldHVybjtcbiAgICB2YXIgd2lkZ2V0ID0gdGhpcy5nZXRDdXN0b21XaWRnZXRCeU5hbWUod2lkZ2V0TmFtZSk7XG4gICAgaWYgKCF3aWRnZXQpIHJldHVybjtcbiAgICAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV0gPSBhY3RpdmF0ZWRCeTtcbiAgICB3aWRnZXQuYWN0aXZhdGVkQnlDaGFuZ2VkKGFjdGl2YXRlZEJ5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy53aWRnZXRzVmFsdWVzID0gW107XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy53aWRnZXRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tV2lkZ2V0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHNWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNWYWx1ZXNbaV0uaXNGaXQocXVlc3Rpb24pKSByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0cy50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgZHJvcGRvd24gcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImNob2ljZXNNaW5cIiwgXCJjaG9pY2VzTWF4XCIsIFwiY2hvaWNlc1N0ZXBcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIHRvIHNob3cgb3B0aW9ucyBjYXB0aW9uIGl0ZW0gKCdDaG9vc2UuLi4nKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09wdGlvbnNDYXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93T3B0aW9uc0NhcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93T3B0aW9uc0NhcHRpb24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd09wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgb3B0aW9ucyBjYXB0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0YWtlbiBmcm9tIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBvcHRpb25zQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3B0aW9uc0NhcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY09wdGlvbnNDYXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIG1pbk1heENob2ljZXMgPSA8QXJyYXk8SXRlbVZhbHVlPj5bXTtcbiAgcHJvdGVjdGVkIGdldENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIGl0ZW1zID0gc3VwZXIuZ2V0Q2hvaWNlcygpO1xuICAgIGlmICh0aGlzLmNob2ljZXNNYXggPD0gdGhpcy5jaG9pY2VzTWluKSByZXR1cm4gaXRlbXM7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKGl0ZW1zW2ldKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5taW5NYXhDaG9pY2VzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgdGhpcy5taW5NYXhDaG9pY2VzLmxlbmd0aCAhPT1cbiAgICAgICAgKHRoaXMuY2hvaWNlc01heCAtIHRoaXMuY2hvaWNlc01pbikgLyB0aGlzLmNob2ljZXNTdGVwICsgMVxuICAgICkge1xuICAgICAgdGhpcy5taW5NYXhDaG9pY2VzID0gW107XG4gICAgICBmb3IgKFxuICAgICAgICB2YXIgaSA9IHRoaXMuY2hvaWNlc01pbjtcbiAgICAgICAgaSA8PSB0aGlzLmNob2ljZXNNYXg7XG4gICAgICAgIGkgKz0gdGhpcy5jaG9pY2VzU3RlcFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubWluTWF4Q2hvaWNlcy5wdXNoKG5ldyBJdGVtVmFsdWUoaSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXMgPSByZXMuY29uY2F0KHRoaXMubWluTWF4Q2hvaWNlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgYW5kIGNob2ljZXNNYXggcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBhZGQgY2hvaWNlcy4gRm9yIGV4YW1wbGUgY2hvaWNlc01pbiA9IDEgYW5kIGNob2ljZXNNYXggPSAxMCB3aWxsIGdlbmVyYXRlIHRlbiBhZGRpdGlvbmFsIGNob2ljZXMgZnJvbSAxIHRvIDEwLlxuICAgKiBAc2VlIGNob2ljZXNNYXhcbiAgICogQHNlZSBjaG9pY2VzU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzTWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNNaW5cIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzTWluKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01pblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBhbmQgY2hvaWNlc01heCBwcm9wZXJ0eSB0byBhdXRvbWF0aWNhbGx5IGFkZCBjaG9pY2VzLiBGb3IgZXhhbXBsZSBjaG9pY2VzTWluID0gMSBhbmQgY2hvaWNlc01heCA9IDEwIHdpbGwgZ2VuZXJhdGUgdGVuIGFkZGl0aW9uYWwgY2hvaWNlcyBmcm9tIDEgdG8gMTAuXG4gICAqIEBzZWUgY2hvaWNlc01pblxuICAgKiBAc2VlIGNob2ljZXNTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNNYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01heFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNNYXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzTWF4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuIEl0IHRlbGxzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgYmV0d2VlbiBjaG9pY2VzTWluIGFuZCBjaG9pY2VzTWF4IHByb3BlcnRpZXMuXG4gICAqIElmIGNob2ljZXNNaW4gPSAxMCwgY2hvaWNlc01heCA9IDMwIGFuZCBjaG9pY2VzU3RlcCA9IDEwIHRoZW4geW91IHdpbGwgaGF2ZSBvbmx5IHRocmVlIGFkZGl0aW9uYWwgY2hvaWNlczogWzEwLCAyMCwgMzBdLlxuICAgKiBAc2VlIGNob2ljZXNNaW5cbiAgICogQHNlZSBjaG9pY2VzTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNTdGVwXCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc1N0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSkgdmFsID0gMTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzU3RlcFwiLCB2YWwpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImRyb3Bkb3duXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7IG5hbWU6IFwic2hvd09wdGlvbnNDYXB0aW9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJjaG9pY2VzTWluOm51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAgeyBuYW1lOiBcImNob2ljZXNNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgICB7IG5hbWU6IFwiY2hvaWNlc1N0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIG1pblZhbHVlOiAxIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwic2VsZWN0YmFzZVwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJkcm9wZG93blwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25Ecm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGV4cHJlc3Npb24gcXVlc3Rpb24uIEl0IGlzIGEgcmVhZC1vbmx5IHF1ZXN0aW9uLiBJdCBjYWxjdWxhdGVzIHZhbHVlIGJhc2VkIG9uIGVweHJlc3Npb24gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBleHByZXNzaW9uSXNSdW5uaW5nOiBib29sZWFuO1xuICBwcml2YXRlIGV4cHJlc3Npb25SdW5uZXI6IEV4cHJlc3Npb25SdW5uZXI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiZm9ybWF0XCIsIHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiZXhwcmVzc2lvblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgICAgc2VsZi5leHByZXNzaW9uUnVubmVyID0gbmV3IEV4cHJlc3Npb25SdW5uZXIoc2VsZi5leHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb25cIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4geW91ciBvd24gZm9ybWF0LiBNYWtlIHN1cmUgeW91IGhhdmUgXCJ7MH1cIiBzdWJzdHJpbmcgaW4geW91ciBzdHJpbmcsIHRvIGRpc3BsYXkgdGhlIGFjdHVhbCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZm9ybWF0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZm9ybWF0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRm9ybWF0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImZvcm1hdFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIEV4cHJlc3Npb24gdGhhdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcXVlc3Rpb24gdmFsdWUuIFlvdSBtYXkgdXNlIHN0YW5kYXJkIG9wZXJhdG9ycyBsaWtlICssIC0sICogYW5kIC8sIHNxdWFyZXMgKCkuIEhlcmUgaXMgdGhlIGV4YW1wbGUgb2YgYWNjZXNzaW5nIHRoZSBxdWVzdGlvbiB2YWx1ZSB7cXVlc3Rpb25uYW1lfS5cbiAgICogPGJyLz5FeGFtcGxlOiBcIih7cXVhbnRpdHl9ICoge3ByaWNlfSkgKiAoMTAwIC0ge2Rpc2NvdW50fSkgLyAxMDBcIlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBsb2NDYWxjdWxhdGlvbigpIHtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB1bmxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbiB8fCB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcpIHJldHVybjtcbiAgICB0aGlzLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gbmV3VmFsdWUgPT4ge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudW5sb2NDYWxjdWxhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy5leHByZXNzaW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIHVzZSBpZiBkaXNwbGF5U3R5bGUgaXMgbm90IFwibm9uZVwiLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gMCB0byAyMC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEgYW5kIGl0IG1lYW5zIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4aW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhpbXVtRnJhY3Rpb25EaWdpdHModmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgLTEgfHwgdmFsID4gMjApIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cyB0byB1c2UgaWYgZGlzcGxheVN0eWxlIGlzIG5vdCBcIm5vbmVcIi4gUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIDAgdG8gMjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xIGFuZCBpdCBtZWFucyB0aGF0IHRoaXMgcHJvcGVydHkgaXMgbm90IHVzZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbmltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluaW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbCA9IHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBcIlwiO1xuICAgIHZhciBzdHIgPSB0aGlzLmdldFZhbHVlQXNTdHIodmFsKTtcbiAgICBpZiAoIXRoaXMuZm9ybWF0KSByZXR1cm4gc3RyO1xuICAgIHJldHVybiAoPGFueT50aGlzLmZvcm1hdClbXCJmb3JtYXRcIl0oc3RyKTtcbiAgfVxuICAvKipcbiAgICogWW91IG1heSBzZXQgdGhpcyBwcm9wZXJ0eSB0byBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIiBvciBcImRhdGVcIi4gSWYgeW91IHNldCBpdCB0byBcImN1cnJlbmN5XCIsIHlvdSBtYXkgdXNlIHRoZSBjdXJyZW5jeSBwcm9wZXJ0eSB0byBkaXNwbGF5IHRoZSB2YWx1ZSBpbiBjdXJyZW5jeSBkaWZmZXJlbnQgZnJvbSBVU0QuXG4gICAqIEBzZWUgY3VycmVuY3lcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzcGxheVN0eWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlTdHlsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRpc3BsYXlTdHlsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlTdHlsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gdGhlIGN1cnJlbmN5IGRpZmZlcmVuIGZyb20gVVNELiBUaGUgZGlzcGxheVN0eXBlIHNob3VsZCBiZSBzZXQgdG8gXCJjdXJyZW5jeVwiLlxuICAgKiBAc2VlIGRpc3BsYXlTdHlsZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbmN5KHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKGdldEN1cnJlY3lDb2RlcygpLmluZGV4T2YodmFsKSA8IDApIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdXNlR3JvdXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVzZUdyb3VwaW5nXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlR3JvdXBpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVBc1N0cih2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGlzcGxheVN0eWxlID09IFwiZGF0ZVwiKSB7XG4gICAgICB2YXIgZCA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICBpZiAoISFkICYmICEhZC50b0xvY2FsZURhdGVTdHJpbmcpIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXNwbGF5U3R5bGUgIT0gXCJub25lXCIgJiYgSGVscGVycy5pc051bWJlcih2YWwpKSB7XG4gICAgICB2YXIgbG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoKTtcbiAgICAgIGlmICghbG9jYWxlKSBsb2NhbGUgPSBcImVuXCI7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3R5bGU6IHRoaXMuZGlzcGxheVN0eWxlLFxuICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSxcbiAgICAgICAgdXNlR3JvdXBpbmc6IHRoaXMudXNlR3JvdXBpbmdcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPiAtMSkge1xuICAgICAgICAoPGFueT5vcHRpb25zKVtcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiXSA9IHRoaXMubWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWluaW11bUZyYWN0aW9uRGlnaXRzID4gLTEpIHtcbiAgICAgICAgKDxhbnk+b3B0aW9ucylbXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIl0gPSB0aGlzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZWN5Q29kZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiBbXG4gICAgXCJBRURcIixcbiAgICBcIkFGTlwiLFxuICAgIFwiQUxMXCIsXG4gICAgXCJBTURcIixcbiAgICBcIkFOR1wiLFxuICAgIFwiQU9BXCIsXG4gICAgXCJBUlNcIixcbiAgICBcIkFVRFwiLFxuICAgIFwiQVdHXCIsXG4gICAgXCJBWk5cIixcbiAgICBcIkJBTVwiLFxuICAgIFwiQkJEXCIsXG4gICAgXCJCRFRcIixcbiAgICBcIkJHTlwiLFxuICAgIFwiQkhEXCIsXG4gICAgXCJCSUZcIixcbiAgICBcIkJNRFwiLFxuICAgIFwiQk5EXCIsXG4gICAgXCJCT0JcIixcbiAgICBcIkJPVlwiLFxuICAgIFwiQlJMXCIsXG4gICAgXCJCU0RcIixcbiAgICBcIkJUTlwiLFxuICAgIFwiQldQXCIsXG4gICAgXCJCWU5cIixcbiAgICBcIkJaRFwiLFxuICAgIFwiQ0FEXCIsXG4gICAgXCJDREZcIixcbiAgICBcIkNIRVwiLFxuICAgIFwiQ0hGXCIsXG4gICAgXCJDSFdcIixcbiAgICBcIkNMRlwiLFxuICAgIFwiQ0xQXCIsXG4gICAgXCJDTllcIixcbiAgICBcIkNPUFwiLFxuICAgIFwiQ09VXCIsXG4gICAgXCJDUkNcIixcbiAgICBcIkNVQ1wiLFxuICAgIFwiQ1VQXCIsXG4gICAgXCJDVkVcIixcbiAgICBcIkNaS1wiLFxuICAgIFwiREpGXCIsXG4gICAgXCJES0tcIixcbiAgICBcIkRPUFwiLFxuICAgIFwiRFpEXCIsXG4gICAgXCJFR1BcIixcbiAgICBcIkVSTlwiLFxuICAgIFwiRVRCXCIsXG4gICAgXCJFVVJcIixcbiAgICBcIkZKRFwiLFxuICAgIFwiRktQXCIsXG4gICAgXCJHQlBcIixcbiAgICBcIkdFTFwiLFxuICAgIFwiR0hTXCIsXG4gICAgXCJHSVBcIixcbiAgICBcIkdNRFwiLFxuICAgIFwiR05GXCIsXG4gICAgXCJHVFFcIixcbiAgICBcIkdZRFwiLFxuICAgIFwiSEtEXCIsXG4gICAgXCJITkxcIixcbiAgICBcIkhSS1wiLFxuICAgIFwiSFRHXCIsXG4gICAgXCJIVUZcIixcbiAgICBcIklEUlwiLFxuICAgIFwiSUxTXCIsXG4gICAgXCJJTlJcIixcbiAgICBcIklRRFwiLFxuICAgIFwiSVJSXCIsXG4gICAgXCJJU0tcIixcbiAgICBcIkpNRFwiLFxuICAgIFwiSk9EXCIsXG4gICAgXCJKUFlcIixcbiAgICBcIktFU1wiLFxuICAgIFwiS0dTXCIsXG4gICAgXCJLSFJcIixcbiAgICBcIktNRlwiLFxuICAgIFwiS1BXXCIsXG4gICAgXCJLUldcIixcbiAgICBcIktXRFwiLFxuICAgIFwiS1lEXCIsXG4gICAgXCJLWlRcIixcbiAgICBcIkxBS1wiLFxuICAgIFwiTEJQXCIsXG4gICAgXCJMS1JcIixcbiAgICBcIkxSRFwiLFxuICAgIFwiTFNMXCIsXG4gICAgXCJMWURcIixcbiAgICBcIk1BRFwiLFxuICAgIFwiTURMXCIsXG4gICAgXCJNR0FcIixcbiAgICBcIk1LRFwiLFxuICAgIFwiTU1LXCIsXG4gICAgXCJNTlRcIixcbiAgICBcIk1PUFwiLFxuICAgIFwiTVJPXCIsXG4gICAgXCJNVVJcIixcbiAgICBcIk1WUlwiLFxuICAgIFwiTVdLXCIsXG4gICAgXCJNWE5cIixcbiAgICBcIk1YVlwiLFxuICAgIFwiTVlSXCIsXG4gICAgXCJNWk5cIixcbiAgICBcIk5BRFwiLFxuICAgIFwiTkdOXCIsXG4gICAgXCJOSU9cIixcbiAgICBcIk5PS1wiLFxuICAgIFwiTlBSXCIsXG4gICAgXCJOWkRcIixcbiAgICBcIk9NUlwiLFxuICAgIFwiUEFCXCIsXG4gICAgXCJQRU5cIixcbiAgICBcIlBHS1wiLFxuICAgIFwiUEhQXCIsXG4gICAgXCJQS1JcIixcbiAgICBcIlBMTlwiLFxuICAgIFwiUFlHXCIsXG4gICAgXCJRQVJcIixcbiAgICBcIlJPTlwiLFxuICAgIFwiUlNEXCIsXG4gICAgXCJSVUJcIixcbiAgICBcIlJXRlwiLFxuICAgIFwiU0FSXCIsXG4gICAgXCJTQkRcIixcbiAgICBcIlNDUlwiLFxuICAgIFwiU0RHXCIsXG4gICAgXCJTRUtcIixcbiAgICBcIlNHRFwiLFxuICAgIFwiU0hQXCIsXG4gICAgXCJTTExcIixcbiAgICBcIlNPU1wiLFxuICAgIFwiU1JEXCIsXG4gICAgXCJTU1BcIixcbiAgICBcIlNURFwiLFxuICAgIFwiU1ZDXCIsXG4gICAgXCJTWVBcIixcbiAgICBcIlNaTFwiLFxuICAgIFwiVEhCXCIsXG4gICAgXCJUSlNcIixcbiAgICBcIlRNVFwiLFxuICAgIFwiVE5EXCIsXG4gICAgXCJUT1BcIixcbiAgICBcIlRSWVwiLFxuICAgIFwiVFREXCIsXG4gICAgXCJUV0RcIixcbiAgICBcIlRaU1wiLFxuICAgIFwiVUFIXCIsXG4gICAgXCJVR1hcIixcbiAgICBcIlVTRFwiLFxuICAgIFwiVVNOXCIsXG4gICAgXCJVWUlcIixcbiAgICBcIlVZVVwiLFxuICAgIFwiVVpTXCIsXG4gICAgXCJWRUZcIixcbiAgICBcIlZORFwiLFxuICAgIFwiVlVWXCIsXG4gICAgXCJXU1RcIixcbiAgICBcIlhBRlwiLFxuICAgIFwiWEFHXCIsXG4gICAgXCJYQVVcIixcbiAgICBcIlhCQVwiLFxuICAgIFwiWEJCXCIsXG4gICAgXCJYQkNcIixcbiAgICBcIlhCRFwiLFxuICAgIFwiWENEXCIsXG4gICAgXCJYRFJcIixcbiAgICBcIlhPRlwiLFxuICAgIFwiWFBEXCIsXG4gICAgXCJYUEZcIixcbiAgICBcIlhQVFwiLFxuICAgIFwiWFNVXCIsXG4gICAgXCJYVFNcIixcbiAgICBcIlhVQVwiLFxuICAgIFwiWFhYXCIsXG4gICAgXCJZRVJcIixcbiAgICBcIlpBUlwiLFxuICAgIFwiWk1XXCIsXG4gICAgXCJaV0xcIlxuICBdO1xufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImV4cHJlc3Npb25cIixcbiAgW1xuICAgIFwiZXhwcmVzc2lvbjpleHByZXNzaW9uXCIsXG4gICAgeyBuYW1lOiBcImZvcm1hdFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRm9ybWF0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImRpc3BsYXlTdHlsZVwiLFxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiZGVjaW1hbFwiLCBcImN1cnJlbmN5XCIsIFwicGVyY2VudFwiLCBcImRhdGVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3VycmVuY3lcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlY3lDb2RlcygpO1xuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IFwiVVNEXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcIm1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwidXNlR3JvdXBpbmc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImNvbW1lbnRUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVhZE9ubHlcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZElmXCIsIHZpc2libGU6IGZhbHNlIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJleHByZXNzaW9uXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsImltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBFbWFpbFZhbGlkYXRvciwgU3VydmV5VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYW4gaW5wdXQgdGV4dCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uVGV4dE1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dFR5cGUgPT0gXCJ0ZXh0XCI7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5wdXRUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSBcImRhdGV0aW1lX2xvY2FsXCIpIHZhbCA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIiwgdmFsLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHZhciB2YWxpZGF0b3JzID0gc3VwZXIuZ2V0VmFsaWRhdG9ycygpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5wdXRUeXBlID09PSBcImVtYWlsXCIgJiZcbiAgICAgICF0aGlzLnZhbGlkYXRvcnMuc29tZSh2ID0+IHYuZ2V0VHlwZSgpID09PSBcImVtYWlsdmFsaWRhdG9yXCIpXG4gICAgKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbWltIHRleHQgbGVuZ3RoLiBJZiBpdCBpcyAtMSwgZGVmYXVsIHZhbHVlLCB0aGVuIHRoZSBzdXJ2ZXkgbWF4VGV4dExlbmd0aCBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQuXG4gICAqIElmIGl0IGlzIDAsIHRoZW4gdGhlIHZhbHVlIGlzIHVubGltaXRlZFxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRNYXhMZW5ndGgoKTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRNYXhMZW5ndGgoXG4gICAgICB0aGlzLm1heExlbmd0aCxcbiAgICAgIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkubWF4VGV4dExlbmd0aCA6IC0xXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgaW5wdXQgc2l6ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNpemVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2l6ZVwiLCB2YWwpO1xuICB9XG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmlzRW1wdHkoKSB8fCB0aGlzLnZhbHVlID09PSBcIlwiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZVR5cGUobmV3VmFsdWUpO1xuICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY29ycmVjdFZhbHVlVHlwZShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIW5ld1ZhbHVlKSByZXR1cm4gbmV3VmFsdWU7XG4gICAgaWYgKHRoaXMuaW5wdXRUeXBlID09IFwibnVtYmVyXCIgfHwgdGhpcy5pbnB1dFR5cGUgPT0gXCJyYW5nZVwiKSB7XG4gICAgICByZXR1cm4gSGVscGVycy5pc051bWJlcihuZXdWYWx1ZSkgPyBwYXJzZUZsb2F0KG5ld1ZhbHVlKSA6IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzKTtcbiAgICBzdXBwb3J0ZWRWYWxpZGF0b3JzLnB1c2goXCJudW1lcmljXCIsIFwidGV4dFwiLCBcInJlZ2V4XCIsIFwiZW1haWxcIik7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ0ZXh0XCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImlucHV0VHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJ0ZXh0XCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIFwiY29sb3JcIixcbiAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgIFwiZGF0ZXRpbWVcIixcbiAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwibW9udGhcIixcbiAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICBcInJhbmdlXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGV4dFwiLFxuICAgICAgICBcInRpbWVcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ3ZWVrXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaXplOm51bWJlclwiLCBkZWZhdWx0OiAyNSB9LFxuICAgIHsgbmFtZTogXCJtYXhMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIG5vbiB2YWx1ZSBxdWVzdGlvbi4gVGhpcyBxdWVzdGlvbiBkb2Vzbid0IGFkZCBhbnkgbmV3IGZ1bmN0aW9uYWxpdHkuIEl0IGhpZGVzIHNvbWUgcHJvcGVydGllcywgaW5jbHVkaW5nIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTm9uVmFsdWUgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5vbnZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHt9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIGNvbnRleHQ6IGFueVxuICApIHt9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJub252YWx1ZVwiLFxuICBbXG4gICAgeyBuYW1lOiBcInRpdGxlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInZhbHVlTmFtZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJlbmFibGVJZlwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJpc1JlcXVpcmVkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlYWRPbmx5XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkSWZcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ0aXRsZUxvY2F0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIsIHZpc2libGU6IGZhbHNlIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk5vblZhbHVlKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25ub252YWx1ZS50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSVN1cnZleUNyZWF0b3IgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uUm93TW9kZWwsIFBhbmVsTW9kZWwsIFBhbmVsTW9kZWxCYXNlIH0gZnJvbSBcIi4uL3BhbmVsXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleVJvdyB9IGZyb20gXCIuL3Jvd1wiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UGFuZWxCYXNlIGV4dGVuZHMgU3VydmV5RWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdGF0ZUVsZW1lbnQoKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxCYXNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgc3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGNyZWF0b3IoKTogSVN1cnZleUNyZWF0b3Ige1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNyZWF0b3I7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDc3MoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhbmVsQmFzZSgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFuZWxCYXNlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFBhbmVsQmFzZSgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZWxlbWVudDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zdXJ2ZXk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNzcztcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIHRoaXMuZG9BZnRlclJlbmRlcigpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgdmFyIGVsOiBhbnkgPSB0aGlzLnJlZnNbXCJyb290XCJdO1xuICAgIGlmICghIWVsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIpO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBhbnksIHByZXZTdGF0ZTogYW55KSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKTtcbiAgICBpZiAoXG4gICAgICAhIXByZXZQcm9wcy5wYWdlICYmXG4gICAgICAhIXRoaXMuc3VydmV5ICYmXG4gICAgICAhIXRoaXMuc3VydmV5LmN1cnJlbnRQYWdlICYmXG4gICAgICBwcmV2UHJvcHMucGFnZS5uYW1lID09PSB0aGlzLnN1cnZleS5jdXJyZW50UGFnZS5uYW1lXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZG9BZnRlclJlbmRlcigpO1xuICB9XG4gIHByaXZhdGUgZG9BZnRlclJlbmRlcigpIHtcbiAgICB2YXIgZWw6IGFueSA9IHRoaXMucmVmc1tcInJvb3RcIl07XG4gICAgaWYgKGVsICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICBpZiAodGhpcy5wYW5lbEJhc2UuaXNQYW5lbCkge1xuICAgICAgICB0aGlzLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKHRoaXMucGFuZWxCYXNlIGFzIFBhbmVsTW9kZWwsIGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3VydmV5LmFmdGVyUmVuZGVyUGFnZShlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCByZW5kZXJSb3dzKGNzczogYW55KTogQXJyYXk8SlNYLkVsZW1lbnQ+IHtcbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciBxdWVzdGlvblJvd3MgPSB0aGlzLnBhbmVsQmFzZS5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25Sb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzLnB1c2godGhpcy5jcmVhdGVSb3cocXVlc3Rpb25Sb3dzW2ldLCBpLCBjc3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdyhcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjc3M6IGFueVxuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHJvd05hbWUgPSBcInJvd1wiICsgKGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlSb3dcbiAgICAgICAga2V5PXtyb3dOYW1lfVxuICAgICAgICByb3c9e3Jvd31cbiAgICAgICAgc3VydmV5PXt0aGlzLnN1cnZleX1cbiAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICBjc3M9e2Nzc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3BhbmVsLWJhc2UudHN4IiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzdXJ2ZXkgcnVubmluZyBpbiB0aGUgV2luZG93LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBzdXJ2ZXlFbGVtZW50TmFtZSA9IFwid2luZG93U3VydmV5SlNcIjtcbiAgc3VydmV5VmFsdWU6IFN1cnZleU1vZGVsO1xuICB3aW5kb3dFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcblxuICB0ZW1wbGF0ZVZhbHVlOiBzdHJpbmc7XG4gIGV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBzaG93aW5nQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnksIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoaW5pdGlhbE1vZGVsKSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gaW5pdGlhbE1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5jcmVhdGVTdXJ2ZXkoanNvbk9iaik7XG4gICAgfVxuICAgIHRoaXMuc3VydmV5VmFsdWUuc2hvd1RpdGxlID0gZmFsc2U7XG4gICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBkb2N1bWVudCkge1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnN1cnZleS5vbkNvbXBsZXRlLmFkZChmdW5jdGlvbihzdXJ2ZXksIG9wdGlvbnMpIHtcbiAgICAgIHNlbGYub25TdXJ2ZXlDb21wbGV0ZSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2luZG93XCI7XG4gIH1cbiAgLyoqXG4gICAqIEEgc3VydmV5IG9iamVjdC5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyB2YWx1ZSB0byBuZWdhdGl2ZSB2YWx1ZSwgZm9yIGV4YW1wbGUgLTEsIHRvIGF2b2lkIGNsb3NpbmcgdGhlIHdpbmRvdyBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuIExlYXZlIGl0IGVxdWFscyB0byAwIChkZWZhdWx0IHZhbHVlKSB0byBjbG9zZSB0aGUgd2luZG93IGltbWVkaWF0ZWx5LCBvciBzZXQgaXQgdG8gMywgNSwgMTAsIC4uLiB0byBjbG9zZSB0aGUgd2luZG93IGluIDMsIDUsIDEwIHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgY2xvc2VPbkNvbXBsZXRlVGltZW91dDogbnVtYmVyID0gMDtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBzaG93aW5nLiBTZXQgaXQgdG8gdHJ1ZSB0byBzaG93IHRoZSB3aW5kb3cgYW5kIGZhbHNlIHRvIGhpZGUgaXQuXG4gICAqIEBzZWUgc2hvd1xuICAgKiBAc2VlIGhpZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNTaG93aW5nKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZyA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5zaG93aW5nQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogU2hvdyB0aGUgd2luZG93XG4gICAqIEBzZWUgaGlkZVxuICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgKi9cbiAgcHVibGljIHNob3coKSB7XG4gICAgdGhpcy5pc1Nob3dpbmcgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBIaWRlIHRoZSB3aW5kb3dcbiAgICogQHNlZSBzaG93XG4gICAqIEBzZWUgaXNTaG93aW5nXG4gICAqL1xuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmlzU2hvd2luZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBleHBhbmRlZC4gU2V0IGl0IHRvIHRydWUgdG8gZXhwYW5kIHRoZSB3aW5kb3cgb3IgZmFsc2UgdG8gY29sbGFwc2UgaXQuXG4gICAqIEBzZWUgZXhwYW5kXG4gICAqIEBzZWUgY29sbGFwc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNFeHBhbmRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0V4cGFuZGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRXhwYW5kZWRcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdGhpcy5leHBhbmRlZENoYW5nZWRDYWxsYmFjaylcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHdpbmRvdyBhbmQgc3VydmV5IHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN1cnZleS50aXRsZSA9IHZhbHVlO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIHdpbmRvdyB0byBzaG93IHRoZSBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZXhwYW5kKCkge1xuICAgIHRoaXMuZXhwYW5kY29sbGFwc2UodHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSB3aW5kb3cgYW5kIHNob3cgc3VydmV5IHRpdGxlIG9ubHkuXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZShmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShqc29uT2JqOiBhbnkpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlNb2RlbChqc29uT2JqKTtcbiAgfVxuICBwcm90ZWN0ZWQgZXhwYW5kY29sbGFwc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdXJ2ZXlDb21wbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0IDwgMCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNsb3NlT25Db21wbGV0ZVRpbWVvdXQgPT0gMCkge1xuICAgICAgdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRpbWVySWQ6IGFueSA9IG51bGw7XG4gICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNsb3NlV2luZG93T25Db21wbGV0ZSgpO1xuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgICAgIH07XG4gICAgICB0aW1lcklkID0gd2luZG93LnNldEludGVydmFsKGZ1bmMsIHRoaXMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCAqIDEwMDApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCkge1xuICAgIGlmICghIXRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IHZhciBzdXJ2ZXlUaW1lckZ1bmN0aW9ucyA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24oZnVuYzogKCkgPT4gYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuYywgMTAwMCk7XG4gIH0sXG4gIGNsZWFyVGltZW91dDogZnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoIVN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUpIHtcbiAgICAgIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBsaXN0ZW5lckNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHRpbWVySWQgPSAtMTtcbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHN0YXJ0KGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLmFkZChmdW5jKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHtcbiAgICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyQ291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBzdG9wKGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLnJlbW92ZShmdW5jKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXItLTtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50ZXIgPT0gMCAmJiB0aGlzLnRpbWVySWQgPiAtMSkge1xuICAgICAgc3VydmV5VGltZXJGdW5jdGlvbnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG4gICAgICB0aGlzLnRpbWVySWQgPSAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRvVGltZXIoKSB7XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHJldHVybjtcbiAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgdGhpcy50aW1lcklkID0gc3VydmV5VGltZXJGdW5jdGlvbnMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleXRpbWVyLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vY3Nzc3RhbmRhcmRcIjtcblxuZXhwb3J0IHZhciBkZWZhdWx0Qm9vdHN0cmFwQ3NzID0ge1xuICByb290OiBcInN2X21haW4gc3ZfYm9vdHN0cmFwX2Nzc1wiLFxuICBjb250YWluZXI6IFwic3ZfY29udGFpbmVyXCIsXG4gIGhlYWRlcjogXCJwYW5lbC1oZWFkaW5nIGNhcmQtaGVhZGVyXCIsXG4gIGJvZHk6IFwicGFuZWwtYm9keSBjYXJkLWJsb2NrIG10LTRcIixcbiAgYm9keUVtcHR5OiBcInBhbmVsLWJvZHkgY2FyZC1ibG9jayBtdC00IHN2X2JvZHlfZW1wdHlcIixcbiAgZm9vdGVyOiBcInBhbmVsLWZvb3RlciBjYXJkLWZvb3RlclwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwiXCIsXG4gIG5hdmlnYXRpb246IHtcbiAgICBjb21wbGV0ZTogXCJidG4gc3ZfY29tcGxldGVfYnRuXCIsXG4gICAgcHJldjogXCJidG4gc3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcImJ0biBzdl9uZXh0X2J0blwiLFxuICAgIHN0YXJ0OiBcImJ0biBzdl9zdGFydF9idG5cIlxuICB9LFxuICBwcm9ncmVzczogXCJwcm9ncmVzcyBjZW50ZXItYmxvY2sgbXgtYXV0byBtYi00XCIsXG4gIHByb2dyZXNzQmFyOiBcInByb2dyZXNzLWJhclwiLFxuICBwcm9ncmVzc1RleHRVbmRlckJhcjogXCJzdi1oaWRkZW5cIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfSxcbiAgcGFnZVRpdGxlOiBcIlwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG5cIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3cgc3ZfcXN0blwiLFxuICAgIGhlYWRlcjogXCJcIixcbiAgICBoZWFkZXJMZWZ0OiBcInRpdGxlLWxlZnRcIixcbiAgICBjb250ZW50OiBcIlwiLFxuICAgIGNvbnRlbnRMZWZ0OiBcImNvbnRlbnQtbGVmdFwiLFxuICAgIHRpdGxlTGVmdFJvb3Q6IFwic3ZfcXN0bl9sZWZ0XCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgICBkZXNjcmlwdGlvblVuZGVySW5wdXQ6IFwic21hbGxcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3ZfcV9yZXF1aXJlZF90ZXh0XCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9ybUdyb3VwOiBcImZvcm0tZ3JvdXBcIlxuICB9LFxuICBwYW5lbDoge1xuICAgIHRpdGxlOiBcInN2X3BfdGl0bGVcIixcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3ZfcF90aXRsZV9leHBhbmRhYmxlXCIsXG4gICAgaWNvbjogXCJzdl9wYW5lbF9pY29uXCIsXG4gICAgaWNvbkV4cGFuZGVkOiBcInN2X2V4cGFuZGVkXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGwgc3ZfcF9kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiXG4gIH0sXG4gIGVycm9yOiB7XG4gICAgcm9vdDogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBpY29uOiBcImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiLFxuICAgIGl0ZW06IFwiXCIsXG4gICAgbG9jYXRpb25Ub3A6IFwic3ZfcXN0bl9lcnJvcl90b3BcIixcbiAgICBsb2NhdGlvbkJvdHRvbTogXCJzdl9xc3RuX2Vycm9yX2JvdHRvbVwiXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcInN2X3FibG4gZm9ybS1pbmxpbmUgY2hlY2tib3hcIixcbiAgICBpdGVtOiBcInN2LWJvb2xlYW5cIixcbiAgICBjb250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtYm9vbGVhbi0tY2hlY2tlZCBjaGVja2VkXCIsXG4gICAgaXRlbUluZGV0ZXJtaW5hdGU6IFwic3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZVwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxuICAgIHN3aXRjaDogXCJzdi1ib29sZWFuX19zd2l0Y2hcIixcbiAgICBzbGlkZXI6IFwic3YtYm9vbGVhbl9fc2xpZGVyXCIsXG4gICAgbGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwgXCIsXG4gICAgZGlzYWJsZWRMYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIlxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4IGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfY2hlY2tib3hfaW5saW5lXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBsYWJlbENoZWNrZWQ6IFwiXCIsXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNoZWNrYm94LW1hdGVyaWFsXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9jaGVja2JveF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCJcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIlxuICB9LFxuICBodG1sOiB7IHJvb3Q6IFwiXCIgfSxcbiAgbWF0cml4OiB7XG4gICAgcm9vdDogXCJ0YWJsZSBzdl9xX21hdHJpeFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGNlbGxUZXh0OiBcInN2X3FfbV9jZWxsX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2X3FfbV9jZWxsX3NlbGVjdGVkIGJnLXByaW1hcnlcIixcbiAgICBjZWxsTGFiZWw6IFwic3ZfcV9tX2NlbGxfbGFiZWxcIlxuICB9LFxuICBtYXRyaXhkcm9wZG93bjogeyByb290OiBcInRhYmxlXCIgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBidXR0b246IFwiYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCJcbiAgfSxcbiAgcGFuZWxkeW5hbWljOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBuYXZpZ2F0aW9uOiBcInN2LXBhbmVsZHluYW1pY19fbmF2aWdhdGlvblwiLFxuICAgIHByb2dyZXNzVG9wOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tdG9wXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206XG4gICAgICBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tYm90dG9tXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcXVlc3Rpb25fX3RpdGxlXCIsXG4gICAgYnV0dG9uOiBcImJ1dHRvblwiLFxuICAgIGJ1dHRvbkFkZDogXCJidXR0b24gc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcImJ1dHRvbiBzdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIlxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVRpdGxlOiBcIlwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwicmFkaW9cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX3JhZGlvZ3JvdXBfaW5saW5lXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNpcmNsZVwiLFxuICAgIG90aGVyOiBcInN2X3FfcmFkaW9ncm91cF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXIgYnV0dG9uXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwiYnRuLWdyb3VwXCIsXG4gICAgaXRlbTogXCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeVwiLFxuICAgIHNlbGVjdGVkOiBcImFjdGl2ZVwiLFxuICAgIG1pblRleHQ6IFwic3ZfcV9yYXRpbmdfbWluX3RleHRcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX3JhdGluZ19pdGVtX3RleHRcIixcbiAgICBtYXhUZXh0OiBcInN2X3FfcmF0aW5nX21heF90ZXh0XCIsXG4gICAgZGlzYWJsZWQ6IFwiXCJcbiAgfSxcbiAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZXhwcmVzc2lvbjogXCJmb3JtLWNvbnRyb2xcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwic3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2X3FfZmlsZV9pbnB1dFwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiLFxuICAgIHJlbW92ZUZpbGVTdmc6IFwic3YtaGlkZGVuXCIsXG4gICAgZmlsZURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlU2lnbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgICByZW1vdmVCdXR0b25Cb3R0b206IFwic3YtaGlkZGVuXCJcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJhbGVydCBhbGVydC1pbmZvXCIsXG4gICAgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgc3VjY2VzczogXCJhbGVydCBhbGVydC1zdWNjZXNzXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwibW9kYWwtY29udGVudFwiLFxuICAgIGJvZHk6IFwibW9kYWwtYm9keVwiLFxuICAgIGhlYWRlcjoge1xuICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgcGFuZWwtdGl0bGVcIixcbiAgICAgIHRpdGxlOiBcInB1bGwtbGVmdFwiLFxuICAgICAgYnV0dG9uOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0XCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi11cFwiLFxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLWRvd25cIlxuICAgIH1cbiAgfVxufTtcbig8YW55PnN1cnZleUNzcylbXCJib290c3RyYXBcIl0gPSBkZWZhdWx0Qm9vdHN0cmFwQ3NzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vY3Nzc3RhbmRhcmRcIjtcblxuZXhwb3J0IHZhciBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3MgPSB7XG4gIHJvb3Q6IFwic3ZfbWFpbiBzdl9ib290c3RyYXBtYXRlcmlhbF9jc3NcIixcbiAgY29udGFpbmVyOiBcInN2X2NvbnRhaW5lclwiLFxuICBoZWFkZXI6IFwicGFuZWwtaGVhZGluZ1wiLFxuICBib2R5OiBcInBhbmVsLWJvZHlcIixcbiAgYm9keUVtcHR5OiBcInBhbmVsLWJvZHkgc3ZfYm9keV9lbXB0eVwiLFxuICBmb290ZXI6IFwicGFuZWwtZm9vdGVyXCIsXG4gIHRpdGxlOiBcIlwiLFxuICBkZXNjcmlwdGlvbjogXCJcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcImJ0biBzdl9jb21wbGV0ZV9idG4gYnRuLXByaW1hcnlcIixcbiAgICBwcmV2OiBcImJ0biBzdl9wcmV2X2J0biBidG4tcHJpbWFyeVwiLFxuICAgIG5leHQ6IFwiYnRuIHN2X25leHRfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgc3RhcnQ6IFwiYnRuIHN2X3N0YXJ0X2J0biBidG4tcHJpbWFyeVwiXG4gIH0sXG4gIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9jayBteC1hdXRvIG1iLTRcIixcbiAgcHJvZ3Jlc3NCYXI6IFwicHJvZ3Jlc3MtYmFyXCIsXG4gIHByb2dyZXNzVGV4dFVuZGVyQmFyOiBcInN2LWhpZGRlblwiLFxuICBwYWdlOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJcIlxuICB9LFxuICBwYWdlVGl0bGU6IFwiXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICByb3c6IFwic3Zfcm93XCIsXG4gIHF1ZXN0aW9uOiB7XG4gICAgbWFpblJvb3Q6IFwic3ZfcXN0biBmb3JtLWdyb3VwXCIsXG4gICAgZmxvd1Jvb3Q6IFwic3ZfcV9mbG93IGZvcm0tZ3JvdXBcIixcbiAgICBoZWFkZXI6IFwiXCIsXG4gICAgaGVhZGVyTGVmdDogXCJ0aXRsZS1sZWZ0XCIsXG4gICAgY29udGVudDogXCJcIixcbiAgICBjb250ZW50TGVmdDogXCJjb250ZW50LWxlZnRcIixcbiAgICB0aXRsZUxlZnRSb290OiBcInN2X3FzdG5fbGVmdFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdl9xX3JlcXVpcmVkX3RleHRcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBudW1iZXI6IFwic3ZfcV9udW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICAgIGRlc2NyaXB0aW9uVW5kZXJJbnB1dDogXCJzbWFsbFwiLFxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBoYXNFcnJvcjogXCJoYXMtZXJyb3JcIixcbiAgICBpbmRlbnQ6IDIwLFxuICAgIGZvcm1Hcm91cDogXCJmb3JtLWdyb3VwXCJcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiLFxuICAgIGljb246IFwic3ZfcGFuZWxfaWNvblwiLFxuICAgIGljb25FeHBhbmRlZDogXCJzdl9leHBhbmRlZFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsIHN2X3BfZGVzY3JpcHRpb25cIixcbiAgICBjb250YWluZXI6IFwic3ZfcF9jb250YWluZXJcIlxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2X3FzdG5fZXJyb3JfdG9wXCIsXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIlxuICB9LFxuXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcInN2X3FibG4gZm9ybS1pbmxpbmUgY2hlY2tib3hcIixcbiAgICBpdGVtOiBcInN2LWJvb2xlYW5cIixcbiAgICBjb250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtYm9vbGVhbi0tY2hlY2tlZCBjaGVja2VkXCIsXG4gICAgaXRlbUluZGV0ZXJtaW5hdGU6IFwic3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZVwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxuICAgIHN3aXRjaDogXCJzdi1ib29sZWFuX19zd2l0Y2hcIixcbiAgICBzbGlkZXI6IFwic3YtYm9vbGVhbl9fc2xpZGVyXCIsXG4gICAgbGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwgXCIsXG4gICAgZGlzYWJsZWRMYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIlxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNieCBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwiY2hlY2tib3hcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxuICAgIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiXG4gIH0sXG4gIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gIGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBjb250cm9sOiBcImZvcm0tY29udHJvbFwiLFxuICAgIG90aGVyOiBcInN2X3FfZGRfb3RoZXIgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGUgc3ZfcV9tYXRyaXhcIixcbiAgICByb3c6IFwiZm9ybS1ncm91cFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbCByYWRpby1pbmxpbmVcIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZCBiZy1wcmltYXJ5XCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gICAgaXRlbVZhbHVlOiBcImZvcm0tY29udHJvbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiwgaXRlbVZhbHVlOiBcImZvcm0tZ3JvdXBcIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcbiAgICBpdGVtVmFsdWU6IFwiZm9ybS1ncm91cFwiLFxuICAgIGJ1dHRvbkFkZDogXCJcIixcbiAgICBidXR0b25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkFkZDogXCJcIixcbiAgICBpY29uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgbmF2aWdhdGlvbjogXCJzdi1wYW5lbGR5bmFtaWNfX25hdmlnYXRpb25cIixcbiAgICBwcm9ncmVzc1RvcDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLXRvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOlxuICAgICAgXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLWJvdHRvbVwiLFxuICAgIHRpdGxlOiBcInN2LXRpdGxlIHN2LXF1ZXN0aW9uX190aXRsZVwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25BZGQ6IFwiYnV0dG9uIHN2LXBhbmVsZHluYW1pY19fYWRkLWJ0blwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJidXR0b24gc3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuXCIsXG4gICAgYnV0dG9uUHJldjogXCJzdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCIsXG4gICAgYnV0dG9uTmV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCIsXG4gICAgcHJvZ3Jlc3NDb250YWluZXI6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXJcIixcbiAgICBwcm9ncmVzczogXCJzdi1wcm9ncmVzc1wiLFxuICAgIHByb2dyZXNzQmFyOiBcInN2LXByb2dyZXNzX19iYXJcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCJcbiAgfSxcbiAgbXVsdGlwbGV0ZXh0OiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGl0ZW1UaXRsZTogXCJcIixcbiAgICByb3c6IFwiZm9ybS1ncm91cFwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgaXRlbTogXCJyYWRpb1wiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvbiBidG4gYnRuLXByaW1hcnlcIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCJcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxuICAgIGl0ZW06IFwic3ZfcV9pbWdzZWxcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2ltYWdlcGlja2VyX2lubGluZVwiLFxuICAgIGxhYmVsOiBcInN2X3FfaW1nc2VsX2xhYmVsXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9pbWdzZWxfY29udHJvbF9pdGVtXCIsXG4gICAgaW1hZ2U6IFwic3ZfcV9pbWdzZWxfaW1hZ2VcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX2ltZ3NlbF90ZXh0XCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCJcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcm9vdDogXCJidG4tZ3JvdXBcIixcbiAgICBpdGVtOiBcImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5XCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIixcbiAgICBkaXNhYmxlZDogXCJcIlxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJmb3JtLWdyb3VwIGlzLWZpbGVpbnB1dCBzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcIlwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIixcbiAgICBmaWxlSW5wdXQ6IFwic3ZfcV9maWxlX2lucHV0XCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIlxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIixcbiAgICBlcnJvcjogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBzdWNjZXNzOiBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCJcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJtb2RhbC1jb250ZW50XCIsXG4gICAgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcIm1vZGFsLWhlYWRlciBwYW5lbC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiXG4gICAgfVxuICB9XG59O1xuKDxhbnk+c3VydmV5Q3NzKVtcImJvb3RzdHJhcG1hdGVyaWFsXCJdID0gZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwbWF0ZXJpYWwudHMiLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuZXhwb3J0IHZhciBtb2Rlcm5Dc3MgPSB7XG4gIHJvb3Q6IFwic3Ytcm9vdC1tb2Rlcm5cIixcbiAgY29udGFpbmVyOiBcInN2LWNvbnRhaW5lci1tb2Rlcm5cIixcbiAgaGVhZGVyOiBcInN2LXRpdGxlIHN2LWNvbnRhaW5lci1tb2Rlcm5fX3RpdGxlXCIsXG4gIGJvZHk6IFwic3YtYm9keVwiLFxuICBib2R5RW1wdHk6IFwic3YtYm9keSBzdi1ib2R5LS1lbXB0eVwiLFxuICBmb290ZXI6IFwic3YtZm9vdGVyIHN2LWJvZHlfX2Zvb3RlciBzdi1jbGVhcmZpeFwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwic3YtY29tcGxldGVkcGFnZVwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwic3YtYnRuIHN2LWZvb3Rlcl9fY29tcGxldGUtYnRuXCIsXG4gICAgcHJldjogXCJzdi1idG4gc3YtZm9vdGVyX19wcmV2LWJ0blwiLFxuICAgIG5leHQ6IFwic3YtYnRuIHN2LWZvb3Rlcl9fbmV4dC1idG5cIixcbiAgICBzdGFydDogXCJzdi1idG4gc3YtZm9vdGVyX19zdGFydC1idG5cIlxuICB9LFxuICBwYW5lbDoge1xuICAgIHRpdGxlOiBcInN2LXRpdGxlIHN2LXBhbmVsX190aXRsZVwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdi1wYW5lbF9fdGl0bGUtLWV4cGFuZGFibGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1wYW5lbF9fZGVzY3JpcHRpb25cIixcbiAgICBjb250YWluZXI6IFwic3YtcGFuZWwgc3Ytcm93X19wYW5lbFwiLFxuICAgIGNvbnRlbnQ6IFwic3YtcGFuZWxfX2NvbnRlbnRcIixcbiAgICBpY29uOiBcInN2LXBhbmVsX19pY29uXCIsXG4gICAgaWNvbkV4cGFuZGVkOiBcInN2LXBhbmVsX19pY29uLS1leHBhbmRlZFwiXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwic3YtcGFuZWxkeW5hbWljXCIsXG4gICAgbmF2aWdhdGlvbjogXCJzdi1wYW5lbGR5bmFtaWNfX25hdmlnYXRpb25cIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1xdWVzdGlvbl9fdGl0bGVcIixcbiAgICBidXR0b246IFwic3YtYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcInN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0blwiLFxuICAgIGJ1dHRvbkFkZDogXCJzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBwcm9ncmVzc1RvcDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLXRvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOlxuICAgICAgXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLWJvdHRvbVwiLFxuICAgIGJ1dHRvblByZXY6IFwic3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0blwiLFxuICAgIGJ1dHRvbk5leHQ6IFwic3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiLFxuICAgIHByb2dyZXNzQ29udGFpbmVyOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtY29udGFpbmVyXCIsXG4gICAgcHJvZ3Jlc3M6IFwic3YtcHJvZ3Jlc3NcIixcbiAgICBwcm9ncmVzc0JhcjogXCJzdi1wcm9ncmVzc19fYmFyXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiLFxuICAgIHNlcGFyYXRvcjogXCJzdi1wYW5lbGR5bmFtaWNfX3NlcGFyYXRvclwiXG4gIH0sXG4gIHByb2dyZXNzOiBcInN2LXByb2dyZXNzIHN2LWJvZHlfX3Byb2dyZXNzXCIsXG4gIHByb2dyZXNzQmFyOiBcInN2LXByb2dyZXNzX19iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcInN2LXByb2dyZXNzX190ZXh0XCIsXG4gIHByb2dyZXNzVGV4dEluQmFyOiBcInN2LWhpZGRlblwiLFxuICBwYWdlOiB7XG4gICAgcm9vdDogXCJzdi1wYWdlIHN2LWJvZHlfX3BhZ2VcIixcbiAgICB0aXRsZTogXCJzdi1wYWdlX190aXRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2LWRlc2NyaXB0aW9uIHN2LXBhZ2VfX2Rlc2NyaXB0aW9uXCJcbiAgfSxcbiAgcGFnZVRpdGxlOiBcInN2LXRpdGxlIHN2LXBhZ2VfX3RpdGxlXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1wYWdlX19kZXNjcmlwdGlvblwiLFxuICByb3c6IFwic3Ytcm93IHN2LWNsZWFyZml4XCIsXG4gIHF1ZXN0aW9uOiB7XG4gICAgbWFpblJvb3Q6IFwic3YtcXVlc3Rpb24gc3Ytcm93X19xdWVzdGlvblwiLFxuICAgIGZsb3dSb290OiBcInN2LXF1ZXN0aW9uIHN2LXJvd19fcXVlc3Rpb24gc3Ytcm93X19xdWVzdGlvbi0tZmxvd1wiLFxuICAgIGFzQ2VsbDogXCJzdi10YWJsZV9fY2VsbFwiLFxuICAgIGhlYWRlcjogXCJzdi1xdWVzdGlvbl9faGVhZGVyXCIsXG4gICAgaGVhZGVyTGVmdDogXCJzdi1xdWVzdGlvbl9faGVhZGVyLS1sb2NhdGlvbi0tbGVmdFwiLFxuICAgIGhlYWRlclRvcDogXCJzdi1xdWVzdGlvbl9faGVhZGVyLS1sb2NhdGlvbi0tdG9wXCIsXG4gICAgaGVhZGVyQm90dG9tOiBcInN2LXF1ZXN0aW9uX19oZWFkZXItLWxvY2F0aW9uLS1ib3R0b21cIixcbiAgICBjb250ZW50OiBcInN2LXF1ZXN0aW9uX19jb250ZW50XCIsXG4gICAgY29udGVudExlZnQ6IFwic3YtcXVlc3Rpb25fX2NvbnRlbnQtLWxlZnRcIixcbiAgICB0aXRsZUxlZnRSb290OiBcIlwiLFxuICAgIHRpdGxlT25BbnN3ZXI6IFwic3YtcXVlc3Rpb25fX3RpdGxlLS1hbnN3ZXJcIixcbiAgICB0aXRsZU9uRXJyb3I6IFwic3YtcXVlc3Rpb25fX3RpdGxlLS1lcnJvclwiLFxuICAgIHRpdGxlOiBcInN2LXRpdGxlIHN2LXF1ZXN0aW9uX190aXRsZVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdi1xdWVzdGlvbl9fcmVxdWlyZWQtdGV4dFwiLFxuICAgIG51bWJlcjogXCJzdi1xdWVzdGlvbl9fbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic3YtZGVzY3JpcHRpb24gc3YtcXVlc3Rpb25fX2Rlc2NyaXB0aW9uXCIsXG4gICAgZGVzY3JpcHRpb25VbmRlcklucHV0OiBcInN2LWRlc2NyaXB0aW9uIHN2LXF1ZXN0aW9uX19kZXNjcmlwdGlvblwiLFxuICAgIGNvbW1lbnQ6IFwic3YtY29tbWVudFwiLFxuICAgIHJlcXVpcmVkOiBcInN2LXF1ZXN0aW9uLS1yZXF1aXJlZFwiLFxuICAgIHRpdGxlUmVxdWlyZWQ6IFwic3YtcXVlc3Rpb25fX3RpdGxlLS1yZXF1aXJlZFwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9vdGVyOiBcInN2LXF1ZXN0aW9uX19mb290ZXJcIixcbiAgICBmb3JtR3JvdXA6IFwic3YtcXVlc3Rpb25fX2Zvcm0tZ3JvdXBcIixcbiAgICBoYXNFcnJvcjogXCJcIlxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwic3YtcXVlc3Rpb25fX2VyYm94XCIsXG4gICAgaWNvbjogXCJcIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2LXF1ZXN0aW9uX19lcmJveC0tbG9jYXRpb24tLXRvcFwiLFxuICAgIGxvY2F0aW9uQm90dG9tOiBcInN2LXF1ZXN0aW9uX19lcmJveC0tbG9jYXRpb24tLWJvdHRvbVwiXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdi1zZWxlY3RiYXNlXCIsXG4gICAgaXRlbTogXCJzdi1pdGVtIHN2LWNoZWNrYm94IHN2LXNlbGVjdGJhc2VfX2l0ZW1cIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtaXRlbS0tZGlzYWJsZWQgc3YtY2hlY2tib3gtLWRpc2FibGVkXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtY2hlY2tib3gtLWNoZWNrZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtY2hlY2tib3gtLWFsbG93aG92ZXJcIixcbiAgICBpdGVtSW5saW5lOiBcInN2LXNlbGVjdGJhc2VfX2l0ZW0tLWlubGluZVwiLFxuICAgIGxhYmVsOiBcInN2LXNlbGVjdGJhc2VfX2xhYmVsXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuIHN2LWl0ZW1fX2NvbnRyb2xcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyBzdi1jaGVja2JveF9fc3ZnXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2LWl0ZW1fX2NvbnRyb2wtbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3YtY2hlY2tib3hfX2RlY29yYXRvclwiLFxuICAgIG90aGVyOiBcInN2LWNvbW1lbnQgc3YtcXVlc3Rpb25fX290aGVyXCIsXG4gICAgY29sdW1uOiBcInN2LXNlbGVjdGJhc2VfX2NvbHVtblwiXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcInN2LXNlbGVjdGJhc2VcIixcbiAgICBpdGVtOiBcInN2LWl0ZW0gc3YtcmFkaW8gc3Ytc2VsZWN0YmFzZV9faXRlbVwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3Ytc2VsZWN0YmFzZV9faXRlbS0taW5saW5lXCIsXG4gICAgbGFiZWw6IFwic3Ytc2VsZWN0YmFzZV9fbGFiZWxcIixcbiAgICBsYWJlbENoZWNrZWQ6IFwiXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWl0ZW0tLWRpc2FibGVkIHN2LXJhZGlvLS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LXJhZGlvLS1jaGVja2VkXCIsXG4gICAgaXRlbUhvdmVyOiBcInN2LXJhZGlvLS1hbGxvd2hvdmVyXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW4gc3YtaXRlbV9fY29udHJvbFwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaXRlbV9fc3ZnIHN2LXJhZGlvX19zdmdcIixcbiAgICBjb250cm9sTGFiZWw6IFwic3YtaXRlbV9fY29udHJvbC1sYWJlbFwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcInN2LWl0ZW1fX2RlY29yYXRvciBzdi1yYWRpb19fZGVjb3JhdG9yXCIsXG4gICAgb3RoZXI6IFwic3YtY29tbWVudCBzdi1xdWVzdGlvbl9fb3RoZXJcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdi1idG4gc3Ytc2VsZWN0YmFzZV9fY2xlYXItYnRuXCIsXG4gICAgY29sdW1uOiBcInN2LXNlbGVjdGJhc2VfX2NvbHVtblwiXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcIlwiLFxuICAgIGl0ZW06IFwic3YtYm9vbGVhbiBzdi1pdGVtXCIsXG4gICAgY29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWJvb2xlYW4tLWNoZWNrZWRcIixcbiAgICBpdGVtSW5kZXRlcm1pbmF0ZTogXCJzdi1ib29sZWFuLS1pbmRldGVybWluYXRlXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWl0ZW0tLWRpc2FibGVkIHN2LWJvb2xlYW4tLWRpc2FibGVkXCIsXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxuICAgIHNsaWRlcjogXCJzdi1ib29sZWFuX19zbGlkZXJcIixcbiAgICBsYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbCBcIixcbiAgICBkaXNhYmxlZExhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiXG4gIH0sXG4gIHRleHQ6IHtcbiAgICByb290OiBcInN2LXRleHRcIixcbiAgICBzbWFsbDogXCJzdi1yb3dfX3F1ZXN0aW9uLS1zbWFsbFwiLFxuICAgIG9uRXJyb3I6IFwic3YtdGV4dC0tZXJyb3JcIlxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInN2LW11bHRpcGxldGV4dFwiLFxuICAgIGl0ZW06IFwic3YtbXVsdGlwbGV0ZXh0X19pdGVtXCIsXG4gICAgaXRlbVRpdGxlOiBcInN2LW11bHRpcGxldGV4dF9faXRlbS10aXRsZVwiLFxuICAgIHJvdzogXCJzdi1tdWx0aXBsZXRleHRfX3Jvd1wiLFxuICAgIGNlbGw6IFwic3YtbXVsdGlwbGV0ZXh0X19jZWxsXCJcbiAgfSxcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNtYWxsOiBcInN2LXJvd19fcXVlc3Rpb24tLXNtYWxsXCIsXG4gICAgY29udHJvbDogXCJzdi1kcm9wZG93blwiLFxuICAgIHNlbGVjdFdyYXBwZXI6IFwiXCIsXG4gICAgb3RoZXI6IFwic3YtY29tbWVudCBzdi1xdWVzdGlvbl9fb3RoZXJcIixcbiAgICBvbkVycm9yOiBcInN2LWRyb3Bkb3duLS1lcnJvclwiXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdi1pbWFnZXBpY2tlclwiLFxuICAgIGl0ZW06IFwic3YtaW1hZ2VwaWNrZXJfX2l0ZW1cIixcbiAgICBpdGVtSW5saW5lOiBcInN2LWltYWdlcGlja2VyX19pdGVtLS1pbmxpbmVcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1pbWFnZXBpY2tlcl9faXRlbS0tY2hlY2tlZFwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pbWFnZXBpY2tlcl9faXRlbS0tZGlzYWJsZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWFsbG93aG92ZXJcIixcbiAgICBsYWJlbDogXCJzdi1pbWFnZXBpY2tlcl9fbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi1pbWFnZXBpY2tlcl9fY29udHJvbFwiLFxuICAgIGltYWdlOiBcInN2LWltYWdlcGlja2VyX19pbWFnZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2LWltYWdlcGlja2VyX190ZXh0XCIsXG4gICAgY2xlYXJCdXR0b246IFwic3YtYnRuXCIsXG4gICAgb3RoZXI6IFwic3YtY29tbWVudCBzdi1xdWVzdGlvbl9fb3RoZXJcIlxuICB9LFxuICBtYXRyaXg6IHtcbiAgICB0YWJsZVdyYXBwZXI6IFwic3YtbWF0cml4XCIsXG4gICAgcm9vdDogXCJzdi10YWJsZVwiLFxuICAgIGNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtbWF0cml4X19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCIsXG4gICAgbGFiZWw6IFwic3YtaXRlbSBzdi1yYWRpbyBzdi1tYXRyaXhfX2xhYmVsXCIsXG4gICAgaXRlbVZhbHVlOiBcInN2LXZpc3VhbGx5aGlkZGVuIHN2LWl0ZW1fX2NvbnRyb2wgc3YtcmFkaW9fX2NvbnRyb2xcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1yYWRpby0tY2hlY2tlZFwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pdGVtLS1kaXNhYmxlZCBzdi1yYWRpby0tZGlzYWJsZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtcmFkaW8tLWFsbG93aG92ZXJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3YtcmFkaW9fX2RlY29yYXRvclwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaXRlbV9fc3ZnIHN2LXJhZGlvX19zdmdcIixcbiAgICBjZWxsVGV4dDogXCJzdi1tYXRyaXhfX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2LW1hdHJpeF9fdGV4dC0t0YFoZWNrZWRcIixcbiAgICBjZWxsVGV4dERpc2FibGVkOiBcInN2LW1hdHJpeF9fdGV4dC0tZGlzYWJsZWRcIlxuICB9LFxuICBtYXRyaXhkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwic3YtdGFibGVcIixcbiAgICBjZWxsOiBcInN2LXRhYmxlX19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCJcbiAgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIHJvb3Q6IFwic3YtdGFibGUgc3YtbWF0cml4ZHluYW1pY1wiLFxuICAgIGNlbGw6IFwic3YtdGFibGVfX2NlbGxcIixcbiAgICBoZWFkZXJDZWxsOiBcInN2LXRhYmxlX19jZWxsIHN2LXRhYmxlX19jZWxsLS1oZWFkZXJcIixcbiAgICBidXR0b246IFwic3YtYnRuXCIsXG4gICAgYnV0dG9uQWRkOiBcInN2LW1hdHJpeGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBidXR0b25SZW1vdmU6IFwic3YtbWF0cml4ZHluYW1pY19fcmVtb3ZlLWJ0blwiLFxuICAgIGljb25BZGQ6IFwiXCIsXG4gICAgaWNvblJlbW92ZTogXCJcIlxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcInN2LXJhdGluZ1wiLFxuICAgIGl0ZW06IFwic3YtcmF0aW5nX19pdGVtXCIsXG4gICAgc2VsZWN0ZWQ6IFwic3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZFwiLFxuICAgIG1pblRleHQ6IFwic3YtcmF0aW5nX19taW4tdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2LXJhdGluZ19faXRlbS10ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdi1yYXRpbmdfX21heC10ZXh0XCIsXG4gICAgZGlzYWJsZWQ6IFwic3YtcmF0aW5nLS1kaXNhYmxlZFwiXG4gIH0sXG4gIGNvbW1lbnQ6IHtcbiAgICByb290OiBcInN2LWNvbW1lbnRcIixcbiAgICBzbWFsbDogXCJzdi1yb3dfX3F1ZXN0aW9uLS1zbWFsbFwiXG4gIH0sXG4gIGV4cHJlc3Npb246IFwiXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2LWZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgcHJldmlldzogXCJzdi1maWxlX19wcmV2aWV3XCIsXG4gICAgZmlsZVNpZ246IFwic3YtaGlkZGVuXCIsXG4gICAgZmlsZVNpZ25Cb3R0b206IFwic3YtZmlsZV9fc2lnblwiLFxuICAgIGZpbGVEZWNvcmF0b3I6IFwic3YtZmlsZV9fZGVjb3JhdG9yXCIsXG4gICAgZmlsZUlucHV0OiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgbm9GaWxlQ2hvc2VuOiBcInN2LWRlc2NyaXB0aW9uIHN2LWZpbGVfX25vLWZpbGUtY2hvc2VuXCIsXG4gICAgY2hvb3NlRmlsZTogXCJzdi1idG4gc3YtZmlsZV9fY2hvb3NlLWJ0blwiLFxuICAgIGRpc2FibGVkOiBcInN2LWZpbGVfX2Nob29zZS1idG4tLWRpc2FibGVkXCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1idG4gc3YtZmlsZV9fY2xlYW4tYnRuXCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdi1oaWRkZW5cIixcbiAgICByZW1vdmVGaWxlU3ZnOiBcInN2LWZpbGVfX3JlbW92ZS1zdmdcIixcbiAgICB3cmFwcGVyOiBcInN2LWZpbGVfX3dyYXBwZXJcIlxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcIlwiLFxuICAgIGVycm9yOiBcIlwiLFxuICAgIHN1Y2Nlc3M6IFwiXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgYm9keTogXCJcIixcbiAgICBoZWFkZXI6IHtcbiAgICAgIHJvb3Q6IFwiXCIsXG4gICAgICB0aXRsZTogXCJcIixcbiAgICAgIGJ1dHRvbjogXCJcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcIlwiLFxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcIlwiXG4gICAgfVxuICB9XG59O1xuXG5zdXJ2ZXlDc3NbXCJtb2Rlcm5cIl0gPSBtb2Rlcm5Dc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Ntb2Rlcm4udHMiLCJpbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYXJhYmljXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vY2F0YWxhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2N6ZWNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZGFuaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZHV0Y2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9maW5uaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZnJlbmNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZ2VvcmdpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9nZXJtYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9ncmVla1wiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2hlYnJld1wiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2h1bmdhcmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2ljZWxhbmRpY1wiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2luZG9uZXNpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9pdGFsaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vamFwYW5lc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9rb3JlYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9sYXR2aWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbGl0aHVhbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL25vcndlZ2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BlcnNpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9wb2xpc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9wb3J0dWd1ZXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcm9tYW5pYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9ydXNzaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc3BhbmlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3N3ZWRpc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi90dXJraXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3VrcmFpbmlhblwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvY2h1bmtzL2xvY2FsaXphdGlvbi50cyIsIi8vIHN0eWxlc1xuaW1wb3J0IFwiLi4vLi4vbWFpbi5zY3NzXCI7XG5pbXBvcnQgXCIuLi8uLi9tb2Rlcm4uc2Nzc1wiO1xuXG5leHBvcnQgbGV0IFZlcnNpb246IHN0cmluZztcblZlcnNpb24gPSBgJHtwcm9jZXNzLmVudi5WRVJTSU9OfWA7XG5cbmV4cG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzXCI7XG5leHBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnNcIjtcbmV4cG9ydCB7XG4gIEFuc3dlckNvdW50VmFsaWRhdG9yLFxuICBFbWFpbFZhbGlkYXRvcixcbiAgTnVtZXJpY1ZhbGlkYXRvcixcbiAgUmVnZXhWYWxpZGF0b3IsXG4gIFN1cnZleVZhbGlkYXRvcixcbiAgVGV4dFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yUmVzdWx0LFxuICBFeHByZXNzaW9uVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JSdW5uZXJcbn0gZnJvbSBcIi4uLy4uL3ZhbGlkYXRvclwiO1xuZXhwb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uLy4uL2l0ZW12YWx1ZVwiO1xuZXhwb3J0IHsgQmFzZSwgRXZlbnQsIFN1cnZleUVycm9yLCBJU3VydmV5LCBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmV4cG9ydCB7IENhbGN1bGF0ZWRWYWx1ZSB9IGZyb20gXCIuLi8uLi9jYWxjdWxhdGVkVmFsdWVcIjtcbmV4cG9ydCB7XG4gIEN1c3RvbUVycm9yLFxuICBBbnN3ZXJSZXF1aXJlZEVycm9yLFxuICBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yLFxuICBSZXF1cmVOdW1lcmljRXJyb3IsXG4gIEV4Y2VlZFNpemVFcnJvclxufSBmcm9tIFwiLi4vLi4vZXJyb3JcIjtcbmV4cG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuLi8uLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuZXhwb3J0IHsgSHRtbENvbmRpdGlvbkl0ZW0sIFVybENvbmRpdGlvbkl0ZW0gfSBmcm9tIFwiLi4vLi4vZXhwcmVzc2lvbkl0ZW1zXCI7XG5leHBvcnQgeyBDaG9pY2VzUmVzdGZ1bGwgfSBmcm9tIFwiLi4vLi4vY2hvaWNlc1Jlc3RmdWxsXCI7XG5leHBvcnQgeyBGdW5jdGlvbkZhY3RvcnksIHJlZ2lzdGVyRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuZXhwb3J0IHsgQ29uZGl0aW9uUnVubmVyLCBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNcIjtcbmV4cG9ydCB7XG4gIE9wZXJhbmQsXG4gIENvbnN0LFxuICBCaW5hcnlPcGVyYW5kLFxuICBWYXJpYWJsZSxcbiAgRnVuY3Rpb25PcGVyYW5kLFxuICBBcnJheU9wZXJhbmRcbn0gZnJvbSBcIi4uLy4uL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5leHBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNQYXJzZXJcIjtcbmV4cG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmV4cG9ydCB7XG4gIEpzb25FcnJvcixcbiAgSnNvbkluY29ycmVjdFR5cGVFcnJvcixcbiAgSnNvbk1ldGFkYXRhLFxuICBKc29uTWV0YWRhdGFDbGFzcyxcbiAgSnNvbk1pc3NpbmdUeXBlRXJyb3IsXG4gIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSxcbiAgSnNvbk9iamVjdCxcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yLFxuICBKc29uVW5rbm93blByb3BlcnR5RXJyb3IsXG4gIFNlcmlhbGl6ZXJcbn0gZnJvbSBcIi4uLy4uL2pzb25vYmplY3RcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duQ2VsbCxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIG1hdHJpeERyb3Bkb3duQ29sdW1uVHlwZXMsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWwsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcbmV4cG9ydCB7XG4gIE1hdHJpeER5bmFtaWNSb3dNb2RlbCxcbiAgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeFJvd01vZGVsLFxuICBNYXJ0cml4Q2VsbHMsXG4gIFF1ZXN0aW9uTWF0cml4TW9kZWxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeFwiO1xuZXhwb3J0IHtcbiAgTXVsdGlwbGVUZXh0SXRlbU1vZGVsLFxuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tdWx0aXBsZXRleHRcIjtcbmV4cG9ydCB7IFBhbmVsTW9kZWwsIFBhbmVsTW9kZWxCYXNlLCBRdWVzdGlvblJvd01vZGVsIH0gZnJvbSBcIi4uLy4uL3BhbmVsXCI7XG5leHBvcnQgeyBGbG93UGFuZWxNb2RlbCB9IGZyb20gXCIuLi8uLi9mbG93cGFuZWxcIjtcbmV4cG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuLi8uLi9wYWdlXCI7XG5leHBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi8uLi9xdWVzdGlvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbm5vbnZhbHVlXCI7XG5leHBvcnQgeyBRdWVzdGlvbkVtcHR5TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ2hlY2tib3hCYXNlLFxuICBRdWVzdGlvblNlbGVjdEJhc2Vcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY29tbWVudFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5leHBvcnQgeyBRdWVzdGlvbkZhY3RvcnksIEVsZW1lbnRGYWN0b3J5IH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GaWxlTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZmlsZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25IdG1sTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faHRtbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYXRpbmdNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9yYXRpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2V4cHJlc3Npb25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3RleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7IFN1cnZleVRpbWVyIH0gZnJvbSBcIi4uLy4uL3N1cnZleXRpbWVyXCI7XG5leHBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlcIjtcbmV4cG9ydCB7XG4gIFN1cnZleVRyaWdnZXIsXG4gIFN1cnZleVRyaWdnZXJDb21wbGV0ZSxcbiAgU3VydmV5VHJpZ2dlclNldFZhbHVlLFxuICBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSxcbiAgU3VydmV5VHJpZ2dlckNvcHlWYWx1ZSxcbiAgU3VydmV5VHJpZ2dlclJ1bkV4cHJlc3Npb24sXG4gIFRyaWdnZXJcbn0gZnJvbSBcIi4uLy4uL3RyaWdnZXJcIjtcbmV4cG9ydCB7IFN1cnZleVdpbmRvd01vZGVsIH0gZnJvbSBcIi4uLy4uL3N1cnZleVdpbmRvd1wiO1xuZXhwb3J0IHsgVGV4dFByZVByb2Nlc3NvciB9IGZyb20gXCIuLi8uLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5cbmV4cG9ydCB7IGR4U3VydmV5U2VydmljZSB9IGZyb20gXCIuLi8uLi9keFN1cnZleVNlcnZpY2VcIjtcbmV4cG9ydCB7IGVuZ2xpc2hTdHJpbmdzIH0gZnJvbSBcIi4uLy4uL2xvY2FsaXphdGlvbi9lbmdsaXNoXCI7XG5leHBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24sIHN1cnZleVN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vc3VydmV5U3RyaW5nc1wiO1xuLy8gZXhwb3J0IHsgY3VsdHVyZUluZm8gfSBmcm9tIFwiLi4vLi4vY3VsdHVyZUluZm9cIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0LFxuICBDdXN0b21XaWRnZXRDb2xsZWN0aW9uXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcblxuZXhwb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuLi8uLi9zdHlsZXNtYW5hZ2VyXCI7XG5cbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBRdWVzdGlvbkRhdGVNb2RlbH0gZnJvbSBcIi4uLy4uL3BsdWdpbnMvcXVlc3Rpb25fZGF0ZVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbiB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBGbG93UGFuZWxNb2RlbCB9IGZyb20gXCIuLi9mbG93cGFuZWxcIjtcbmltcG9ydCB7IFJlYWN0RWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcblxuaW1wb3J0IHsgU3VydmV5UGFuZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5Rmxvd1BhbmVsIGV4dGVuZHMgU3VydmV5UGFuZWwge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHB1YmxpYyBnZXQgZmxvd1BhbmVsKCk6IEZsb3dQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbCBhcyBGbG93UGFuZWxNb2RlbDtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGlmICghIXRoaXMuZmxvd1BhbmVsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLmZsb3dQYW5lbC5vbkN1c3RvbUh0bWxQcm9kdWNpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9O1xuICAgICAgdGhpcy5mbG93UGFuZWwub25HZXRIdG1sRm9yUXVlc3Rpb24gPSBzZWxmLnJlbmRlclF1ZXN0aW9uO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIGlmICghIXRoaXMuZmxvd1BhbmVsKSB7XG4gICAgICB0aGlzLmZsb3dQYW5lbC5vbkN1c3RvbUh0bWxQcm9kdWNpbmcgPSBudWxsO1xuICAgICAgdGhpcy5mbG93UGFuZWwub25HZXRIdG1sRm9yUXVlc3Rpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb24obmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmZsb3dQYW5lbC5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCI8cXVlc3Rpb24+XCIgKyBxdWVzdGlvbi5uYW1lICsgXCI8L3F1ZXN0aW9uPlwiO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJSb3dzKCk6IEFycmF5PEpTWC5FbGVtZW50PiB7XG4gICAgcmV0dXJuIFt0aGlzLnJlbmRlckh0bWwoKV07XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJlZEluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgZ2V0Tm9kZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWRJbmRleCsrO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJIdG1sKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZmxvd1BhbmVsKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgaHRtbCA9IFwiPHNwYW4+XCIgKyB0aGlzLmZsb3dQYW5lbC5wcm9kdWNlSHRtbCgpICsgXCI8L3NwYW4+XCI7XG4gICAgaWYgKCFET01QYXJzZXIpIHtcbiAgICAgIHZhciBodG1sVmFsdWUgPSB7IF9faHRtbDogaHRtbCB9O1xuICAgICAgcmV0dXJuIDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWxWYWx1ZX0gLz47XG4gICAgfVxuICAgIGxldCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsIFwidGV4dC94bWxcIik7XG4gICAgdGhpcy5yZW5kZXJlZEluZGV4ID0gMDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJlbnROb2RlKGRvYyk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlck5vZGVzKGRvbU5vZGVzOiBBcnJheTxOb2RlPik6IEFycmF5PEpTWC5FbGVtZW50PiB7XG4gICAgdmFyIG5vZGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb21Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZXMucHVzaCh0aGlzLnJlbmRlck5vZGUoZG9tTm9kZXNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG4gIHByaXZhdGUgZ2V0U3R5bGUobm9kZVR5cGU6IHN0cmluZykge1xuICAgIHZhciBzdHlsZTogYW55ID0ge307XG4gICAgaWYgKG5vZGVUeXBlLnRvTG93ZXJDYXNlKCkgPT09IFwiYlwiKSB7XG4gICAgICBzdHlsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XG4gICAgfVxuICAgIGlmIChub2RlVHlwZS50b0xvd2VyQ2FzZSgpID09PSBcImlcIikge1xuICAgICAgc3R5bGUuZm9udFN0eWxlID0gXCJpdGFsaWNcIjtcbiAgICB9XG4gICAgaWYgKG5vZGVUeXBlLnRvTG93ZXJDYXNlKCkgPT09IFwidVwiKSB7XG4gICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9IFwidW5kZXJsaW5lXCI7XG4gICAgfVxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUGFyZW50Tm9kZShub2RlOiBOb2RlKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnJlbmRlck5vZGVzKHRoaXMuZ2V0Q2hpbGREb21Ob2Rlcyhub2RlKSk7XG4gICAgaWYgKG5vZGVUeXBlID09IFwiZGl2XCIpXG4gICAgICByZXR1cm4gPGRpdiBrZXk9e3RoaXMuZ2V0Tm9kZUluZGV4KCl9PntjaGlsZHJlbn08L2Rpdj47XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuIGtleT17dGhpcy5nZXROb2RlSW5kZXgoKX0gc3R5bGU9e3RoaXMuZ2V0U3R5bGUobm9kZVR5cGUpfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlck5vZGUobm9kZTogTm9kZSk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuaGFzVGV4dENoaWxkTm9kZXNPbmx5KG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJlbnROb2RlKG5vZGUpO1xuICAgIH1cbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVUeXBlID09PSBcInF1ZXN0aW9uXCIpIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZmxvd1BhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgcXVlc3Rpb25Cb2R5ID0gKFxuICAgICAgICA8U3VydmV5UXVlc3Rpb25cbiAgICAgICAgICBrZXk9e3F1ZXN0aW9uLm5hbWV9XG4gICAgICAgICAgZWxlbWVudD17cXVlc3Rpb259XG4gICAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICAgIGNzcz17dGhpcy5jc3N9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgICAgcmV0dXJuIDxzcGFuIGtleT17dGhpcy5nZXROb2RlSW5kZXgoKX0+e3F1ZXN0aW9uQm9keX08L3NwYW4+O1xuICAgIH1cbiAgICBpZiAobm9kZVR5cGUgPT09IFwiZGl2XCIpIHtcbiAgICAgIHJldHVybiA8ZGl2IGtleT17dGhpcy5nZXROb2RlSW5kZXgoKX0+e25vZGUudGV4dENvbnRlbnR9PC9kaXY+O1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPHNwYW4ga2V5PXt0aGlzLmdldE5vZGVJbmRleCgpfSBzdHlsZT17dGhpcy5nZXRTdHlsZShub2RlVHlwZSl9PlxuICAgICAgICB7bm9kZS50ZXh0Q29udGVudH1cbiAgICAgIDwvc3Bhbj5cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2hpbGREb21Ob2Rlcyhub2RlOiBOb2RlKTogQXJyYXk8Tm9kZT4ge1xuICAgIHZhciBkb21Ob2RlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb21Ob2Rlcy5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBkb21Ob2RlcztcbiAgfVxuICBwcml2YXRlIGhhc1RleHRDaGlsZE5vZGVzT25seShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgdmFyIG5vZGVzID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChub2Rlc1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIiN0ZXh0XCIpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoc3R5bGU6IGFueSwgcm93czogSlNYLkVsZW1lbnRbXSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImYtcGFuZWxcIiwgeyBzdHlsZTogc3R5bGUgfSwgcm93cyk7XG4gIH1cbn1cblxuUmVhY3RFbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckVsZW1lbnQoXCJmbG93cGFuZWxcIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlGbG93UGFuZWwsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L2Zsb3ctcGFuZWwudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25JbWFnZVBpY2tlciBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw7XG4gIH1cbiAgaGFuZGxlT25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IHRoaXMucXVlc3Rpb24udmFsdWUuY29uY2F0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY3VyclZhbHVlID0gdGhpcy5xdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgY3VyclZhbHVlLnNwbGljZSh0aGlzLnF1ZXN0aW9uLnZhbHVlLmluZGV4T2YoZXZlbnQudGFyZ2V0LnZhbHVlKSwgMSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBjdXJyVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9KTtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldCBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgIDxsZWdlbmQgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9IC8+XG4gICAgICAgIHt0aGlzLmdldEl0ZW1zKGNzc0NsYXNzZXMpfVxuICAgICAgPC9maWVsZHNldD5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJdGVtcyhjc3NDbGFzc2VzOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpXTtcbiAgICAgIHZhciBrZXkgPSBcIml0ZW1cIiArIGk7XG4gICAgICBpdGVtcy5wdXNoKHRoaXMucmVuZGVySXRlbShrZXksIGl0ZW0sIGkgPT09IDAsIGNzc0NsYXNzZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGV4dFN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgbWFyZ2luTGVmdDogXCIzcHhcIiwgZGlzcGxheTogXCJpbmxpbmVcIiwgcG9zaXRpb246IFwic3RhdGljXCIgfTtcbiAgfVxuICBwcml2YXRlIHJlbmRlckl0ZW0oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIGlzRmlyc3Q6IGJvb2xlYW4sXG4gICAgY3NzQ2xhc3NlczogYW55XG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZChpdGVtKTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQ7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyRWxlbWVudChcbiAgICAgIGtleSxcbiAgICAgIGl0ZW0sXG4gICAgICBpc0NoZWNrZWQsXG4gICAgICBpc0Rpc2FibGVkLFxuICAgICAgaXNGaXJzdCxcbiAgICAgIGNzc0NsYXNzZXNcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0SXRlbUNsYXNzKGlzQ2hlY2tlZDogYm9vbGVhbiwgaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBjb2xDb3VudCA9IHRoaXMucXVlc3Rpb24uY29sQ291bnQ7XG4gICAgdmFyIGl0ZW1DbGFzcyA9XG4gICAgICBjc3NDbGFzc2VzLml0ZW0gK1xuICAgICAgKGNvbENvdW50ID09PSAwID8gXCIgXCIgKyBjc3NDbGFzc2VzLml0ZW1JbmxpbmUgOiBcIiBzdi1xLWNvbC1cIiArIGNvbENvdW50KTtcbiAgICB2YXIgYWxsb3dIb3ZlciA9ICFpc0NoZWNrZWQgJiYgIWlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5pdGVtQ2hlY2tlZDtcbiAgICB9XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuICAgIH1cbiAgICBpZiAoYWxsb3dIb3Zlcikge1xuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5pdGVtSG92ZXI7XG4gICAgfVxuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIGlzQ2hlY2tlZDogYm9vbGVhbixcbiAgICBpc0Rpc2FibGVkOiBib29sZWFuLFxuICAgIGlzRmlyc3Q6IGJvb2xlYW4sXG4gICAgY3NzQ2xhc3NlczogYW55XG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgaWQgPSBpc0ZpcnN0ID8gdGhpcy5xdWVzdGlvbi5pbnB1dElkIDogbnVsbDtcbiAgICBsZXQgaXRlbUNsYXNzID0gdGhpcy5nZXRJdGVtQ2xhc3MoaXNDaGVja2VkLCBpc0Rpc2FibGVkKTtcbiAgICB2YXIgdGV4dCA9IG51bGw7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uc2hvd0xhYmVsKSB7XG4gICAgICB0ZXh0ID0gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIHRpdGxlPXtpdGVtLnRleHQgfHwgaXRlbS52YWx1ZX1cbiAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtVGV4dH1cbiAgICAgICAgPlxuICAgICAgICAgIHtpdGVtLnRleHQgfHwgaXRlbS52YWx1ZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGU6IGFueSA9IHsgb2JqZWN0Rml0OiB0aGlzLnF1ZXN0aW9uLmltYWdlRml0IH07XG5cbiAgICB2YXIgY29udHJvbCA9IG51bGw7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uY29udGVudE1vZGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgY29udHJvbCA9IChcbiAgICAgICAgPGltZ1xuICAgICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pbWFnZX1cbiAgICAgICAgICBzcmM9e2l0ZW1bXCJpbWFnZUxpbmtcIl19XG4gICAgICAgICAgd2lkdGg9e1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoXG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoICsgXCJweFwiXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGhlaWdodD17XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCArIFwicHhcIlxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhbHQ9e2l0ZW0udGV4dCB8fCBpdGVtLnZhbHVlfVxuICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmNvbnRlbnRNb2RlID09PSBcInZpZGVvXCIpIHtcbiAgICAgIGNvbnRyb2wgPSAoXG4gICAgICAgIDxlbWJlZFxuICAgICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pbWFnZX1cbiAgICAgICAgICBzcmM9e2l0ZW1bXCJpbWFnZUxpbmtcIl19XG4gICAgICAgICAgd2lkdGg9e1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoXG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoICsgXCJweFwiXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGhlaWdodD17XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCArIFwicHhcIlxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGtleT17a2V5fSBjbGFzc05hbWU9e2l0ZW1DbGFzc30+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2Nzc0NsYXNzZXMubGFiZWx9PlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogXCJub25lXCIgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pdGVtQ29udHJvbH1cbiAgICAgICAgICAgIGlkPXtpZH1cbiAgICAgICAgICAgIHR5cGU9e3RoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QgPyBcImNoZWNrYm94XCIgOiBcInJhZGlvXCJ9XG4gICAgICAgICAgICBuYW1lPXt0aGlzLnF1ZXN0aW9uLm5hbWUgKyBcIl9cIiArIHRoaXMucXVlc3Rpb25CYXNlLmlkfVxuICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgdmFsdWU9e2l0ZW0udmFsdWV9XG4gICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlIHx8ICFpdGVtLmlzRW5hYmxlZH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfVxuICAgICAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2NvbnRyb2x9XG4gICAgICAgICAgICB7dGV4dH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImltYWdlcGlja2VyXCIsIHByb3BzID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25JbWFnZVBpY2tlciwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvaW1hZ2VwaWNrZXIudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXkgfSBmcm9tIFwiLi9yZWFjdFN1cnZleVwiO1xuaW1wb3J0IHsgUmVhY3RXaW5kb3dNb2RlbCB9IGZyb20gXCIuL3JlYWN0c3VydmV5bW9kZWxcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93IGV4dGVuZHMgU3VydmV5IHtcbiAgcHJvdGVjdGVkIHdpbmRvdzogUmVhY3RXaW5kb3dNb2RlbDtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uRXhwYW5kZWQgPSB0aGlzLmhhbmRsZU9uRXhwYW5kZWQuYmluZCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLndpbmRvdztcbiAgfVxuICBoYW5kbGVPbkV4cGFuZGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLndpbmRvdy5pc0V4cGFuZGVkID0gIXRoaXMud2luZG93LmlzRXhwYW5kZWQ7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMud2luZG93LmlzU2hvd2luZykgcmV0dXJuIG51bGw7XG4gICAgdmFyIGhlYWRlciA9IHRoaXMucmVuZGVySGVhZGVyKCk7XG4gICAgdmFyIGJvZHkgPSB0aGlzLndpbmRvdy5pc0V4cGFuZGVkID8gdGhpcy5yZW5kZXJCb2R5KCkgOiBudWxsO1xuICAgIGxldCBzdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXG4gICAgICBib3R0b206IDMsXG4gICAgICByaWdodDogMTAsXG4gICAgICBtYXhXaWR0aDogXCI2MCVcIlxuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cucm9vdH0gc3R5bGU9e3N0eWxlfT5cbiAgICAgICAge2hlYWRlcn1cbiAgICAgICAge2JvZHl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJIZWFkZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBzdHlsZUEgPSB7IHdpZHRoOiBcIjEwMCVcIiwgY3Vyc29yOiBcInBvaW50ZXJcIiB9O1xuICAgIHZhciBzdHlsZVRpdGxlID0geyBwYWRkaW5nUmlnaHQ6IFwiMTBweFwiIH07XG4gICAgdmFyIGdseXBoQ2xhc3NOYW1lID0gdGhpcy53aW5kb3cuaXNFeHBhbmRlZFxuICAgICAgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZFxuICAgICAgOiB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkV4cGFuZGVkO1xuICAgIGdseXBoQ2xhc3NOYW1lID0gXCJnbHlwaGljb24gcHVsbC1yaWdodCBcIiArIGdseXBoQ2xhc3NOYW1lO1xuICAgIHZhciB0aXRsZSA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnN1cnZleS5sb2NUaXRsZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuaGVhZGVyLnJvb3R9PlxuICAgICAgICA8c3BhbiBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uRXhwYW5kZWR9IHN0eWxlPXtzdHlsZUF9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5jc3Mud2luZG93LmhlYWRlci50aXRsZX0gc3R5bGU9e3N0eWxlVGl0bGV9PlxuICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2dseXBoQ2xhc3NOYW1lfSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHt0aGlzLndpbmRvdy5pc0V4cGFuZGVkID8gKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uRXhwYW5kZWR9XG4gICAgICAgICAgICBzdHlsZT17eyBmbG9hdDogXCJyaWdodFwiLCBjdXJzb3I6IFwicG9pbnRlclwiIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuaGVhZGVyLnRpdGxlfSBzdHlsZT17c3R5bGVUaXRsZX0+XG4gICAgICAgICAgICAgIFhcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQm9keSgpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuYm9keX0+e3RoaXMuZG9SZW5kZXIoKX08L2Rpdj47XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShuZXdQcm9wczogYW55KSB7XG4gICAgaWYgKCFuZXdQcm9wcykgbmV3UHJvcHMgPSB7fTtcbiAgICBzdXBlci5jcmVhdGVTdXJ2ZXkobmV3UHJvcHMpO1xuICAgIHRoaXMud2luZG93ID0gbmV3IFJlYWN0V2luZG93TW9kZWwobnVsbCwgdGhpcy5zdXJ2ZXkpO1xuICAgIGlmIChuZXdQcm9wcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0KSB7XG4gICAgICB0aGlzLndpbmRvdy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0ID0gbmV3UHJvcHMuY2xvc2VPbkNvbXBsZXRlVGltZW91dDtcbiAgICB9XG4gICAgdGhpcy53aW5kb3cuaXNTaG93aW5nID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMud2luZG93LmlzRXhwYW5kZWQgJiYgKG5ld1Byb3BzLmV4cGFuZGVkIHx8IG5ld1Byb3BzLmlzRXhwYW5kZWQpKVxuICAgICAgdGhpcy53aW5kb3cuZXhwYW5kKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMud2luZG93LmNsb3NlV2luZG93T25Db21wbGV0ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLndpbmRvdy5oaWRlKCk7XG4gICAgfTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0U3VydmV5V2luZG93LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlXG59IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9ib29sZWFuXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBPdGhlckVtcHR5RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQm9vbGVhbiBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsO1xuICB9XG4gIGhhbmRsZU9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgfSk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICB0aGlzLnVwZGF0ZUluZGV0ZXJtaW5hdGUoKTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBhbnksIHByZXZTdGF0ZTogYW55KSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKTtcbiAgICB0aGlzLnVwZGF0ZUluZGV0ZXJtaW5hdGUoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUluZGV0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIGVsOiBhbnkgPSB0aGlzLnJlZnNbXCJjaGVja1wiXTtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsW1wiaW5kZXRlcm1pbmF0ZVwiXSA9IHRoaXMucXVlc3Rpb24uaXNJbmRldGVybWluYXRlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldEl0ZW1DbGFzcygpOiBzdHJpbmcge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICB2YXIgaXRlbUNsYXNzID0gY3NzQ2xhc3Nlcy5pdGVtO1xuICAgIGlmIChpc0Rpc2FibGVkKSBpdGVtQ2xhc3MgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLml0ZW1EaXNhYmxlZDtcbiAgICBpZiAoaXNDaGVja2VkKSBpdGVtQ2xhc3MgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLml0ZW1DaGVja2VkO1xuICAgIGVsc2UgaWYgKGlzQ2hlY2tlZCA9PT0gbnVsbClcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaXRlbUluZGV0ZXJtaW5hdGU7XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxuICBwcml2YXRlIGdldExhYmVsQ2xhc3MoY2hlY2tlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbjtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICByZXR1cm4gKFxuICAgICAgY3NzQ2xhc3Nlcy5sYWJlbCArXG4gICAgICBcIiBcIiArXG4gICAgICAocXVlc3Rpb24uY2hlY2tlZFZhbHVlID09PSAhY2hlY2tlZCB8fCBxdWVzdGlvbi5pc1JlYWRPbmx5XG4gICAgICAgID8gcXVlc3Rpb24uY3NzQ2xhc3Nlcy5kaXNhYmxlZExhYmVsXG4gICAgICAgIDogXCJcIilcbiAgICApO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgaXRlbUNsYXNzID0gdGhpcy5nZXRJdGVtQ2xhc3MoKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2l0ZW1DbGFzc30+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICByZWY9XCJjaGVja1wiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgdmFsdWU9e1xuICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgIDogdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuY29udHJvbH1cbiAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgICAgICBjaGVja2VkPXt0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSB8fCBmYWxzZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfVxuICAgICAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3RoaXMuZ2V0TGFiZWxDbGFzcyhmYWxzZSl9PlxuICAgICAgICAgICAge3RoaXMucXVlc3Rpb24ubG9jTGFiZWxGYWxzZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnN3aXRjaH0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuc2xpZGVyfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5nZXRMYWJlbENsYXNzKHRydWUpfT5cbiAgICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uQm9vbGVhbiwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmJvb2xlYW4udHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBSZWFjdFN1cnZleUVsZW1lbnQsXG4gIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Vcbn0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0gfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2NoZWNrYm94XCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQ2hlY2tib3ggZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldCBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgIDxsZWdlbmQgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9IC8+XG4gICAgICAgIHt0aGlzLnF1ZXN0aW9uLmhhc0NvbHVtbnNcbiAgICAgICAgICA/IHRoaXMuZ2V0Q29sdW1ucyhjc3NDbGFzc2VzKVxuICAgICAgICAgIDogdGhpcy5nZXRJdGVtcyhjc3NDbGFzc2VzKX1cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1ucyhjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jb2x1bW5zLm1hcCgoY29sdW1uOiBhbnksIGNpOiBudW1iZXIpID0+IHtcbiAgICAgIHZhciBpdGVtcyA9IGNvbHVtbi5tYXAoKGl0ZW06IGFueSwgaWk6IG51bWJlcikgPT5cbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtKFxuICAgICAgICAgIFwiaXRlbVwiICsgaWksXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBjaSA9PT0gMCAmJiBpaSA9PT0gMCxcbiAgICAgICAgICBjc3NDbGFzc2VzLFxuICAgICAgICAgIFwiXCIgKyBjaSArIGlpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGtleT17XCJjb2x1bW5cIiArIGNpfSBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uZ2V0Q29sdW1uQ2xhc3MoKX0+XG4gICAgICAgICAge2l0ZW1zfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1zKGNzc0NsYXNzZXM6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2ldO1xuICAgICAgdmFyIGtleSA9IFwiaXRlbVwiICsgaTtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGtleSwgaXRlbSwgaSA9PSAwLCBjc3NDbGFzc2VzLCBcIlwiICsgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0U3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVySXRlbShcbiAgICBrZXk6IHN0cmluZyxcbiAgICBpdGVtOiBhbnksXG4gICAgaXNGaXJzdDogYm9vbGVhbixcbiAgICBjc3NDbGFzc2VzOiBhbnksXG4gICAgaW5kZXg6IHN0cmluZ1xuICApOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94SXRlbVxuICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgaXRlbT17aXRlbX1cbiAgICAgICAgdGV4dFN0eWxlPXt0aGlzLnRleHRTdHlsZX1cbiAgICAgICAgaXNGaXJzdD17aXNGaXJzdH1cbiAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgLz5cbiAgICApO1xuICB9XG59XG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25DaGVja2JveEl0ZW0gZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZWxlY3RBbGxDaGFuZ2VkID0gdGhpcy5zZWxlY3RBbGxDaGFuZ2VkLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25DaGVja2JveE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5xdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pdGVtO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGV4dFN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudGV4dFN0eWxlO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNGaXJzdCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmlzRmlyc3Q7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmluZGV4O1xuICB9XG4gIHB1YmxpYyBzaG91bGRDb21wb25lbnRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldCB8fFxuICAgICAgISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldERhdGEuaXNOZWVkUmVuZGVyIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpZGdldEpzb24ucmVuZGVyXG4gICAgKTtcbiAgfVxuICBoYW5kbGVPbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgdmFyIG5ld1ZhbHVlID0gW10uY29uY2F0KHRoaXMucXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSB8fCBbXSk7XG4gICAgdmFyIGluZGV4ID0gbmV3VmFsdWUuaW5kZXhPZih0aGlzLml0ZW0udmFsdWUpO1xuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMuaXRlbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIG5ld1ZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHNlbGVjdEFsbENoYW5nZWQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24udG9nZ2xlU2VsZWN0QWxsKCk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuaXRlbSB8fCAhdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGlzQ2hlY2tlZCA9IHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQodGhpcy5pdGVtKTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhdGhpcy5pdGVtLmlzRW5hYmxlZDtcbiAgICB2YXIgb3RoZXJJdGVtID1cbiAgICAgIHRoaXMuaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUgJiYgaXNDaGVja2VkXG4gICAgICAgID8gdGhpcy5yZW5kZXJPdGhlcigpXG4gICAgICAgIDogbnVsbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJDaGVja2JveChpc0NoZWNrZWQsIGlzRGlzYWJsZWQsIG90aGVySXRlbSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpbnB1dFN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgbWFyZ2luUmlnaHQ6IFwiM3B4XCIgfTtcbiAgfVxuICBwcml2YXRlIGdldEl0ZW1DbGFzcyhpc0NoZWNrZWQ6IGJvb2xlYW4sIGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBhbGxvd0hvdmVyID0gIWlzQ2hlY2tlZCAmJiAhaXNEaXNhYmxlZDtcbiAgICB2YXIgaXRlbUNsYXNzID0gY3NzQ2xhc3Nlcy5pdGVtO1xuICAgIGlmIChpc0Rpc2FibGVkKSBpdGVtQ2xhc3MgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLml0ZW1EaXNhYmxlZDtcbiAgICBpZiAoaXNDaGVja2VkKSBpdGVtQ2xhc3MgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLml0ZW1DaGVja2VkO1xuICAgIGlmIChhbGxvd0hvdmVyKSBpdGVtQ2xhc3MgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLml0ZW1Ib3ZlcjtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24uaGFzQ29sdW1ucykge1xuICAgICAgaXRlbUNsYXNzICs9XG4gICAgICAgIHRoaXMucXVlc3Rpb24uY29sQ291bnQgPT09IDBcbiAgICAgICAgICA/IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1JbmxpbmVcbiAgICAgICAgICA6IFwiIHN2LXEtY29sLVwiICsgdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQ2hlY2tib3goXG4gICAgaXNDaGVja2VkOiBib29sZWFuLFxuICAgIGlzRGlzYWJsZWQ6IGJvb2xlYW4sXG4gICAgb3RoZXJJdGVtOiBKU1guRWxlbWVudFxuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGlkID0gdGhpcy5xdWVzdGlvbi5pbnB1dElkICsgXCJfXCIgKyB0aGlzLmluZGV4O1xuICAgIHZhciB0ZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcodGhpcy5pdGVtLmxvY1RleHQpO1xuICAgIGxldCBpdGVtQ2xhc3MgPSB0aGlzLmdldEl0ZW1DbGFzcyhpc0NoZWNrZWQsIGlzRGlzYWJsZWQpO1xuICAgIGxldCBsYWJlbENsYXNzID0gdGhpcy5xdWVzdGlvbi5nZXRMYWJlbENsYXNzKGlzQ2hlY2tlZCk7XG4gICAgdmFyIG9uSXRlbUNoYW5nZWQgPVxuICAgICAgdGhpcy5pdGVtID09IHRoaXMucXVlc3Rpb24uc2VsZWN0QWxsSXRlbVxuICAgICAgICA/IHRoaXMuc2VsZWN0QWxsQ2hhbmdlZFxuICAgICAgICA6IHRoaXMuaGFuZGxlT25DaGFuZ2U7XG5cbiAgICB2YXIgbG9jVGV4dDogYW55ID0gdGhpcy5pdGVtLmxvY1RleHQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2l0ZW1DbGFzc30+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2xhYmVsQ2xhc3N9PlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaXRlbUNvbnRyb2x9XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgdmFsdWU9e3RoaXMuaXRlbS52YWx1ZX1cbiAgICAgICAgICAgIGlkPXtpZH1cbiAgICAgICAgICAgIHN0eWxlPXt0aGlzLmlucHV0U3R5bGV9XG4gICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlIHx8ICF0aGlzLml0ZW0uaXNFbmFibGVkfVxuICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgb25DaGFuZ2U9e29uSXRlbUNoYW5nZWR9XG4gICAgICAgICAgICBhcmlhLXJlcXVpcmVkPXt0aGlzLnF1ZXN0aW9uLmlzUmVxdWlyZWR9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtsb2NUZXh0LnJlbmRlcmVkSHRtbH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLm1hdGVyaWFsRGVjb3JhdG9yfT5cbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLml0ZW1EZWNvcmF0b3J9PlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUsMTNsMi0ybDMsM2w3LTdsMiwybC05LDlMNSwxM3pcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaGVja1wiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuY3NzQ2xhc3Nlcy5jb250cm9sTGFiZWx9XG4gICAgICAgICAgICB0aXRsZT17bG9jVGV4dFtcImtvUmVuZGVyZWRIdG1sXCJdfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0ZXh0fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAge290aGVySXRlbX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlck90aGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtXG4gICAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgICAgb3RoZXJDc3M9e3RoaXMuY3NzQ2xhc3Nlcy5vdGhlcn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXt0aGlzLmNzc0NsYXNzZXN9XG4gICAgICAgICAgaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY2hlY2tib3hcIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uY2hlY2tib3gudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvblVuY29udHJvbGxlZEVsZW1lbnQsXG4gIFJlYWN0U3VydmV5RWxlbWVudFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fZHJvcGRvd25cIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0gfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkRyb3Bkb3duIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25VbmNvbnRyb2xsZWRFbGVtZW50PFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgY29tbWVudCA9IHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkXG4gICAgICA/IHRoaXMucmVuZGVyT3RoZXIoY3NzQ2xhc3NlcylcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgc2VsZWN0ID0gdGhpcy5yZW5kZXJTZWxlY3QoY3NzQ2xhc3Nlcyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICB7c2VsZWN0fVxuICAgICAgICB7Y29tbWVudH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclNlbGVjdChjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSkge1xuICAgICAgdmFyIGlzT3RoZXJTZWxlY3RlZCA9IHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICA8ZGl2IGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5jb250cm9sfSBkaXNhYmxlZD5cbiAgICAgICAgICB7aXNPdGhlclNlbGVjdGVkXG4gICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24ub3RoZXJUZXh0XG4gICAgICAgICAgICA6IHRoaXMucXVlc3Rpb24uZGlzcGxheVZhbHVlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV07XG4gICAgICB2YXIga2V5ID0gXCJpdGVtXCIgKyBpO1xuICAgICAgdmFyIG9wdGlvbiA9IDxTdXJ2ZXlRdWVzdGlvbk9wdGlvbkl0ZW0ga2V5PXtrZXl9IGl0ZW09e2l0ZW19IC8+O1xuICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgfVxuICAgIHZhciBjYXB0aW9uT3B0aW9uID0gdGhpcy5xdWVzdGlvbi5zaG93T3B0aW9uc0NhcHRpb24gPyAoXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3RoaXMucXVlc3Rpb24ub3B0aW9uc0NhcHRpb259PC9vcHRpb24+XG4gICAgKSA6IG51bGw7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuc2VsZWN0V3JhcHBlcn0+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5jb250cm9sfVxuICAgICAgICAgIHJlZj17c2VsZWN0ID0+ICh0aGlzLmNvbnRyb2wgPSBzZWxlY3QpfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnVwZGF0ZVZhbHVlT25FdmVudH1cbiAgICAgICAgICBvbklucHV0PXt0aGlzLnVwZGF0ZVZhbHVlT25FdmVudH1cbiAgICAgICAgICBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH1cbiAgICAgICAgPlxuICAgICAgICAgIHtjYXB0aW9uT3B0aW9ufVxuICAgICAgICAgIHtvcHRpb25zfVxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlck90aGVyKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtXG4gICAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgICAgb3RoZXJDc3M9e2Nzc0NsYXNzZXMub3RoZXJ9XG4gICAgICAgICAgY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc31cbiAgICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk9wdGlvbkl0ZW0gZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdGF0ZUVsZW1lbnQoKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbTtcbiAgfVxuICBwcml2YXRlIGdldCBpdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXRlbTtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5pdGVtKSByZXR1cm47XG4gICAgcmV0dXJuIChcbiAgICAgIDxvcHRpb24gdmFsdWU9e3RoaXMuaXRlbS52YWx1ZX0gZGlzYWJsZWQ9eyF0aGlzLml0ZW0uaXNFbmFibGVkfT5cbiAgICAgICAge3RoaXMuaXRlbS50ZXh0fVxuICAgICAgPC9vcHRpb24+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkRyb3Bkb3duLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZHJvcGRvd24udHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkVtcHR5TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uRW1wdHkgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0geyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25FbXB0eU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25FbXB0eU1vZGVsO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxkaXYgLz47XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImVtcHR5XCIsIHByb3BzID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25FbXB0eSwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmVtcHR5LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FeHByZXNzaW9uIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgIHt0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkV4cHJlc3Npb24sIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25leHByZXNzaW9uLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZpbGVNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9maWxlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBjb25maXJtQWN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25GaWxlIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGZpbGVMb2FkZWQ6IDAsXG4gICAgICBzdGF0ZTogXCJlbXB0eVwiLFxuICAgICAgcm9vdENsYXNzOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucm9vdFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnF1ZXN0aW9uLm9uU3RhdGVDaGFuZ2VkLmFkZCgoc3RhdGU6IGFueSkgPT5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlTG9hZGVkOiB0aGlzLnN0YXRlLmZpbGVMb2FkZWQgKyAxLCBzdGF0ZTogc3RhdGUgfSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25GaWxlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkZpbGVNb2RlbDtcbiAgfVxuICBoYW5kbGVPbkRyYWdPdmVyID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuICBoYW5kbGVPbkRyb3AgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IHNyYyA9IGV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICB0aGlzLm9uQ2hhbmdlKHNyYyk7XG4gIH07XG4gIGhhbmRsZU9uQ2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIgc3JjID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgdGhpcy5vbkNoYW5nZShzcmMpO1xuICB9O1xuICBoYW5kbGVPbkNsZWFuID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uO1xuICAgIHZhciBzcmMgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcbiAgICBpZiAocXVlc3Rpb24ubmVlZENvbmZpcm1SZW1vdmVGaWxlKSB7XG4gICAgICB2YXIgaXNDb25maXJtZWQgPSBjb25maXJtQWN0aW9uKHF1ZXN0aW9uLmNvbmZpcm1SZW1vdmVBbGxNZXNzYWdlKTtcbiAgICAgIGlmICghaXNDb25maXJtZWQpIHJldHVybjtcbiAgICB9XG4gICAgcXVlc3Rpb24uY2xlYXIoKTtcbiAgICBzcmMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRcIilbMF0udmFsdWUgPSBcIlwiO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlTG9hZGVkOiB0aGlzLnN0YXRlLmZpbGVMb2FkZWQgKyAxIH0pO1xuICB9O1xuICBoYW5kbGVPblJlbW92ZUZpbGUgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb247XG4gICAgaWYgKHF1ZXN0aW9uLm5lZWRDb25maXJtUmVtb3ZlRmlsZSkge1xuICAgICAgdmFyIGlzQ29uZmlybWVkID0gY29uZmlybUFjdGlvbihcbiAgICAgICAgcXVlc3Rpb24uZ2V0Q29uZmlybVJlbW92ZU1lc3NhZ2UoZXZlbnQubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAoIWlzQ29uZmlybWVkKSByZXR1cm47XG4gICAgfVxuICAgIHF1ZXN0aW9uLnJlbW92ZUZpbGUoZXZlbnQpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlTG9hZGVkOiB0aGlzLnN0YXRlLmZpbGVMb2FkZWQgKyAxIH0pO1xuICB9O1xuICBwcml2YXRlIG9uQ2hhbmdlID0gKHNyYzogYW55KSA9PiB7XG4gICAgaWYgKCEod2luZG93IGFzIGFueSlbXCJGaWxlUmVhZGVyXCJdKSByZXR1cm47XG4gICAgaWYgKCFzcmMgfHwgIXNyYy5maWxlcyB8fCBzcmMuZmlsZXMubGVuZ3RoIDwgMSkgcmV0dXJuO1xuICAgIGxldCBmaWxlcyA9IFtdO1xuICAgIGxldCBhbGxvd0NvdW50ID0gdGhpcy5xdWVzdGlvbi5hbGxvd011bHRpcGxlID8gc3JjLmZpbGVzLmxlbmd0aCA6IDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxvd0NvdW50OyBpKyspIHtcbiAgICAgIGZpbGVzLnB1c2goc3JjLmZpbGVzW2ldKTtcbiAgICB9XG4gICAgc3JjLnZhbHVlID0gXCJcIjtcbiAgICB0aGlzLnF1ZXN0aW9uLmxvYWRGaWxlcyhmaWxlcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVMb2FkZWQ6IHRoaXMuc3RhdGUuZmlsZUxvYWRlZCArIDEgfSk7XG4gIH07XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcHJldmlldyA9IHRoaXMucmVuZGVyUHJldmlldygpO1xuICAgIHZhciBmaWxlSW5wdXQgPSBudWxsO1xuICAgIHZhciBmaWxlRGVjb3JhdG9yID0gdGhpcy5yZW5kZXJGaWxlRGVjb3JhdG9yKCk7XG4gICAgdmFyIGNsZWFyQnV0dG9uID0gdGhpcy5yZW5kZXJDbGVhckJ1dHRvbihcbiAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVCdXR0b25cbiAgICApO1xuICAgIHZhciBjbGVhckJ1dHRvbkJvdHRvbSA9IHRoaXMucmVuZGVyQ2xlYXJCdXR0b24oXG4gICAgICB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlQnV0dG9uQm90dG9tXG4gICAgKTtcbiAgICBmaWxlSW5wdXQgPSAoXG4gICAgICA8aW5wdXRcbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuZmlsZUlucHV0fVxuICAgICAgICBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfVxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIG9uQ2hhbmdlPXshdGhpcy5pc0Rpc3BsYXlNb2RlID8gdGhpcy5oYW5kbGVPbkNoYW5nZSA6IG51bGx9XG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgIG11bHRpcGxlPXt0aGlzLnF1ZXN0aW9uLmFsbG93TXVsdGlwbGV9XG4gICAgICAgIHRpdGxlPXt0aGlzLnF1ZXN0aW9uLmlucHV0VGl0bGV9XG4gICAgICAgIGFjY2VwdD17dGhpcy5xdWVzdGlvbi5hY2NlcHRlZFR5cGVzfVxuICAgICAgLz5cbiAgICApO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5zdGF0ZS5yb290Q2xhc3N9PlxuICAgICAgICB7ZmlsZUlucHV0fVxuICAgICAgICB7ZmlsZURlY29yYXRvcn1cbiAgICAgICAge2NsZWFyQnV0dG9ufVxuICAgICAgICB7cHJldmlld31cbiAgICAgICAge2NsZWFyQnV0dG9uQm90dG9tfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRmlsZURlY29yYXRvcigpOiBKU1guRWxlbWVudCB7XG4gICAgbGV0IG5vRmlsZUNob3NlbiA9IG51bGw7XG4gICAgbGV0IGNob29zZUZpbGUgPSBudWxsO1xuICAgIGxldCBjaG9vc2VGaWxlQ3NzID1cbiAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5jaG9vc2VGaWxlICtcbiAgICAgICh0aGlzLmlzRGlzcGxheU1vZGUgPyBcIiBcIiArIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5kaXNhYmxlZCA6IFwiXCIpO1xuICAgIGNob29zZUZpbGUgPSAoXG4gICAgICA8bGFiZWwgY2xhc3NOYW1lPXtjaG9vc2VGaWxlQ3NzfSBodG1sRm9yPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9PlxuICAgICAgICB7dGhpcy5xdWVzdGlvbi5jaG9vc2VCdXR0b25DYXB0aW9ufVxuICAgICAgPC9sYWJlbD5cbiAgICApO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzRW1wdHkoKSkge1xuICAgICAgbm9GaWxlQ2hvc2VuID0gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5ub0ZpbGVDaG9zZW59PlxuICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLm5vRmlsZUNob3NlbkNhcHRpb259XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmZpbGVEZWNvcmF0b3J9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVPbkRyb3B9XG4gICAgICAgIG9uRHJhZ092ZXI9e3RoaXMuaGFuZGxlT25EcmFnT3Zlcn1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy53cmFwcGVyfT5cbiAgICAgICAgICB7Y2hvb3NlRmlsZX1cbiAgICAgICAgICB7bm9GaWxlQ2hvc2VufVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNsZWFyQnV0dG9uKGNsYXNzTmFtZTogc3RyaW5nKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAhdGhpcy5xdWVzdGlvbi5pc0VtcHR5KCkgJiYgIXRoaXMuaXNEaXNwbGF5TW9kZSA/IChcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25DbGVhbn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICB7dGhpcy5xdWVzdGlvbi5jbGVhbkJ1dHRvbkNhcHRpb259XG4gICAgICA8L2J1dHRvbj5cbiAgICApIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUHJldmlldygpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZXZpZXdzID0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubWFwKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIXZhbCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZmlsZVNpZ24gPSAoXG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj17dmFsLmNvbnRlbnR9XG4gICAgICAgICAgdGl0bGU9e3ZhbC5uYW1lfVxuICAgICAgICAgIGRvd25sb2FkPXt2YWwubmFtZX1cbiAgICAgICAgICBzdHlsZT17eyB3aWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoICsgXCJweFwiIH19XG4gICAgICAgID5cbiAgICAgICAgICB7dmFsLm5hbWV9XG4gICAgICAgIDwvYT5cbiAgICAgICk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIGtleT17dGhpcy5xdWVzdGlvbi5pbnB1dElkICsgXCJfXCIgKyBpbmRleH1cbiAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcmV2aWV3fVxuICAgICAgICA+XG4gICAgICAgICAge3ZhbC5uYW1lID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5maWxlU2lnbn0+e2ZpbGVTaWdufTwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZSh2YWwpID8gKFxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9e3ZhbC5jb250ZW50fVxuICAgICAgICAgICAgICBoZWlnaHQ9e3RoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHR9XG4gICAgICAgICAgICAgIHdpZHRoPXt0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGh9XG4gICAgICAgICAgICAgIGFsdD1cIkZpbGUgcHJldmlld1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIHt2YWwubmFtZSAmJiAhdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVGaWxlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2V2ZW50ID0+IHRoaXMuaGFuZGxlT25SZW1vdmVGaWxlKHZhbCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7dGhpcy5xdWVzdGlvbi5yZW1vdmVGaWxlQ2FwdGlvbn1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlRmlsZVN2Z31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtldmVudCA9PiB0aGlzLmhhbmRsZU9uUmVtb3ZlRmlsZSh2YWwpfVxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LDJDNC43LDIsMiw0LjcsMiw4czIuNyw2LDYsNnM2LTIuNyw2LTZTMTEuMywyLDgsMnogTTExLDEwbC0xLDFMOCw5bC0yLDJsLTEtMWwyLTJMNSw2bDEtMWwyLDJsMi0ybDEsMUw5LDggTDExLDEwelwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5maWxlU2lnbkJvdHRvbX0+XG4gICAgICAgICAgICB7ZmlsZVNpZ259XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIDxkaXY+e3ByZXZpZXdzfTwvZGl2PjtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZmlsZVwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uRmlsZSwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGUudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2h0bWxcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uSHRtbCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25IdG1sTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkh0bWxNb2RlbDtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5xdWVzdGlvbi5odG1sKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMucXVlc3Rpb24ubG9jSHRtbC5yZW5kZXJlZEh0bWwgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yb290fVxuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfVxuICAgICAgLz5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJodG1sXCIsIHByb3BzID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25IdG1sLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbC50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIFJlYWN0U3VydmV5RWxlbWVudCxcbiAgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZVxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhcIjtcbmltcG9ydCB7IE1hdHJpeFJvd01vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXggZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0geyByb3dzQ2hhbmdlZDogMCB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLnNldFN0YXRlKHsgcm93c0NoYW5nZWQ6IHNlbGYuc3RhdGUucm93c0NoYW5nZWQgKyAxIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBmaXJzdFRIID0gdGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gPHRkIC8+IDogbnVsbDtcbiAgICB2YXIgaGVhZGVycyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XG4gICAgICB2YXIgY29sdW1UZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcoY29sdW1uLmxvY1RleHQpO1xuICAgICAgaGVhZGVycy5wdXNoKFxuICAgICAgICA8dGggY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaGVhZGVyQ2VsbH0ga2V5PXtrZXl9PlxuICAgICAgICAgIHtjb2x1bVRleHR9XG4gICAgICAgIDwvdGg+XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciB2aXNpYmxlUm93cyA9IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHZpc2libGVSb3dzW2ldO1xuICAgICAgdmFyIGtleSA9IFwicm93XCIgKyBpO1xuICAgICAgcm93cy5wdXNoKFxuICAgICAgICA8U3VydmV5UXVlc3Rpb25NYXRyaXhSb3dcbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgICByb3c9e3Jvd31cbiAgICAgICAgICBpc0ZpcnN0PXtpID09IDB9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgaGVhZGVyID0gIXRoaXMucXVlc3Rpb24uc2hvd0hlYWRlciA/IG51bGwgOiAoXG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICB7Zmlyc3RUSH1cbiAgICAgICAgICB7aGVhZGVyc31cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMudGFibGVXcmFwcGVyfT5cbiAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgIDxsZWdlbmQgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9IC8+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgICAgIHtoZWFkZXJ9XG4gICAgICAgICAgICA8dGJvZHk+e3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhSb3cgZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcm93KCk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yb3c7XG4gIH1cbiAgaGFuZGxlT25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucm93LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5yb3cudmFsdWUgfSk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucm93KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZmlyc3RURCA9IG51bGw7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzUm93cykge1xuICAgICAgdmFyIHJvd1RleHQgPSB0aGlzLnJlbmRlckxvY1N0cmluZyh0aGlzLnJvdy5sb2NUZXh0KTtcbiAgICAgIGZpcnN0VEQgPSA8dGQgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuY2VsbH0+e3Jvd1RleHR9PC90ZD47XG4gICAgfVxuICAgIHZhciB0ZHMgPSB0aGlzLmdlbmVyYXRlVGRzKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDx0cj5cbiAgICAgICAge2ZpcnN0VER9XG4gICAgICAgIHt0ZHN9XG4gICAgICA8L3RyPlxuICAgICk7XG4gIH1cbiAgZ2VuZXJhdGVUZHMoKSB7XG4gICAgdmFyIHRkcyA9IFtdO1xuICAgIHZhciByb3cgPSB0aGlzLnJvdztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRkID0gbnVsbDtcbiAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zW2ldO1xuICAgICAgdmFyIGtleSA9IFwidmFsdWVcIiArIGk7XG5cbiAgICAgIHZhciBpc0NoZWNrZWQgPSByb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgbGV0IGl0ZW1DbGFzcyA9IHRoaXMuZ2V0SXRlbUNsYXNzKHJvdywgY29sdW1uKTtcbiAgICAgIHZhciBpbnB1dElkID0gdGhpcy5xdWVzdGlvbi5pbnB1dElkICsgXCJfXCIgKyByb3cubmFtZSArIFwiX1wiICsgaTtcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NlbGxUZXh0KSB7XG4gICAgICAgIHZhciBnZXRIYW5kbGVyID0gIXRoaXMucXVlc3Rpb24uaXNSZWFkT25seVxuICAgICAgICAgID8gKGNvbHVtbjogYW55KSA9PiAoKSA9PiB0aGlzLmNlbGxDbGljayhyb3csIGNvbHVtbilcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHRkID0gKFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2l0ZW1DbGFzcyArIFwiIFwiICsgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmNlbGx9XG4gICAgICAgICAgICBvbkNsaWNrPXtnZXRIYW5kbGVyID8gZ2V0SGFuZGxlcihjb2x1bW4pIDogbnVsbH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dGhpcy5yZW5kZXJMb2NTdHJpbmcoXG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdy5uYW1lLCBjb2x1bW4pXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZCA9IChcbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgICAgaGVhZGVycz17Y29sdW1uLmxvY1RleHQucmVuZGVyZWRIdG1sfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuY2VsbH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPXtpdGVtQ2xhc3N9PlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD17aW5wdXRJZH1cbiAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLml0ZW1WYWx1ZX1cbiAgICAgICAgICAgICAgICBuYW1lPXtyb3cuZnVsbE5hbWV9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2NvbHVtbi52YWx1ZX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2tlZH1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPXt0aGlzLnF1ZXN0aW9uLmlzUmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLm1hdGVyaWFsRGVjb3JhdG9yfT5cbiAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtRGVjb3JhdG9yfVxuICAgICAgICAgICAgICAgICAgdmlld0JveD1cIi0xMiAtMTIgMjQgMjRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgcj1cIjZcIiBjeD1cIjBcIiBjeT1cIjBcIiAvPnNcbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaXJjbGVcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaGVja1wiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGRpc3BsYXk6IFwibm9uZVwiIH19PlxuICAgICAgICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGRzLnB1c2godGQpO1xuICAgIH1cblxuICAgIHJldHVybiB0ZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUNsYXNzKHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbjtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgaXNDaGVja2VkID0gcm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgdmFyIGFsbG93SG92ZXIgPSAhaXNDaGVja2VkICYmICFpc0Rpc2FibGVkO1xuICAgIHZhciBjZWxsRGlzYWJsZWRDbGFzcyA9IHF1ZXN0aW9uLmhhc0NlbGxUZXh0XG4gICAgICA/IGNzc0NsYXNzZXMuY2VsbFRleHREaXNhYmxlZFxuICAgICAgOiBjc3NDbGFzc2VzLml0ZW1EaXNhYmxlZDtcblxuICAgIHZhciBjZWxsU2VsZWN0ZWRDbGFzcyA9IHF1ZXN0aW9uLmhhc0NlbGxUZXh0XG4gICAgICA/IGNzc0NsYXNzZXMuY2VsbFRleHRTZWxlY3RlZFxuICAgICAgOiBjc3NDbGFzc2VzLml0ZW1DaGVja2VkO1xuXG4gICAgdmFyIGl0ZW1Ib3ZlckNsYXNzID0gIXF1ZXN0aW9uLmhhc0NlbGxUZXh0ID8gY3NzQ2xhc3Nlcy5pdGVtSG92ZXIgOiBcIlwiO1xuXG4gICAgdmFyIGNlbGxDbGFzcyA9IHF1ZXN0aW9uLmhhc0NlbGxUZXh0XG4gICAgICA/IGNzc0NsYXNzZXMuY2VsbFRleHRcbiAgICAgIDogY3NzQ2xhc3Nlcy5sYWJlbDtcblxuICAgIGxldCBpdGVtQ2xhc3MgPVxuICAgICAgY2VsbENsYXNzICtcbiAgICAgIChpc0NoZWNrZWQgPyBcIiBcIiArIGNlbGxTZWxlY3RlZENsYXNzIDogXCJcIikgK1xuICAgICAgKGlzRGlzYWJsZWQgPyBcIiBcIiArIGNlbGxEaXNhYmxlZENsYXNzIDogXCJcIikgK1xuICAgICAgKGFsbG93SG92ZXIgPyBcIiBcIiArIGl0ZW1Ib3ZlckNsYXNzIDogXCJcIik7XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxuXG4gIGNlbGxDbGljayhyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICByb3cudmFsdWUgPSBjb2x1bW4udmFsdWU7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeFwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTWF0cml4LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd24sIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bi50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJlYWN0U3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25CYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbm1hdHJpeGRyb3Bkb3duYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25Sb3dBZGRDbGljayA9IHRoaXMuaGFuZGxlT25Sb3dBZGRDbGljay5iaW5kKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgbWF0cml4KCk6IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWw7XG4gIH1cbiAgaGFuZGxlT25Sb3dBZGRDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5tYXRyaXguYWRkUm93KCk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBtYWluRGl2ID0gdGhpcy5yZW5kZXJUYWJsZURpdigpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj1cIm1hdHJpeER5bmFtaWNSZWZcIj5cbiAgICAgICAge3RoaXMucmVuZGVyQWRkUm93QnV0dG9uT25Ub3AoY3NzQ2xhc3Nlcyl9XG4gICAgICAgIHttYWluRGl2fVxuICAgICAgICB7dGhpcy5yZW5kZXJBZGRSb3dCdXR0b25PbkJvdHRvbShjc3NDbGFzc2VzKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckFkZFJvd0J1dHRvbk9uVG9wKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMubWF0cml4LmlzQWRkUm93T25Ub3ApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnJlbmRlckFkZFJvd0J1dHRvbihjc3NDbGFzc2VzKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQWRkUm93QnV0dG9uT25Cb3R0b20oY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5tYXRyaXguaXNBZGRSb3dPbkJvdHRvbSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyQWRkUm93QnV0dG9uKGNzc0NsYXNzZXMpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJBZGRSb3dCdXR0b24oY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5mb290ZXJ9PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmJ1dHRvbiArIFwiIFwiICsgY3NzQ2xhc3Nlcy5idXR0b25BZGR9XG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVPblJvd0FkZENsaWNrfVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3RoaXMubWF0cml4LmFkZFJvd1RleHR9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pY29uQWRkfSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcmVuZGVyUmVtb3ZlQnV0dG9uKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNSZW1vdmVCdXR0b25cbiAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgIHJvdz17cm93fVxuICAgICAgICBjc3NDbGFzc2VzPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbW92ZUJ1dHRvbiBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVPblJvd1JlbW92ZUNsaWNrID0gdGhpcy5oYW5kbGVPblJvd1JlbW92ZUNsaWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICB9XG4gIHByaXZhdGUgZ2V0IHJvdygpOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucm93O1xuICB9XG4gIGhhbmRsZU9uUm93UmVtb3ZlQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24ucmVtb3ZlUm93VUkodGhpcy5yb3cpO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuYnV0dG9uICsgXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuYnV0dG9uUmVtb3ZlfVxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVPblJvd1JlbW92ZUNsaWNrfVxuICAgICAgPlxuICAgICAgICA8c3Bhbj57dGhpcy5xdWVzdGlvbi5yZW1vdmVSb3dUZXh0fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaWNvblJlbW92ZX0gLz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWMsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkeW5hbWljLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlXG59IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGwgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5pbXBvcnQgeyBNdWx0aXBsZVRleHRJdGVtTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk11bHRpcGxlVGV4dCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciB0YWJsZVJvd3MgPSB0aGlzLnF1ZXN0aW9uLmdldFJvd3MoKTtcbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFibGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzLnB1c2godGhpcy5yZW5kZXJSb3coaSwgdGFibGVSb3dzW2ldLCBjc3NDbGFzc2VzKSk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8dGFibGUgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICA8dGJvZHk+e3Jvd3N9PC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUm93KFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgaXRlbXM6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4sXG4gICAgY3NzQ2xhc3NlczogYW55XG4gICkge1xuICAgIHZhciBrZXk6IHN0cmluZyA9IFwiaXRlbVwiICsgcm93SW5kZXg7XG4gICAgdmFyIHRkcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICB2YXIgaXRlbVRpdGxlID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcoaXRlbS5sb2NUaXRsZSk7XG4gICAgICB0ZHMucHVzaChcbiAgICAgICAgPHRkIGtleT17XCJsYWJlbFwiICsgaX0gY2xhc3NOYW1lID0ge2Nzc0NsYXNzZXMuY2VsbH0gPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pdGVtVGl0bGV9PntpdGVtVGl0bGV9PC9zcGFuPlxuICAgICAgICA8L3RkPlxuICAgICAgKTtcbiAgICAgIHRkcy5wdXNoKFxuICAgICAgICA8U3VydmV5UXVlc3Rpb25BbmRFcnJvcnNDZWxsXG4gICAgICAgICAga2V5PXtcInZhbHVlXCIgKyBpfVxuICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgcXVlc3Rpb249e2l0ZW0uZWRpdG9yfVxuICAgICAgICAgIGNyZWF0b3I9e3RoaXMuY3JlYXRvcn1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8dHIga2V5PXtrZXl9IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb3d9PlxuICAgICAgICB7dGRzfVxuICAgICAgPC90cj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbk11bHRpcGxlVGV4dCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbm11bHRpcGxldGV4dC50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIFJlYWN0U3VydmV5RWxlbWVudCxcbiAgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZVxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG59IGZyb20gXCIuLi9xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7IFN1cnZleVBhbmVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IElTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25QYW5lbER5bmFtaWMgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uUGFuZWxBZGRDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbEFkZENsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVPblBhbmVsUHJldkNsaWNrID0gdGhpcy5oYW5kbGVPblBhbmVsUHJldkNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVPblBhbmVsTmV4dENsaWNrID0gdGhpcy5oYW5kbGVPblBhbmVsTmV4dENsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVPblJhbmdlQ2hhbmdlID0gdGhpcy5oYW5kbGVPblJhbmdlQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbDtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBwYW5lbENvdW50ZXI6IDAgfSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi51cGRhdGVRdWVzdGlvblJlbmRlcmluZygpO1xuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYudXBkYXRlUXVlc3Rpb25SZW5kZXJpbmcoKTtcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi51cGRhdGVRdWVzdGlvblJlbmRlcmluZygpO1xuICAgIH07XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICB0aGlzLnF1ZXN0aW9uLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMucXVlc3Rpb24uY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLnF1ZXN0aW9uLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUXVlc3Rpb25SZW5kZXJpbmcoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwYW5lbENvdW50ZXI6IHRoaXMuc3RhdGUgPyB0aGlzLnN0YXRlLnBhbmVsQ291bnRlciArIDEgOiAxXG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlT25QYW5lbEFkZENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmFkZFBhbmVsVUkoKTtcbiAgfVxuICBoYW5kbGVPblBhbmVsUHJldkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmdvVG9QcmV2UGFuZWwoKTtcbiAgfVxuICBoYW5kbGVPblBhbmVsTmV4dENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmdvVG9OZXh0UGFuZWwoKTtcbiAgfVxuICBoYW5kbGVPblJhbmdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIHBhbmVscyA9IFtdO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzUmVuZGVyTW9kZUxpc3QpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhbmVsID0gdGhpcy5xdWVzdGlvbi5wYW5lbHNbaV07XG4gICAgICAgIHBhbmVscy5wdXNoKFxuICAgICAgICAgIDxTdXJ2ZXlRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1cbiAgICAgICAgICAgIGtleT17cGFuZWwuaWR9XG4gICAgICAgICAgICBlbGVtZW50PXtwYW5lbH1cbiAgICAgICAgICAgIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICAgICAgaW5kZXg9e2l9XG4gICAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgICAgaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmN1cnJlbnRQYW5lbCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5lbCA9IHRoaXMucXVlc3Rpb24uY3VycmVudFBhbmVsO1xuICAgICAgICBwYW5lbHMucHVzaChcbiAgICAgICAgICA8U3VydmV5UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG4gICAgICAgICAgICBrZXk9e3RoaXMucXVlc3Rpb24uY3VycmVudEluZGV4fVxuICAgICAgICAgICAgZWxlbWVudD17cGFuZWx9XG4gICAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICAgIGluZGV4PXt0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleH1cbiAgICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgICAgICBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJ0bkRlbGV0ZVREID0gIXRoaXMuaXNEaXNwbGF5TW9kZSA/IDx0ZCAvPiA6IG51bGw7XG4gICAgdmFyIGJ0bkFkZCA9IHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdFxuICAgICAgPyB0aGlzLnJlbmRlckFkZFJvd0J1dHRvbigpXG4gICAgICA6IG51bGw7XG4gICAgdmFyIG5hdlRvcCA9IHRoaXMucXVlc3Rpb24uaXNQcm9ncmVzc1RvcFNob3dpbmdcbiAgICAgID8gdGhpcy5yZW5kZXJOYXZpZ2F0b3IoY3NzQ2xhc3NlcylcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgbmF2Qm90dG9tID0gdGhpcy5xdWVzdGlvbi5pc1Byb2dyZXNzQm90dG9tU2hvd2luZ1xuICAgICAgPyB0aGlzLnJlbmRlck5hdmlnYXRvcihjc3NDbGFzc2VzKVxuICAgICAgOiBudWxsO1xuXG4gICAgdmFyIHN0eWxlOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsKSB7XG4gICAgICBzdHlsZVtcIm92ZXJmbG93WFwiXSA9IFwic2Nyb2xsXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICB7bmF2VG9wfVxuICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZX0+e3BhbmVsc308L2Rpdj5cbiAgICAgICAge25hdkJvdHRvbX1cbiAgICAgICAge2J0bkFkZH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlck5hdmlnYXRvcihjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHJhbmdlID0gdGhpcy5xdWVzdGlvbi5pc1JhbmdlU2hvd2luZyA/IHRoaXMucmVuZGVyUmFuZ2UoKSA6IG51bGw7XG4gICAgdmFyIGJ0blByZXYgPSB0aGlzLnJlbmRyZXJQcmV2QnV0dG9uKCk7XG4gICAgdmFyIGJ0bk5leHQgPSB0aGlzLnJlbmRyZXJOZXh0QnV0dG9uKCk7XG4gICAgdmFyIGJ0bkFkZCA9IHRoaXMucmVuZGVyQWRkUm93QnV0dG9uKCk7XG4gICAgdmFyIHByb2dyZXNzQ2xhc3MgPSB0aGlzLnF1ZXN0aW9uLmlzUHJvZ3Jlc3NUb3BTaG93aW5nXG4gICAgICA/IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcm9ncmVzc1RvcFxuICAgICAgOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucHJvZ3Jlc3NCb3R0b207XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e3sgY2xlYXI6IFwiYm90aFwiIH19IGNsYXNzTmFtZT17cHJvZ3Jlc3NDbGFzc30+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucHJvZ3Jlc3NDb250YWluZXJ9PlxuICAgICAgICAgIHtidG5QcmV2fVxuICAgICAgICAgIHtyYW5nZX1cbiAgICAgICAgICB7YnRuTmV4dH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtidG5BZGR9XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucHJvZ3Jlc3NUZXh0fT5cbiAgICAgICAgICB7dGhpcy5xdWVzdGlvbi5wcm9ncmVzc1RleHR9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kcmVyUHJldkJ1dHRvbigpIHtcbiAgICB2YXIgZ2V0QnV0dG9uUHJldkNzcyA9IChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHtcbiAgICAgIHZhciBidG5DbGFzc2VzID0gcXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b25QcmV2O1xuICAgICAgaWYgKCFxdWVzdGlvbi5pc1ByZXZCdXR0b25TaG93aW5nKSB7XG4gICAgICAgIGJ0bkNsYXNzZXMgKz0gXCIgXCIgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvblByZXYgKyBcIi0tZGlzYWJsZWRcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidG5DbGFzc2VzO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiB0aXRsZT17dGhpcy5xdWVzdGlvbi5wYW5lbFByZXZUZXh0fT5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTAgMTBcIlxuICAgICAgICAgIGNsYXNzTmFtZT17Z2V0QnV0dG9uUHJldkNzcyh0aGlzLnF1ZXN0aW9uKX1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uUGFuZWxQcmV2Q2xpY2t9XG4gICAgICAgID5cbiAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIyLDIgMCw0IDUsOSAxMCw0IDgsMiA1LDUgXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVyTmV4dEJ1dHRvbigpIHtcbiAgICB2YXIgZ2V0QnV0dG9uTmV4dENzcyA9IGZ1bmN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgICAgdmFyIGJ0bkNsYXNzZXMgPSBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbk5leHQ7XG4gICAgICBpZiAoIXF1ZXN0aW9uLmlzTmV4dEJ1dHRvblNob3dpbmcpIHtcbiAgICAgICAgYnRuQ2xhc3NlcyArPSBcIiBcIiArIHF1ZXN0aW9uLmNzc0NsYXNzZXMuYnV0dG9uTmV4dCArIFwiLS1kaXNhYmxlZFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ0bkNsYXNzZXM7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHRpdGxlPXt0aGlzLnF1ZXN0aW9uLnBhbmVsTmV4dFRleHR9PlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25OZXh0Q3NzKHRoaXMucXVlc3Rpb24pfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25QYW5lbE5leHRDbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjIsMiAwLDQgNSw5IDEwLDQgOCwyIDUsNSBcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyUmFuZ2UoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBnZXRQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgIHZhciByYW5nZU1heCA9IHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudCAtIDE7XG4gICAgICByZXR1cm4gKHRoaXMucXVlc3Rpb24uY3VycmVudEluZGV4IC8gcmFuZ2VNYXgpICogMTAwICsgXCIlXCI7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnByb2dyZXNzfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnByb2dyZXNzQmFyfVxuICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiBnZXRQcm9ncmVzcygpIH19XG4gICAgICAgICAgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckFkZFJvd0J1dHRvbigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLmNhbkFkZFBhbmVsKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBjbGFzc2VzID1cbiAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b24gK1xuICAgICAgXCIgXCIgK1xuICAgICAgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbkFkZDtcblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLnJlbmRlck1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICBjbGFzc2VzICs9IFwiIFwiICsgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbkFkZCArIFwiLS1saXN0LW1vZGVcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlc31cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25QYW5lbEFkZENsaWNrfVxuICAgICAgICB2YWx1ZT17dGhpcy5xdWVzdGlvbi5wYW5lbEFkZFRleHR9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSBleHRlbmRzIFN1cnZleVBhbmVsIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uUGFuZWxSZW1vdmVDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbFJlbW92ZUNsaWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uID8gKHRoaXMucXVlc3Rpb24uc3VydmV5IGFzIFN1cnZleU1vZGVsKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzcygpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiAhIXN1cnZleSA/IHN1cnZleS5nZXRDc3MoKSA6IHt9O1xuICB9XG4gIGhhbmRsZU9uUGFuZWxSZW1vdmVDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi5yZW1vdmVQYW5lbFVJKHRoaXMuaW5kZXgpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJCb3R0b20oKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGhyID1cbiAgICAgIHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCAmJlxuICAgICAgdGhpcy5pbmRleCA8IHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudCAtIDEgPyAoXG4gICAgICAgIDxociBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5zZXBhcmF0b3J9IC8+XG4gICAgICApIDogbnVsbDtcbiAgICB2YXIgcmVtb3ZlQnV0dG9uID0gdGhpcy5yZW5kZXJCdXR0b24oKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge3JlbW92ZUJ1dHRvbn1cbiAgICAgICAge2hyfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQnV0dG9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5xdWVzdGlvbi5jYW5SZW1vdmVQYW5lbCB8fFxuICAgICAgKHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCAmJiB0aGlzLnBhbmVsLmlzQ29sbGFwc2VkKVxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHZhciBzdHlsZSA9IHsgbWFyZ2luVG9wOiBcIjVweFwiIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzc05hbWU9e1xuICAgICAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b24gK1xuICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuYnV0dG9uUmVtb3ZlXG4gICAgICAgIH1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVPblBhbmVsUmVtb3ZlQ2xpY2t9XG4gICAgICAgIHZhbHVlPXt0aGlzLnF1ZXN0aW9uLnBhbmVsUmVtb3ZlVGV4dH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicGFuZWxkeW5hbWljXCIsIHByb3BzID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25QYW5lbER5bmFtaWMsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25wYW5lbGR5bmFtaWMudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlLFxuICBSZWFjdFN1cnZleUVsZW1lbnRcbn0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0gfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblJhZGlvZ3JvdXAgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBjbGVhckJ1dHRvbiA9IG51bGw7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uY2FuU2hvd0NsZWFyQnV0dG9uKSB7XG4gICAgICBjbGVhckJ1dHRvbiA9IChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuY2xlYXJCdXR0b259XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnF1ZXN0aW9uLmNsZWFyVmFsdWUoKX1cbiAgICAgICAgICAgIHZhbHVlPXt0aGlzLnF1ZXN0aW9uLmNsZWFyQnV0dG9uQ2FwdGlvbn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZmllbGRzZXQgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICA8bGVnZW5kIGFyaWEtbGFiZWw9e3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSAvPlxuICAgICAgICB7dGhpcy5xdWVzdGlvbi5oYXNDb2x1bW5zXG4gICAgICAgICAgPyB0aGlzLmdldENvbHVtbnMoY3NzQ2xhc3NlcylcbiAgICAgICAgICA6IHRoaXMuZ2V0SXRlbXMoY3NzQ2xhc3Nlcyl9XG4gICAgICAgIHtjbGVhckJ1dHRvbn1cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1ucyhjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFN0YXRlVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jb2x1bW5zLm1hcCgoY29sdW1uOiBhbnksIGNpOiBudW1iZXIpID0+IHtcbiAgICAgIHZhciBpdGVtcyA9IGNvbHVtbi5tYXAoKGl0ZW06IGFueSwgaWk6IG51bWJlcikgPT5cbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtKGl0ZW0sIHZhbHVlLCBjc3NDbGFzc2VzLCAnJyArIGNpICsgaWkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBrZXk9e1wiY29sdW1uXCIgKyBjaX0gY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmdldENvbHVtbkNsYXNzKCl9PlxuICAgICAgICAgIHtpdGVtc31cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJdGVtcyhjc3NDbGFzc2VzOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFN0YXRlVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpXTtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGl0ZW0sIHZhbHVlLCBjc3NDbGFzc2VzLCAnJyArIGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGV4dFN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgbWFyZ2luTGVmdDogXCIzcHhcIiwgZGlzcGxheTogXCJpbmxpbmVcIiwgcG9zaXRpb246IFwic3RhdGljXCIgfTtcbiAgfVxuICBwcml2YXRlIHJlbmRlckl0ZW0oXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHZhbHVlOiBhbnksXG4gICAgY3NzQ2xhc3NlczogYW55LFxuICAgIGluZGV4OiBzdHJpbmdcbiAgKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBrZXkgPSBcIml0ZW1cIiArIGluZGV4O1xuICAgIHJldHVybiAoXG4gICAgICA8U3VydmV5UXVlc3Rpb25SYWRpb0l0ZW1cbiAgICAgICAga2V5PXtrZXl9XG4gICAgICAgIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgIGl0ZW09e2l0ZW19XG4gICAgICAgIHRleHRTdHlsZT17dGhpcy50ZXh0U3R5bGV9XG4gICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgaXNDaGVja2VkPXt2YWx1ZSA9PT0gaXRlbS52YWx1ZX1cbiAgICAgICAgaXNEaXNhYmxlZD17dGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFN0YXRlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gIXRoaXMucXVlc3Rpb24uaXNFbXB0eSgpID8gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFZhbHVlIDogXCJcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25SYWRpb0l0ZW0gZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnByb3BzLml0ZW07XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0U3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50ZXh0U3R5bGU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmluZGV4O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNDaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmlzQ2hlY2tlZDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNEaXNhYmxlZDtcbiAgfVxuICBwdWJsaWMgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXREYXRhLmlzTmVlZFJlbmRlciB8fFxuICAgICAgISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlciB8fFxuICAgICAgISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC53aWRnZXRKc29uLnJlbmRlclxuICAgICk7XG4gIH1cbiAgaGFuZGxlT25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSA9IHRoaXMuaXRlbS52YWx1ZTtcbiAgfVxuICBnZXRJdGVtQ2xhc3MoaXNDaGVja2VkOiBib29sZWFuLCBpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdmFyIGl0ZW1DbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5pdGVtO1xuICAgIHZhciBhbGxvd0hvdmVyID0gIWlzRGlzYWJsZWQgJiYgIWlzQ2hlY2tlZDtcbiAgICBpZiAoaXNEaXNhYmxlZCkgaXRlbUNsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1EaXNhYmxlZDtcbiAgICBpZiAoaXNDaGVja2VkKSBpdGVtQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQ7XG4gICAgaWYgKGFsbG93SG92ZXIpIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXI7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLmhhc0NvbHVtbnMpIHtcbiAgICAgIGl0ZW1DbGFzcyArPVxuICAgICAgICB0aGlzLnF1ZXN0aW9uLmNvbENvdW50ID09PSAwXG4gICAgICAgICAgPyBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSW5saW5lXG4gICAgICAgICAgOiBcIiBzdi1xLWNvbC1cIiArIHRoaXMucXVlc3Rpb24uY29sQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuaXRlbSB8fCAhdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIG90aGVySXRlbSA9XG4gICAgICB0aGlzLmlzQ2hlY2tlZCAmJiB0aGlzLml0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtLnZhbHVlXG4gICAgICAgID8gdGhpcy5yZW5kZXJPdGhlcih0aGlzLmNzc0NsYXNzZXMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIHZhciBpZCA9IHRoaXMucXVlc3Rpb24uaW5wdXRJZCArIFwiX1wiICsgdGhpcy5pbmRleDtcbiAgICB2YXIgaXRlbVRleHQgPSB0aGlzLnJlbmRlckxvY1N0cmluZyh0aGlzLml0ZW0ubG9jVGV4dCwgdGhpcy50ZXh0U3R5bGUpO1xuXG4gICAgdmFyIGl0ZW1DbGFzcyA9IHRoaXMuZ2V0SXRlbUNsYXNzKHRoaXMuaXNDaGVja2VkLCB0aGlzLmlzRGlzYWJsZWQpO1xuICAgIHZhciBsYWJlbENsYXNzID0gdGhpcy5xdWVzdGlvbi5nZXRMYWJlbENsYXNzKHRoaXMuaXNDaGVja2VkKTtcbiAgICB2YXIgbG9jVGV4dDogYW55ID0gdGhpcy5pdGVtLmxvY1RleHQ7XG4gICAgdmFyIGNvbnRyb2xMYWJlbENsYXNzID0gdGhpcy5xdWVzdGlvbi5nZXRDb250cm9sTGFiZWxDbGFzcyh0aGlzLmlzQ2hlY2tlZCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2l0ZW1DbGFzc30+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2xhYmVsQ2xhc3N9PlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaXRlbUNvbnRyb2x9XG4gICAgICAgICAgICBpZD17aWR9XG4gICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgbmFtZT17dGhpcy5xdWVzdGlvbi5uYW1lICsgXCJfXCIgKyB0aGlzLnF1ZXN0aW9uLmlkfVxuICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5pc0NoZWNrZWR9XG4gICAgICAgICAgICB2YWx1ZT17dGhpcy5pdGVtLnZhbHVlfVxuICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZSB8fCAhdGhpcy5pdGVtLmlzRW5hYmxlZH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfVxuICAgICAgICAgICAgYXJpYS1yZXF1aXJlZD17dGhpcy5xdWVzdGlvbi5pc1JlcXVpcmVkfVxuICAgICAgICAgICAgYXJpYS1sYWJlbD17bG9jVGV4dC5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3RoaXMuY3NzQ2xhc3Nlcy5tYXRlcmlhbERlY29yYXRvcn0+XG4gICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLml0ZW1EZWNvcmF0b3J9XG4gICAgICAgICAgICAgIHZpZXdCb3g9XCItMTIgLTEyIDI0IDI0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGNpcmNsZSByPVwiNlwiIGN4PVwiMFwiIGN5PVwiMFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY2hlY2tcIiAvPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NvbnRyb2xMYWJlbENsYXNzfVxuICAgICAgICAgICAgdGl0bGU9e2xvY1RleHRbXCJrb1JlbmRlcmVkSHRtbFwiXX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7aXRlbVRleHR9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICB7b3RoZXJJdGVtfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgPFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBvdGhlckNzcz17Y3NzQ2xhc3Nlcy5vdGhlcn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvblJhZGlvZ3JvdXAsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25yYWRpb2dyb3VwLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmNvbW1lbnRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblJhdGluZyBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvblJhdGluZ01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25SYXRpbmdNb2RlbDtcbiAgfVxuICBoYW5kbGVPbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMucXVlc3Rpb24udmFsdWUgfSk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgbWluVGV4dCA9IHRoaXMucXVlc3Rpb24ubWluUmF0ZURlc2NyaXB0aW9uXG4gICAgICA/IHRoaXMucmVuZGVyTG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uKVxuICAgICAgOiBudWxsO1xuICAgIHZhciBtYXhUZXh0ID0gdGhpcy5xdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb25cbiAgICAgID8gdGhpcy5yZW5kZXJMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24pXG4gICAgICA6IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbWluVGV4dFZhbHVlID0gaSA9PSAwID8gbWluVGV4dCA6IG51bGw7XG4gICAgICB2YXIgbWF4VGV4dFZhbHVlID1cbiAgICAgICAgaSA9PSB0aGlzLnF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEgPyBtYXhUZXh0IDogbnVsbDtcbiAgICAgIHZhbHVlcy5wdXNoKFxuICAgICAgICB0aGlzLnJlbmRlckl0ZW0oXG4gICAgICAgICAgXCJ2YWx1ZVwiICsgaSxcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzW2ldLFxuICAgICAgICAgIG1pblRleHRWYWx1ZSxcbiAgICAgICAgICBtYXhUZXh0VmFsdWUsXG4gICAgICAgICAgY3NzQ2xhc3Nlc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgY29tbWVudCA9IHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgPyB0aGlzLnJlbmRlck90aGVyKGNzc0NsYXNzZXMpIDogbnVsbDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgIHt2YWx1ZXN9XG4gICAgICAgIHtjb21tZW50fVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVySXRlbShcbiAgICBrZXk6IHN0cmluZyxcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgbWluVGV4dDogSlNYLkVsZW1lbnQsXG4gICAgbWF4VGV4dDogSlNYLkVsZW1lbnQsXG4gICAgY3NzQ2xhc3NlczogYW55XG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlO1xuICAgIHZhciBjbGFzc05hbWUgPSBjc3NDbGFzc2VzLml0ZW07XG4gICAgaWYgKGlzQ2hlY2tlZCkgY2xhc3NOYW1lICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5zZWxlY3RlZDtcbiAgICBpZiAodGhpcy5pc0Rpc3BsYXlNb2RlKSBjbGFzc05hbWUgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmRpc2FibGVkO1xuXG4gICAgdmFyIGl0ZW1UZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcoaXRlbS5sb2NUZXh0KTtcbiAgICB2YXIgbWluVGV4dEJsb2NrID0gISFtaW5UZXh0ID8gKFxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLm1pblRleHR9PnttaW5UZXh0fTwvc3Bhbj5cbiAgICApIDogbnVsbDtcbiAgICB2YXIgbWF4VGV4dEJsb2NrID0gISFtYXhUZXh0ID8gKFxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLm1heFRleHR9PnttYXhUZXh0fTwvc3Bhbj5cbiAgICApIDogbnVsbDtcbiAgICByZXR1cm4gKFxuICAgICAgPGxhYmVsIGtleT17a2V5fSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgY2xhc3NOYW1lPVwic3YtdmlzdWFsbHloaWRkZW5cIlxuICAgICAgICAgIG5hbWU9e3RoaXMucXVlc3Rpb24ubmFtZX1cbiAgICAgICAgICB2YWx1ZT17aXRlbS52YWx1ZX1cbiAgICAgICAgICBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICAgIGNoZWNrZWQ9e3RoaXMucXVlc3Rpb24udmFsdWUgPT0gaXRlbS52YWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgICBhcmlhLXJlcXVpcmVkPXt0aGlzLnF1ZXN0aW9uLmlzUmVxdWlyZWR9XG4gICAgICAgICAgYXJpYS1sYWJlbD17aXRlbS5sb2NUZXh0LnRleHR9XG4gICAgICAgIC8+XG4gICAgICAgIHttaW5UZXh0QmxvY2t9XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5pdGVtVGV4dH0+e2l0ZW1UZXh0fTwvc3Bhbj5cbiAgICAgICAge21heFRleHRCbG9ja31cbiAgICAgIDwvbGFiZWw+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5vdGhlcn0+XG4gICAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtXG4gICAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgICAgY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc31cbiAgICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIHByb3BzID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25SYXRpbmcsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25yYXRpbmcudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvblVuY29udHJvbGxlZEVsZW1lbnQgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25UZXh0IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25VbmNvbnRyb2xsZWRFbGVtZW50PFF1ZXN0aW9uVGV4dE1vZGVsPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBvbkJsdXIgPSAhdGhpcy5xdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZVxuICAgICAgPyB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudFxuICAgICAgOiBudWxsO1xuICAgIHZhciBvbklucHV0ID0gdGhpcy5xdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZVxuICAgICAgPyB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudFxuICAgICAgOiBudWxsO1xuICAgIHJldHVybiAoXG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9XG4gICAgICAgIHR5cGU9e3RoaXMucXVlc3Rpb24uaW5wdXRUeXBlfVxuICAgICAgICByZWY9e2lucHV0ID0+ICh0aGlzLmNvbnRyb2wgPSBpbnB1dCl9XG4gICAgICAgIG1heExlbmd0aD17dGhpcy5xdWVzdGlvbi5nZXRNYXhMZW5ndGgoKX1cbiAgICAgICAgc2l6ZT17dGhpcy5xdWVzdGlvbi5zaXplfVxuICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy5xdWVzdGlvbi5wbGFjZUhvbGRlcn1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uSW5wdXQ9e29uSW5wdXR9XG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgcHJvcHMgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvblRleHQsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0LnRzeCIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWFpbi5zY3NzXG4vLyBtb2R1bGUgaWQgPSA3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21vZGVybi5zY3NzXG4vLyBtb2R1bGUgaWQgPSA3N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlLCBJU3VydmV5RGF0YSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuXG4vKipcbiAqIFRoZSBjYWxjdWxhdGVkIHZhbHVlIGlzIGEgd2F5IHRvIGRlZmluZSB0aGUgdmFyaWFibGUgaW4gU3VydmV5IENyZWF0b3IuXG4gKiBJdCBoYXMgdHdvIG1haW4gcHJvcGVydGllczogbmFtZSBhbmQgZXhwcmVzc2lvbi4gQmFzZWQgb24gZXhwcmVzc2lvbiB0aGUgdmFsdWUgcmVhZC1vbmx5IHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZC5cbiAqIFRoZSBuYW1lIHByb3BlcnR5IHNob3VsZCBiZSB1bmlxdWUgdGhvdWdoIGFsbCBjYWxjdWFsdGVkIHZhbHVlcy5cbiAqIEl0IHVzZXMgc3VydmV5LmdldFZhcmlhYmxlL3NlcnV2ZXkuc2V0VmFyaWFibGUgZnVuY3Rpb25zIHRvIGdldC9zZXQgaXRzIHZhbHVlLiBUaGUgY2xhc3MgZG8gbm90IHN0b3JlIGl0cyB2YWx1ZSBpbnRlcm5hbGx5LlxuICogWW91IG1heSBzZXQgaW5jbHVkZUludG9SZXN1bHQgcHJvcGVydHkgdG8gdHJ1ZSB0byBzdG9yZSB0aGlzIGNhbGN1bGF0ZWQgdmFsdWUgaW50byBzdXJ2ZXkgcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgQ2FsY3VsYXRlZFZhbHVlIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgZGF0YTogSVN1cnZleURhdGE7XG4gIHByaXZhdGUgZXhwcmVzc2lvbklzUnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGV4cHJlc3Npb25SdW5uZXI6IEV4cHJlc3Npb25SdW5uZXI7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IG51bGwsIGV4cHJlc3Npb246IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICghIW5hbWUpIHtcbiAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGlmICghIWV4cHJlc3Npb24pIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRPd25lcihkYXRhOiBJU3VydmV5RGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5yZXJ1bkV4cHJlc3Npb24oKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNhbGN1bGF0ZWR2YWx1ZVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBuYW1lLiBJdCBzaG91bGQgYmUgbm9uIGVtcHR5IGFuZCB1bmlxdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaW5jbHVkZSB0aGUgbm9uLWVtcHR5IGNhbGN1bGF0ZWQgdmFsdWUgaW50byBzdXJ2ZXkgcmVzdWx0LCBzdXJ2ZXkuZGF0YSBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5jbHVkZUludG9SZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluY2x1ZGVJbnRvUmVzdWx0XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVJbnRvUmVzdWx0KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluY2x1ZGVJbnRvUmVzdWx0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBFeHByZXNzaW9uIHRoYXQgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhbHVlLiBZb3UgbWF5IHVzZSBzdGFuZGFyZCBvcGVyYXRvcnMgbGlrZSArLCAtLCAqIGFuZCAvLCBzcXVhcmVzICgpLiBIZXJlIGlzIHRoZSBleGFtcGxlIG9mIGFjY2Vzc2luZyB0aGUgcXVlc3Rpb24gdmFsdWUge3F1ZXN0aW9ubmFtZX0uXG4gICAqIDxici8+RXhhbXBsZTogXCIoe3F1YW50aXR5fSAqIHtwcmljZX0pICogKDEwMCAtIHtkaXNjb3VudH0pIC8gMTAwXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgICB0aGlzLnJlcnVuRXhwcmVzc2lvbigpO1xuICB9XG4gIHB1YmxpYyBsb2NDYWxjdWxhdGlvbigpIHtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB1bmxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBydW5FeHByZXNzaW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLmNhblJ1bkV4cHJlc3Npb24pIHJldHVybjtcbiAgICB0aGlzLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gbmV3VmFsdWUgPT4ge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy51bmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0VmFyaWFibGUodGhpcy5uYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGF0YS5zZXRWYXJpYWJsZSh0aGlzLm5hbWUsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY2FuUnVuRXhwcmVzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLmRhdGEgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmXG4gICAgICAhIXRoaXMuZXhwcmVzc2lvbiAmJlxuICAgICAgIXRoaXMuZXhwcmVzc2lvbklzUnVubmluZyAmJlxuICAgICAgISF0aGlzLm5hbWVcbiAgICApO1xuICB9XG4gIHByaXZhdGUgcmVydW5FeHByZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy5jYW5SdW5FeHByZXNzaW9uKSByZXR1cm47XG4gICAgdGhpcy5ydW5FeHByZXNzaW9uKFxuICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCksXG4gICAgICB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY2FsY3VsYXRlZHZhbHVlXCIsXG4gIFtcIiFuYW1lXCIsIFwiZXhwcmVzc2lvbjpleHByZXNzaW9uXCIsIFwiaW5jbHVkZUludG9SZXN1bHQ6Ym9vbGVhblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBDYWxjdWxhdGVkVmFsdWUoKTtcbiAgfSxcbiAgXCJiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY2FsY3VsYXRlZFZhbHVlLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvbkl0ZW0gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBwdWJsaWMgbG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyO1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhwcmVzc2lvbml0ZW1cIjtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogYW55LCBwcm9wZXJ0aWVzOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBleHByZXNzaW9uIHByb3BlcnR5LiBJZiB0aGlzIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGVuIHN1cnZleSB3aWxsIHVzZSBodG1sIHByb3BlcnR5IHRvIHNob3cgb24gY29tcGxldGUgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBjb250YWlucyBleHByZXNzaW9uIGFuZCBodG1sIHByb3BldGllcy4gSXQgdXNlcyBpbiBzdXJ2ZXkuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uIGFycmF5LlxuICogSWYgdGhlIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlIHRoZW4gaHRtbCBvZiB0aGlzIGl0ZW0gdXNlcyBpbnN0ZWFkIG9mIHN1cnZleS5jb21wbGV0ZWRIdG1sIHByb3BlcnR5XG4gKiBAc2VlIFN1cnZleU1vZGVsLmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblxuICogQHNlZSBTdXJ2ZXlNb2RlbC5jb21wbGV0ZWRIdG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBIdG1sQ29uZGl0aW9uSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCwgaHRtbDogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKGV4cHJlc3Npb24pO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJodG1sY29uZGl0aW9uaXRlbVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCB0aGF0IHNob3dzIG9uIGNvbXBsZXRlZCAoJ1RoYW5rIHlvdScpIHBhZ2UuIFRoZSBleHByZXNzaW9uIHNob3VsZCByZXR1cm4gdHJ1ZVxuICAgKiBAc2VlIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgY29udGFpbnMgZXhwcmVzc2lvbiBhbmQgdXJsIHByb3BldGllcy4gSXQgdXNlcyBpbiBzdXJ2ZXkubmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uIGFycmF5LlxuICogSWYgdGhlIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlIHRoZW4gdXJsIG9mIHRoaXMgaXRlbSB1c2VzIGluc3RlYWQgb2Ygc3VydmV5Lm5hdmlnYXRlVG9VcmwgcHJvcGVydHlcbiAqIEBzZWUgU3VydmV5TW9kZWwubmF2aWdhdGVUb1VybFxuICovXG5leHBvcnQgY2xhc3MgVXJsQ29uZGl0aW9uSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCwgdXJsOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoZXhwcmVzc2lvbik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInVybFwiLCB0aGlzKTtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInVybGNvbmRpdGlvbml0ZW1cIjtcbiAgfVxuICAvKipcbiAgICogVGhlIHVybCB0aGF0IHN1cnZleSBuYXZpZ2F0ZXMgdG8gb24gY29tcGxldGluZyB0aGUgc3VydmV5LiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgcmV0dXJuIHRydWVcbiAgICogQHNlZSBleHByZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInVybFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ1cmxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NVcmwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidXJsXCIpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZXhwcmVzc2lvbml0ZW1cIixcbiAgW1wiZXhwcmVzc2lvbjpjb25kaXRpb25cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkl0ZW0oKTtcbiAgfSxcbiAgXCJiYXNlXCJcbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaHRtbGNvbmRpdGlvbml0ZW1cIixcbiAgW3sgbmFtZTogXCJodG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0h0bWxcIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBIdG1sQ29uZGl0aW9uSXRlbSgpO1xuICB9LFxuICBcImV4cHJlc3Npb25pdGVtXCJcbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidXJsY29uZGl0aW9uaXRlbVwiLFxuICBbeyBuYW1lOiBcInVybDpzdHJpbmdcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1VybFwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFVybENvbmRpdGlvbkl0ZW0oKTtcbiAgfSxcbiAgXCJleHByZXNzaW9uaXRlbVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V4cHJlc3Npb25JdGVtcy50cyIsIi8vIHRzbGludDpkaXNhYmxlOm9ubHktYXJyb3ctZnVuY3Rpb25zXG4vLyB0c2xpbnQ6ZGlzYWJsZTpvYmplY3QtbGl0ZXJhbC1zaG9ydGhhbmRcbi8vIHRzbGludDpkaXNhYmxlOnRyYWlsaW5nLWNvbW1hXG4vLyB0c2xpbnQ6ZGlzYWJsZTpvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXNcbi8vIHRzbGludDpkaXNhYmxlOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cbi8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxuLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc2VjdXRpdmUtYmxhbmstbGluZXNcbi8vIHRzbGludDpkaXNhYmxlOmFsaWduXG5cblxuLy8gR2VuZXJhdGVkIGJ5IFBFRy5qcyB2LiAwLjEwLjAgKHRzLXBlZ2pzIHBsdWdpbiB2LiAwLjIuNSApXG4vL1xuLy8gaHR0cHM6Ly9wZWdqcy5vcmcvICAgaHR0cHM6Ly9naXRodWIuY29tL21ldGFkZXZwcm8vdHMtcGVnanNcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7XG5Db25zdCxcbkJpbmFyeU9wZXJhbmQsXG5WYXJpYWJsZSxcbk9wZXJhbmQsXG5VbmFyeU9wZXJhbmQsXG5GdW5jdGlvbk9wZXJhbmQsXG5BcnJheU9wZXJhbmRcbn0gZnJvbSBcIi4vZXhwcmVzc2lvbnNcIjtcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVQb3NpdGlvbiB7XG4gIG9mZnNldDogbnVtYmVyO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbHVtbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlUmFuZ2Uge1xuICBzdGFydDogSUZpbGVQb3NpdGlvbjtcbiAgZW5kOiBJRmlsZVBvc2l0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaXRlcmFsRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImxpdGVyYWxcIjtcbiAgdGV4dDogc3RyaW5nO1xuICBpZ25vcmVDYXNlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDbGFzc1BhcnRzIGV4dGVuZHMgQXJyYXk8c3RyaW5nIHwgSUNsYXNzUGFydHM+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNsYXNzRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImNsYXNzXCI7XG4gIHBhcnRzOiBJQ2xhc3NQYXJ0cztcbiAgaW52ZXJ0ZWQ6IGJvb2xlYW47XG4gIGlnbm9yZUNhc2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFueUV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJhbnlcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW5kRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImVuZFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPdGhlckV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJvdGhlclwiO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBFeHBlY3RhdGlvbiA9IElMaXRlcmFsRXhwZWN0YXRpb24gfCBJQ2xhc3NFeHBlY3RhdGlvbiB8IElBbnlFeHBlY3RhdGlvbiB8IElFbmRFeHBlY3RhdGlvbiB8IElPdGhlckV4cGVjdGF0aW9uO1xuXG5leHBvcnQgY2xhc3MgU3ludGF4RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRNZXNzYWdlKGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdLCBmb3VuZDogc3RyaW5nIHwgbnVsbCkge1xuICAgIGZ1bmN0aW9uIGhleChjaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpdGVyYWxFc2NhcGUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIilcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csICBcIlxcXFxcXFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXDAvZywgXCJcXFxcMFwiKVxuICAgICAgICAucmVwbGFjZSgvXFx0L2csIFwiXFxcXHRcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKVxuICAgICAgICAucmVwbGFjZSgvW1xceDAwLVxceDBGXS9nLCAgICAgICAgICAgIChjaCkgPT4gXCJcXFxceDBcIiArIGhleChjaCkgKVxuICAgICAgICAucmVwbGFjZSgvW1xceDEwLVxceDFGXFx4N0YtXFx4OUZdL2csIChjaCkgPT4gXCJcXFxceFwiICArIGhleChjaCkgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGFzc0VzY2FwZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHNcbiAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxuICAgICAgICAucmVwbGFjZSgvXFxdL2csIFwiXFxcXF1cIilcbiAgICAgICAgLnJlcGxhY2UoL1xcXi9nLCBcIlxcXFxeXCIpXG4gICAgICAgIC5yZXBsYWNlKC8tL2csICBcIlxcXFwtXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXDAvZywgXCJcXFxcMFwiKVxuICAgICAgICAucmVwbGFjZSgvXFx0L2csIFwiXFxcXHRcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKVxuICAgICAgICAucmVwbGFjZSgvW1xceDAwLVxceDBGXS9nLCAgICAgICAgICAgIChjaCkgPT4gXCJcXFxceDBcIiArIGhleChjaCkgKVxuICAgICAgICAucmVwbGFjZSgvW1xceDEwLVxceDFGXFx4N0YtXFx4OUZdL2csIChjaCkgPT4gXCJcXFxceFwiICArIGhleChjaCkgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjcmliZUV4cGVjdGF0aW9uKGV4cGVjdGF0aW9uOiBFeHBlY3RhdGlvbikge1xuICAgICAgc3dpdGNoIChleHBlY3RhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgbGl0ZXJhbEVzY2FwZShleHBlY3RhdGlvbi50ZXh0KSArIFwiXFxcIlwiO1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICBjb25zdCBlc2NhcGVkUGFydHMgPSBleHBlY3RhdGlvbi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnQpXG4gICAgICAgICAgICAgID8gY2xhc3NFc2NhcGUocGFydFswXSBhcyBzdHJpbmcpICsgXCItXCIgKyBjbGFzc0VzY2FwZShwYXJ0WzFdIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgOiBjbGFzc0VzY2FwZShwYXJ0KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBcIltcIiArIChleHBlY3RhdGlvbi5pbnZlcnRlZCA/IFwiXlwiIDogXCJcIikgKyBlc2NhcGVkUGFydHMgKyBcIl1cIjtcbiAgICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICAgIHJldHVybiBcImFueSBjaGFyYWN0ZXJcIjtcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBcImVuZCBvZiBpbnB1dFwiO1xuICAgICAgICBjYXNlIFwib3RoZXJcIjpcbiAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24uZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFeHBlY3RlZChleHBlY3RlZDE6IEV4cGVjdGF0aW9uW10pIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9ucyA9IGV4cGVjdGVkMS5tYXAoZGVzY3JpYmVFeHBlY3RhdGlvbik7XG4gICAgICBsZXQgaTtcbiAgICAgIGxldCBqO1xuXG4gICAgICBkZXNjcmlwdGlvbnMuc29ydCgpO1xuXG4gICAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChpID0gMSwgaiA9IDE7IGkgPCBkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2kgLSAxXSAhPT0gZGVzY3JpcHRpb25zW2ldKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbnNbal0gPSBkZXNjcmlwdGlvbnNbaV07XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlc2NyaXB0aW9ucy5sZW5ndGggPSBqO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF07XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF0gKyBcIiBvciBcIiArIGRlc2NyaXB0aW9uc1sxXTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgKyBcIiwgb3IgXCJcbiAgICAgICAgICAgICsgZGVzY3JpcHRpb25zW2Rlc2NyaXB0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjcmliZUZvdW5kKGZvdW5kMTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgcmV0dXJuIGZvdW5kMSA/IFwiXFxcIlwiICsgbGl0ZXJhbEVzY2FwZShmb3VuZDEpICsgXCJcXFwiXCIgOiBcImVuZCBvZiBpbnB1dFwiO1xuICAgIH1cblxuICAgIHJldHVybiBcIkV4cGVjdGVkIFwiICsgZGVzY3JpYmVFeHBlY3RlZChleHBlY3RlZCkgKyBcIiBidXQgXCIgKyBkZXNjcmliZUZvdW5kKGZvdW5kKSArIFwiIGZvdW5kLlwiO1xuICB9XG5cbiAgcHVibGljIG1lc3NhZ2U6IHN0cmluZztcbiAgcHVibGljIGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdO1xuICBwdWJsaWMgZm91bmQ6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBsb2NhdGlvbjogSUZpbGVSYW5nZTtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdLCBmb3VuZDogc3RyaW5nIHwgbnVsbCwgbG9jYXRpb246IElGaWxlUmFuZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkO1xuICAgIHRoaXMuZm91bmQgPSBmb3VuZDtcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgdGhpcy5uYW1lID0gXCJTeW50YXhFcnJvclwiO1xuXG4gICAgaWYgKHR5cGVvZiAoRXJyb3IgYXMgYW55KS5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAoRXJyb3IgYXMgYW55KS5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTeW50YXhFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhY2hlZCB7XG4gIG5leHRQb3M6IG51bWJlcjtcbiAgcmVzdWx0OiBhbnk7XG59XG5cbmZ1bmN0aW9uIHBlZyRwYXJzZShpbnB1dDogc3RyaW5nLCBvcHRpb25zPzogSVBhcnNlT3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucyA6IHt9O1xuXG4gIGNvbnN0IHBlZyRGQUlMRUQ6IGFueSA9IHt9O1xuXG4gIGNvbnN0IHBlZyRzdGFydFJ1bGVGdW5jdGlvbnM6IHtbaWQ6IHN0cmluZ106IGFueX0gPSB7IEV4cHJlc3Npb246IHBlZyRwYXJzZUV4cHJlc3Npb24gfTtcbiAgbGV0IHBlZyRzdGFydFJ1bGVGdW5jdGlvbjogKCkgPT4gYW55ID0gcGVnJHBhcnNlRXhwcmVzc2lvbjtcblxuICBjb25zdCBwZWckYzAgPSBmdW5jdGlvbihoZWFkOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQsIHRhaWwsIHRydWUpO1xuICAgIH07XG4gIGNvbnN0IHBlZyRjMSA9IFwifHxcIjtcbiAgY29uc3QgcGVnJGMyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInx8XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMzID0gXCJvclwiO1xuICBjb25zdCBwZWckYzQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwib3JcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm9yXCI7IH07XG4gIGNvbnN0IHBlZyRjNiA9IFwiJiZcIjtcbiAgY29uc3QgcGVnJGM3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiYmXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4ID0gXCJhbmRcIjtcbiAgY29uc3QgcGVnJGM5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImFuZFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxMCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImFuZFwiOyB9O1xuICBjb25zdCBwZWckYzExID0gZnVuY3Rpb24oaGVhZDogYW55LCB0YWlsOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIGJ1aWxkQmluYXJ5T3BlcmFuZChoZWFkLCB0YWlsKTtcbiAgICB9O1xuICBjb25zdCBwZWckYzEyID0gXCI8PVwiO1xuICBjb25zdCBwZWckYzEzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjw9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNCA9IFwibGVzc29yZXF1YWxcIjtcbiAgY29uc3QgcGVnJGMxNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJsZXNzb3JlcXVhbFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImxlc3NvcmVxdWFsXCI7IH07XG4gIGNvbnN0IHBlZyRjMTcgPSBcIj49XCI7XG4gIGNvbnN0IHBlZyRjMTggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE5ID0gXCJncmVhdGVyb3JlcXVhbFwiO1xuICBjb25zdCBwZWckYzIwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImdyZWF0ZXJvcmVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzIxID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZ3JlYXRlcm9yZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMyMiA9IFwiPVwiO1xuICBjb25zdCBwZWckYzIzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzI0ID0gXCJlcXVhbFwiO1xuICBjb25zdCBwZWckYzI1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzI2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMyNyA9IFwiIT1cIjtcbiAgY29uc3QgcGVnJGMyOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIhPVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMjkgPSBcIm5vdGVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMzAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90ZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMzEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJub3RlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzMyID0gXCI8XCI7XG4gIGNvbnN0IHBlZyRjMzMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzQgPSBcImxlc3NcIjtcbiAgY29uc3QgcGVnJGMzNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJsZXNzXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzM2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibGVzc1wiOyB9O1xuICBjb25zdCBwZWckYzM3ID0gXCI+XCI7XG4gIGNvbnN0IHBlZyRjMzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzkgPSBcImdyZWF0ZXJcIjtcbiAgY29uc3QgcGVnJGM0MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJncmVhdGVyXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzQxID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZ3JlYXRlclwiOyB9O1xuICBjb25zdCBwZWckYzQyID0gXCIrXCI7XG4gIGNvbnN0IHBlZyRjNDMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiK1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNDQgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJwbHVzXCI7ICB9O1xuICBjb25zdCBwZWckYzQ1ID0gXCItXCI7XG4gIGNvbnN0IHBlZyRjNDYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNDcgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJtaW51c1wiOyB9O1xuICBjb25zdCBwZWckYzQ4ID0gXCIqXCI7XG4gIGNvbnN0IHBlZyRjNDkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNTAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJtdWxcIjsgfTtcbiAgY29uc3QgcGVnJGM1MSA9IFwiL1wiO1xuICBjb25zdCBwZWckYzUyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIi9cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzUzID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZGl2XCI7IH07XG4gIGNvbnN0IHBlZyRjNTQgPSBcIiVcIjtcbiAgY29uc3QgcGVnJGM1NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIlXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1NiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm1vZFwiOyB9O1xuICBjb25zdCBwZWckYzU3ID0gXCJeXCI7XG4gIGNvbnN0IHBlZyRjNTggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNTkgPSBcInBvd2VyXCI7XG4gIGNvbnN0IHBlZyRjNjAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwicG93ZXJcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNjEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJwb3dlclwiOyB9O1xuICBjb25zdCBwZWckYzYyID0gXCIqPVwiO1xuICBjb25zdCBwZWckYzYzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIio9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM2NCA9IFwiY29udGFpbnNcIjtcbiAgY29uc3QgcGVnJGM2NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJjb250YWluc1wiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM2NiA9IFwiY29udGFpblwiO1xuICBjb25zdCBwZWckYzY3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImNvbnRhaW5cIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNjggPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJjb250YWluc1wiOyB9O1xuICBjb25zdCBwZWckYzY5ID0gXCJub3Rjb250YWluc1wiO1xuICBjb25zdCBwZWckYzcwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm5vdGNvbnRhaW5zXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzcxID0gXCJub3Rjb250YWluXCI7XG4gIGNvbnN0IHBlZyRjNzIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90Y29udGFpblwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM3MyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm5vdGNvbnRhaW5zXCI7IH07XG4gIGNvbnN0IHBlZyRjNzQgPSBcImFueW9mXCI7XG4gIGNvbnN0IHBlZyRjNzUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiYW55b2ZcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzYgPSBmdW5jdGlvbigpOiBhbnkge3JldHVybiBcImFueW9mXCI7IH07XG4gIGNvbnN0IHBlZyRjNzcgPSBcImFsbG9mXCI7XG4gIGNvbnN0IHBlZyRjNzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiYWxsb2ZcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzkgPSBmdW5jdGlvbigpOiBhbnkge3JldHVybiBcImFsbG9mXCI7IH07XG4gIGNvbnN0IHBlZyRjODAgPSBcIihcIjtcbiAgY29uc3QgcGVnJGM4MSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIoXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4MiA9IFwiKVwiO1xuICBjb25zdCBwZWckYzgzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIilcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzg0ID0gZnVuY3Rpb24oZXhwcjogYW55KTogYW55IHsgcmV0dXJuIGV4cHI7IH07XG4gIGNvbnN0IHBlZyRjODUgPSBmdW5jdGlvbihuYW1lOiBhbnksIHBhcmFtczogYW55KTogYW55IHsgcmV0dXJuIG5ldyBGdW5jdGlvbk9wZXJhbmQobmFtZSwgcGFyYW1zKTsgfTtcbiAgY29uc3QgcGVnJGM4NiA9IFwiIVwiO1xuICBjb25zdCBwZWckYzg3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiFcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzg4ID0gXCJuZWdhdGVcIjtcbiAgY29uc3QgcGVnJGM4OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJuZWdhdGVcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjOTAgPSBmdW5jdGlvbihleHByOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IFVuYXJ5T3BlcmFuZChleHByLCBcIm5lZ2F0ZVwiKTsgfTtcbiAgY29uc3QgcGVnJGM5MSA9IGZ1bmN0aW9uKGV4cHI6IGFueSwgb3A6IGFueSk6IGFueSB7IHJldHVybiBuZXcgVW5hcnlPcGVyYW5kKGV4cHIsIG9wKTsgfTtcbiAgY29uc3QgcGVnJGM5MiA9IFwiZW1wdHlcIjtcbiAgY29uc3QgcGVnJGM5MyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJlbXB0eVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM5NCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImVtcHR5XCI7IH07XG4gIGNvbnN0IHBlZyRjOTUgPSBcIm5vdGVtcHR5XCI7XG4gIGNvbnN0IHBlZyRjOTYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90ZW1wdHlcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjOTcgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJub3RlbXB0eVwiOyB9O1xuICBjb25zdCBwZWckYzk4ID0gXCJ1bmRlZmluZWRcIjtcbiAgY29uc3QgcGVnJGM5OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ1bmRlZmluZWRcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEwMCA9IFwibnVsbFwiO1xuICBjb25zdCBwZWckYzEwMSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJudWxsXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMDIgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gbnVsbDsgfTtcbiAgY29uc3QgcGVnJGMxMDMgPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIG5ldyBDb25zdCh2YWx1ZSk7IH07XG4gIGNvbnN0IHBlZyRjMTA0ID0gXCJ7XCI7XG4gIGNvbnN0IHBlZyRjMTA1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIntcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEwNiA9IFwifVwiO1xuICBjb25zdCBwZWckYzEwNyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMDggPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIG5ldyBWYXJpYWJsZSh2YWx1ZSk7IH07XG4gIGNvbnN0IHBlZyRjMTA5ID0gXCInXCI7XG4gIGNvbnN0IHBlZyRjMTEwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIidcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzExMSA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gdmFsdWU7IH07XG4gIGNvbnN0IHBlZyRjMTEyID0gXCJcXFwiXCI7XG4gIGNvbnN0IHBlZyRjMTEzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIlxcXCJcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzExNCA9IFwiW1wiO1xuICBjb25zdCBwZWckYzExNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJbXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMTYgPSBcIl1cIjtcbiAgY29uc3QgcGVnJGMxMTcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTE4ID0gZnVuY3Rpb24oc2VxdWVuY2U6IGFueSk6IGFueSB7IHJldHVybiBzZXF1ZW5jZTsgfTtcbiAgY29uc3QgcGVnJGMxMTkgPSBcIixcIjtcbiAgY29uc3QgcGVnJGMxMjAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTIxID0gZnVuY3Rpb24oZXhwcjogYW55LCB0YWlsOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKGV4cHIgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICB2YXIgYXJyYXkgPSBbZXhwcl07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWlsKSkge1xuICAgICAgICB2YXIgZmxhdHRlbiA9IGZsYXR0ZW5BcnJheSh0YWlsKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBmbGF0dGVuLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgYXJyYXkucHVzaChmbGF0dGVuW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEFycmF5T3BlcmFuZChhcnJheSk7XG4gICAgfTtcbiAgY29uc3QgcGVnJGMxMjIgPSBcInRydWVcIjtcbiAgY29uc3QgcGVnJGMxMjMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwidHJ1ZVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxMjQgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgY29uc3QgcGVnJGMxMjUgPSBcImZhbHNlXCI7XG4gIGNvbnN0IHBlZyRjMTI2ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImZhbHNlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEyNyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBmYWxzZTsgfTtcbiAgY29uc3QgcGVnJGMxMjggPSBcIjB4XCI7XG4gIGNvbnN0IHBlZyRjMTI5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjB4XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMzAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gcGFyc2VJbnQodGV4dCgpLCAxNik7IH07XG4gIGNvbnN0IHBlZyRjMTMxID0gL15bXFwtXS87XG4gIGNvbnN0IHBlZyRjMTMyID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiLVwiXSwgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMzMgPSBmdW5jdGlvbihzaWduOiBhbnksIG51bTogYW55KTogYW55IHsgcmV0dXJuIHNpZ24gPT0gbnVsbCA/IG51bSA6IC1udW07IH07XG4gIGNvbnN0IHBlZyRjMTM0ID0gXCIuXCI7XG4gIGNvbnN0IHBlZyRjMTM1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIi5cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEzNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBwYXJzZUZsb2F0KHRleHQoKSk7IH07XG4gIGNvbnN0IHBlZyRjMTM3ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIHBhcnNlSW50KHRleHQoKSwgMTApOyB9O1xuICBjb25zdCBwZWckYzEzOCA9IFwiMFwiO1xuICBjb25zdCBwZWckYzEzOSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIwXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNDAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gMDsgfTtcbiAgY29uc3QgcGVnJGMxNDEgPSBmdW5jdGlvbihjaGFyczogYW55KTogYW55IHsgcmV0dXJuIGNoYXJzLmpvaW4oXCJcIik7IH07XG4gIGNvbnN0IHBlZyRjMTQyID0gXCJcXFxcJ1wiO1xuICBjb25zdCBwZWckYzE0MyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcJ1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTQ0ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiJ1wiOyB9O1xuICBjb25zdCBwZWckYzE0NSA9IFwiXFxcXFxcXCJcIjtcbiAgY29uc3QgcGVnJGMxNDYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxcXFxcXCJcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0NyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIlxcXCJcIjsgfTtcbiAgY29uc3QgcGVnJGMxNDggPSAvXlteXCIne31dLztcbiAgY29uc3QgcGVnJGMxNDkgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJcXFwiXCIsIFwiJ1wiLCBcIntcIiwgXCJ9XCJdLCB0cnVlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTUwID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIHRleHQoKTsgfTtcbiAgY29uc3QgcGVnJGMxNTEgPSAvXltee31dLztcbiAgY29uc3QgcGVnJGMxNTIgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJ7XCIsIFwifVwiXSwgdHJ1ZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE1MyA9IC9eWzAtOV0vO1xuICBjb25zdCBwZWckYzE1NCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCIwXCIsIFwiOVwiXV0sIGZhbHNlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTU1ID0gL15bMS05XS87XG4gIGNvbnN0IHBlZyRjMTU2ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcIjFcIiwgXCI5XCJdXSwgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTcgPSAvXlthLXpBLVpdLztcbiAgY29uc3QgcGVnJGMxNTggPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiYVwiLCBcInpcIl0sIFtcIkFcIiwgXCJaXCJdXSwgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTkgPSBwZWckb3RoZXJFeHBlY3RhdGlvbihcIndoaXRlc3BhY2VcIik7XG4gIGNvbnN0IHBlZyRjMTYwID0gL15bIFxcdFxcblxccl0vO1xuICBjb25zdCBwZWckYzE2MSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIiwgXCJcXHJcIl0sIGZhbHNlLCBmYWxzZSk7XG5cbiAgbGV0IHBlZyRjdXJyUG9zID0gMDtcbiAgbGV0IHBlZyRzYXZlZFBvcyA9IDA7XG4gIGNvbnN0IHBlZyRwb3NEZXRhaWxzQ2FjaGUgPSBbeyBsaW5lOiAxLCBjb2x1bW46IDEgfV07XG4gIGxldCBwZWckbWF4RmFpbFBvcyA9IDA7XG4gIGxldCBwZWckbWF4RmFpbEV4cGVjdGVkOiBhbnlbXSA9IFtdO1xuICBsZXQgcGVnJHNpbGVudEZhaWxzID0gMDtcblxuICBjb25zdCBwZWckcmVzdWx0c0NhY2hlOiB7W2lkOiBudW1iZXJdOiBJQ2FjaGVkfSA9IHt9O1xuXG4gIGxldCBwZWckcmVzdWx0O1xuXG4gIGlmIChvcHRpb25zLnN0YXJ0UnVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCEob3B0aW9ucy5zdGFydFJ1bGUgaW4gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHN0YXJ0IHBhcnNpbmcgZnJvbSBydWxlIFxcXCJcIiArIG9wdGlvbnMuc3RhcnRSdWxlICsgXCJcXFwiLlwiKTtcbiAgICB9XG5cbiAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb24gPSBwZWckc3RhcnRSdWxlRnVuY3Rpb25zW29wdGlvbnMuc3RhcnRSdWxlXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaW5wdXQuc3Vic3RyaW5nKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYXRpb24oKTogSUZpbGVSYW5nZSB7XG4gICAgcmV0dXJuIHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gIH1cblxuICBmdW5jdGlvbiBleHBlY3RlZChkZXNjcmlwdGlvbjogc3RyaW5nLCBsb2NhdGlvbjE/OiBJRmlsZVJhbmdlKSB7XG4gICAgbG9jYXRpb24xID0gbG9jYXRpb24xICE9PSB1bmRlZmluZWRcbiAgICAgID8gbG9jYXRpb24xXG4gICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBbcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb24pXSxcbiAgICAgIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKSxcbiAgICAgIGxvY2F0aW9uMVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGxvY2F0aW9uMT86IElGaWxlUmFuZ2UpIHtcbiAgICBsb2NhdGlvbjEgPSBsb2NhdGlvbjEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBsb2NhdGlvbjFcbiAgICAgIDogcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcblxuICAgIHRocm93IHBlZyRidWlsZFNpbXBsZUVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uMSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKHRleHQxOiBzdHJpbmcsIGlnbm9yZUNhc2U6IGJvb2xlYW4pOiBJTGl0ZXJhbEV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImxpdGVyYWxcIiwgdGV4dDogdGV4dDEsIGlnbm9yZUNhc2U6IGlnbm9yZUNhc2UgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjbGFzc0V4cGVjdGF0aW9uKHBhcnRzOiBJQ2xhc3NQYXJ0cywgaW52ZXJ0ZWQ6IGJvb2xlYW4sIGlnbm9yZUNhc2U6IGJvb2xlYW4pOiBJQ2xhc3NFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJjbGFzc1wiLCBwYXJ0czogcGFydHMsIGludmVydGVkOiBpbnZlcnRlZCwgaWdub3JlQ2FzZTogaWdub3JlQ2FzZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGFueUV4cGVjdGF0aW9uKCk6IElBbnlFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJhbnlcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGVuZEV4cGVjdGF0aW9uKCk6IElFbmRFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJlbmRcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IElPdGhlckV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcIm90aGVyXCIsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBvczogbnVtYmVyKSB7XG4gICAgbGV0IGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc107XG4gICAgbGV0IHA7XG5cbiAgICBpZiAoZGV0YWlscykge1xuICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAgPSBwb3MgLSAxO1xuICAgICAgd2hpbGUgKCFwZWckcG9zRGV0YWlsc0NhY2hlW3BdKSB7XG4gICAgICAgIHAtLTtcbiAgICAgIH1cblxuICAgICAgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcF07XG4gICAgICBkZXRhaWxzID0ge1xuICAgICAgICBsaW5lOiBkZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogZGV0YWlscy5jb2x1bW5cbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChwIDwgcG9zKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHApID09PSAxMCkge1xuICAgICAgICAgIGRldGFpbHMubGluZSsrO1xuICAgICAgICAgIGRldGFpbHMuY29sdW1uID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXRhaWxzLmNvbHVtbisrO1xuICAgICAgICB9XG5cbiAgICAgICAgcCsrO1xuICAgICAgfVxuXG4gICAgICBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc10gPSBkZXRhaWxzO1xuXG4gICAgICByZXR1cm4gZGV0YWlscztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY29tcHV0ZUxvY2F0aW9uKHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogSUZpbGVSYW5nZSB7XG4gICAgY29uc3Qgc3RhcnRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHN0YXJ0UG9zKTtcbiAgICBjb25zdCBlbmRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKGVuZFBvcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyxcbiAgICAgICAgbGluZTogc3RhcnRQb3NEZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICBvZmZzZXQ6IGVuZFBvcyxcbiAgICAgICAgbGluZTogZW5kUG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGVuZFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRmYWlsKGV4cGVjdGVkMTogRXhwZWN0YXRpb24pIHtcbiAgICBpZiAocGVnJGN1cnJQb3MgPCBwZWckbWF4RmFpbFBvcykgeyByZXR1cm47IH1cblxuICAgIGlmIChwZWckY3VyclBvcyA+IHBlZyRtYXhGYWlsUG9zKSB7XG4gICAgICBwZWckbWF4RmFpbFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCA9IFtdO1xuICAgIH1cblxuICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQucHVzaChleHBlY3RlZDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU2ltcGxlRXJyb3IobWVzc2FnZTogc3RyaW5nLCBsb2NhdGlvbjE6IElGaWxlUmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UsIFtdLCBcIlwiLCBsb2NhdGlvbjEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKGV4cGVjdGVkMTogRXhwZWN0YXRpb25bXSwgZm91bmQ6IHN0cmluZyB8IG51bGwsIGxvY2F0aW9uMTogSUZpbGVSYW5nZSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBTeW50YXhFcnJvci5idWlsZE1lc3NhZ2UoZXhwZWN0ZWQxLCBmb3VuZCksXG4gICAgICBleHBlY3RlZDEsXG4gICAgICBmb3VuZCxcbiAgICAgIGxvY2F0aW9uMVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VFeHByZXNzaW9uKCk6IE9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlTG9naWNPcigpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW107XG4gICAgICAgIHM0ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZU9yU2lnbigpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VMb2dpY09yKCk7XG4gICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM1ID0gW3M1LCBzNiwgczcsIHM4XTtcbiAgICAgICAgICAgICAgICBzNCA9IHM1O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICAgIHM0ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZU9yU2lnbigpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzOCA9IHBlZyRwYXJzZUxvZ2ljT3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM1ID0gW3M1LCBzNiwgczcsIHM4XTtcbiAgICAgICAgICAgICAgICAgIHM0ID0gczU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMChzMiwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VPclNpZ24oKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxKSB7XG4gICAgICBzMSA9IHBlZyRjMTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMykge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMik7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzUoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljT3IoKTogQmluYXJ5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMb2dpY0FuZCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZUFuZFNpZ24oKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VBbmRTaWduKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMwKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQW5kU2lnbigpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzYpIHtcbiAgICAgIHMxID0gcGVnJGM2O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcpOyB9XG4gICAgfVxuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM4KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAzKTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTAoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljQW5kKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgNDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUNvbXBPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTEoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VDb21wYXJhYmxlT3BlcmF0b3JzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA1O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTIpIHtcbiAgICAgIHMxID0gcGVnJGMxMjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMyk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxNCkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTEpO1xuICAgICAgICBwZWckY3VyclBvcyArPSAxMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE2KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTcpIHtcbiAgICAgICAgczEgPSBwZWckYzE3O1xuICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTgpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDE0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzIxKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNjEpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMjI7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIzKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjQpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyNSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzI2KCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMyNykge1xuICAgICAgICAgICAgczEgPSBwZWckYzI3O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjkpIHtcbiAgICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzApOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMzEoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYwKSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMzMjtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMzKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMzQpIHtcbiAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCk7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM1KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMzNigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYyKSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzM3O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzOCk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzM5KSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNyk7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDApOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGM0MSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQ29tcE9wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VQbHVzTWludXNPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mykge1xuICAgICAgczEgPSBwZWckYzQyO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzQ0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NSkge1xuICAgICAgICBzMSA9IHBlZyRjNDU7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0Nik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzQ3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c09wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDg7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VNdWxEaXZPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU11bERpdlNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mikge1xuICAgICAgczEgPSBwZWckYzQ4O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ5KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzUwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nykge1xuICAgICAgICBzMSA9IHBlZyRjNTE7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1Mik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzUzKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzcpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjNTQ7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzU1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM1NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTXVsRGl2T3BzKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBvd2VyU2lnbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlUG93ZXJTaWducygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VQb3dlclNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTQpIHtcbiAgICAgIHMxID0gcGVnJGM1NztcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1OCk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzU5KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYwKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzYxKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDEyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VCaW5GdW5jdGlvbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUZhY3RvcigpO1xuICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczcgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2Mikge1xuICAgICAgczEgPSBwZWckYzYyO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNjQpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjUpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM2Nikge1xuICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjcpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM2OCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzY5KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDExO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzApOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzEpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzIpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzczKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzQpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM3NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM3Nykge1xuICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzc5KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGYWN0b3IoKTogT3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQwKSB7XG4gICAgICBzMSA9IHBlZyRjODA7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODEpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MSkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjODI7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Myk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM4NChzMyk7XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2VGdW5jdGlvbk9wKCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2VVbmFyeUZ1bmN0aW9uT3AoKTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckcGFyc2VBdG9tKCk7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRwYXJzZUFycmF5T3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MCkge1xuICAgICAgICBzMiA9IHBlZyRjODA7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4MSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZVNlcXVlbmNlKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDEpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJGM4MjtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Myk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjODUoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5hcnlGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE2O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzMykge1xuICAgICAgczEgPSBwZWckYzg2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzg3KTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjODgpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODkpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM5MChzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZUF0b20oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VVbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjOTEoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5GdW5jdGlvbnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM5Mikge1xuICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzk0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM5NSkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5Nik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzk3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUF0b20oKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA5KSA9PT0gcGVnJGM5OCkge1xuICAgICAgICBzMiA9IHBlZyRjOTg7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5OSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGMxMDApIHtcbiAgICAgICAgICBzMiA9IHBlZyRjMTAwO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDEpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEwMigpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZUNvbnN0VmFsdWUoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEwMyhzMik7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgICAgICAgczIgPSBwZWckYzEwNDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDUpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczMgPSBwZWckcGFyc2VWYWx1ZUlucHV0KCk7XG4gICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICBzNCA9IHBlZyRjMTA2O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDcpOyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzEwOChzMyk7XG4gICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUNvbnN0VmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTk7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckcGFyc2VMb2dpY1ZhbHVlKCk7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRwYXJzZUFyaXRobWV0aWNWYWx1ZSgpO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzkpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMxMDk7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEwKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMyID0gcGVnJHBhcnNlQW55SW5wdXQoKTtcbiAgICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM5KSB7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckYzEwOTtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEwKTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMTEoczIpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzNCkge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMTEyO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEzKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMyID0gcGVnJHBhcnNlQW55SW5wdXQoKTtcbiAgICAgICAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzNCkge1xuICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzExMjtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTMpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTExKHMyKTtcbiAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQXJyYXlPcCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyMDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTEpIHtcbiAgICAgIHMxID0gcGVnJGMxMTQ7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlU2VxdWVuY2UoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDkzKSB7XG4gICAgICAgICAgczMgPSBwZWckYzExNjtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE3KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMTgoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VTZXF1ZW5jZSgpOiBBcnJheU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRjMTE5O1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjApOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRjMTE5O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyMCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEyMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljVmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxMjIpIHtcbiAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjMpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTI0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxMjUpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTI2KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTI3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFyaXRobWV0aWNWYWx1ZSgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIzO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTI4KSB7XG4gICAgICBzMSA9IHBlZyRjMTI4O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyOSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTMwKCk7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChwZWckYzEzMS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzMik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VOdW1iZXIoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEzMyhzMSwgczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VOdW1iZXIoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nikge1xuICAgICAgICBzMiA9IHBlZyRjMTM0O1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTM1KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMzYoKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJHBhcnNlTm9uWmVyb0RpZ2l0cygpO1xuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTM3KCk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDgpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMTM4O1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMzkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE0MCgpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVmFsdWVJbnB1dCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI1O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBbXTtcbiAgICBzMiA9IHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTQxKHMxKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFueUlucHV0KCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczI7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlQW55Q2hhcmFjdGVycygpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUNoYXJhY3RlcnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE0MShzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBbnlDaGFyYWN0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyNztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE0Mikge1xuICAgICAgczEgPSBwZWckYzE0MjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDMpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTQ0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTQ1KSB7XG4gICAgICAgIHMxID0gcGVnJGMxNDU7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDYpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxNDcoKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKHBlZyRjMTQ4LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE0OSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTUwKCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VWYWx1ZUNoYXJhY3RlcnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjMTUxLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTIpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTUwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMZXR0ZXJzQW5kRGlnaXRzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBbXTtcbiAgICAgICAgczYgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1LnB1c2goczYpO1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IFtdO1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczUucHVzaChzNik7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzE1MCgpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZURpZ2l0cygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNTMudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1NCk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAucHVzaChzMSk7XG4gICAgICAgIGlmIChwZWckYzE1My50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTQpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU5vblplcm9EaWdpdHMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDMxO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gW107XG4gICAgaWYgKHBlZyRjMTU1LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTYpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICBpZiAocGVnJGMxNTUudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU2KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMZXR0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzMjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IFtdO1xuICAgIGlmIChwZWckYzE1Ny50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU4KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMC5wdXNoKHMxKTtcbiAgICAgICAgaWYgKHBlZyRjMTU3LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1OCk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlXygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNjAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2MSk7IH1cbiAgICB9XG4gICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMC5wdXNoKHMxKTtcbiAgICAgIGlmIChwZWckYzE2MC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2MSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGVnJHNpbGVudEZhaWxzLS07XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU5KTsgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG5cbiAgICBmdW5jdGlvbiBidWlsZEJpbmFyeU9wZXJhbmQoaGVhZDogT3BlcmFuZCwgdGFpbDogQXJyYXk8YW55PiwgaXNBcml0aG1ldGljT3A6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRhaWwucmVkdWNlKFxuICAgICAgICBmdW5jdGlvbihyZXN1bHQsIGVsZW1lbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYW5kKGVsZW1lbnRzWzFdLCByZXN1bHQsIGVsZW1lbnRzWzNdLCBpc0FyaXRobWV0aWNPcCk7XG4gICAgICAgIH0sIFxuICAgICAgICBoZWFkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmbGF0dGVuQXJyYXkoYXJyYXk6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGFycmF5KTtcbiAgICB9XG5cblxuICBwZWckcmVzdWx0ID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uKCk7XG5cbiAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgIHJldHVybiBwZWckcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICBwZWckZmFpbChwZWckZW5kRXhwZWN0YXRpb24oKSk7XG4gICAgfVxuXG4gICAgdGhyb3cgcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKFxuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCxcbiAgICAgIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoID8gaW5wdXQuY2hhckF0KHBlZyRtYXhGYWlsUG9zKSA6IG51bGwsXG4gICAgICBwZWckbWF4RmFpbFBvcyA8IGlucHV0Lmxlbmd0aFxuICAgICAgICA/IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zICsgMSlcbiAgICAgICAgOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRtYXhGYWlsUG9zLCBwZWckbWF4RmFpbFBvcylcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlT3B0aW9ucyB7XG4gIGZpbGVuYW1lPzogc3RyaW5nO1xuICBzdGFydFJ1bGU/OiBzdHJpbmc7XG4gIHRyYWNlcj86IGFueTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuZXhwb3J0IHR5cGUgUGFyc2VGdW5jdGlvbiA9IChpbnB1dDogc3RyaW5nLCBvcHRpb25zPzogSVBhcnNlT3B0aW9ucykgPT4gYW55O1xuZXhwb3J0IGNvbnN0IHBhcnNlOiBQYXJzZUZ1bmN0aW9uID0gcGVnJHBhcnNlO1xuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXhwcmVzc2lvbnMvZXhwcmVzc2lvblBhcnNlci50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBJRWxlbWVudCwgSVF1ZXN0aW9uIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5cbi8qKlxuICogVGhlIGZsb3cgcGFuZWwgb2JqZWN0LiBJdCBpcyBhIGNvbnRhaW5lciB3aXRoIGZsb3cgbGF5b3V0IHdoZXJlIHlvdSBjYW4gbWl4IHF1ZXN0aW9ucyB3aXRoIG1hcmRvd24gdGV4dC5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBGbG93UGFuZWxNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWwge1xuICBzdGF0aWMgY29udGVudEVsZW1lbnROYW1lUHJlZml4ID0gXCJlbGVtZW50OlwiO1xuICBwdWJsaWMgY29udGVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcHVibGljIG9uR2V0SHRtbEZvclF1ZXN0aW9uOiAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBzdHJpbmc7XG4gIHB1YmxpYyBvbkN1c3RvbUh0bWxQcm9kdWNpbmc6ICgpID0+IHN0cmluZztcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb250ZW50XCIsIHRoaXMsIHRydWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29udGVudFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db250ZW50Q2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmxvd3BhbmVsXCI7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmxvd1wiO1xuICB9XG4gIG9uU3VydmV5TG9hZCgpOiBhbnkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMub25Db250ZW50Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbnRlbnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb250ZW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NDb250ZW50KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbnRlbnRcIik7XG4gIH1cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImh0bWxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaHRtbFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbnRlbnRDaGFuZ2VkKCk6IGFueSB7XG4gICAgdmFyIGh0bWwgPSBcIlwiO1xuICAgIGlmICghIXRoaXMub25DdXN0b21IdG1sUHJvZHVjaW5nKSB7XG4gICAgICBodG1sID0gdGhpcy5vbkN1c3RvbUh0bWxQcm9kdWNpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHRtbCA9IHRoaXMucHJvZHVjZUh0bWwoKTtcbiAgICB9XG4gICAgdGhpcy5odG1sID0gaHRtbDtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuY29udGVudENoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIHB1YmxpYyBwcm9kdWNlSHRtbCgpOiBzdHJpbmcge1xuICAgIHZhciBodG1sID0gW107XG4gICAgLy9jb250ZW50RWxlbWVudE5hbWVQcmVmaXhcbiAgICB2YXIgcmVnRXggPSAveyguKj8oZWxlbWVudDopW14kXS4qPyl9L2c7XG4gICAgdmFyIHN0ciA9IHRoaXMuY29udGVudDtcbiAgICB2YXIgc3RhcnRJbmRleCA9IDA7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgd2hpbGUgKChyZXMgPSByZWdFeC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgICBpZiAocmVzLmluZGV4ID4gc3RhcnRJbmRleCkge1xuICAgICAgICBodG1sLnB1c2goc3RyLnN1YnN0cihzdGFydEluZGV4LCByZXMuaW5kZXggLSBzdGFydEluZGV4KSk7XG4gICAgICAgIHN0YXJ0SW5kZXggPSByZXMuaW5kZXg7XG4gICAgICB9XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uRnJvbVRleHQocmVzWzBdKTtcbiAgICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICAgIGh0bWwucHVzaCh0aGlzLmdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbC5wdXNoKFxuICAgICAgICAgIHN0ci5zdWJzdHIoc3RhcnRJbmRleCwgcmVzLmluZGV4ICsgcmVzWzBdLmxlbmd0aCAtIHN0YXJ0SW5kZXgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGFydEluZGV4ID0gcmVzLmluZGV4ICsgcmVzWzBdLmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0SW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICBodG1sLnB1c2goc3RyLnN1YnN0cihzdGFydEluZGV4LCBzdHIubGVuZ3RoIC0gc3RhcnRJbmRleCkpO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbC5qb2luKFwiXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIjxicj5cIiwgXCJnXCIpLCBcIjxici8+XCIpO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21UZXh0KHN0cjogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKEZsb3dQYW5lbE1vZGVsLmNvbnRlbnRFbGVtZW50TmFtZVByZWZpeCwgXCJcIikudHJpbSgpO1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKHN0cik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMub25HZXRIdG1sRm9yUXVlc3Rpb24pIHJldHVybiB0aGlzLm9uR2V0SHRtbEZvclF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25IdG1sSWQocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJfXCIgKyBxdWVzdGlvbi5pZDtcbiAgfVxuICBwcm90ZWN0ZWQgb25BZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgc3VwZXIub25BZGRFbGVtZW50KGVsZW1lbnQsIGluZGV4KTtcbiAgICB0aGlzLmFkZEVsZW1lbnRUb0NvbnRlbnQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5yZW5kZXJXaWR0aCA9IFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHZhciBzZWFyY2hTdHIgPSB0aGlzLmdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50KTtcbiAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShzZWFyY2hTdHIsIFwiXCIpO1xuICAgIHN1cGVyLm9uUmVtb3ZlRWxlbWVudChlbGVtZW50KTtcbiAgfVxuICBkcmFnRHJvcE1vdmVFbGVtZW50KHNyYzogSUVsZW1lbnQsIHRhcmdldDogSUVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpIHt9XG4gIHByaXZhdGUgYWRkRWxlbWVudFRvQ29udGVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHRleHQgPSB0aGlzLmdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpKSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQgKyB0ZXh0O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGluc2VydFRleHRBdEN1cnNvcih0ZXh0OiBzdHJpbmcsIHByZXZOYW1lOiBzdHJpbmcgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzRGVzaWduTW9kZSB8fCAoIXdpbmRvdyAmJiAhd2luZG93LmdldFNlbGVjdGlvbikpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChzZWwuZ2V0UmFuZ2VBdCAmJiBzZWwucmFuZ2VDb3VudCkge1xuICAgICAgbGV0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG4gICAgICB2YXIgc2VsZiA9IDxhbnk+dGhpcztcbiAgICAgIGlmIChzZWxmLmdldENvbnRlbnQpIHtcbiAgICAgICAgdmFyIHN0ciA9IHNlbGYuZ2V0Q29udGVudChwcmV2TmFtZSk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHJldHVybiBcIntcIiArIEZsb3dQYW5lbE1vZGVsLmNvbnRlbnRFbGVtZW50TmFtZVByZWZpeCArIGVsZW1lbnQubmFtZSArIFwifVwiO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZmxvd3BhbmVsXCIsXG4gIFt7IG5hbWU6IFwiY29udGVudDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb250ZW50XCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRmxvd1BhbmVsTW9kZWwoKTtcbiAgfSxcbiAgXCJwYW5lbFwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Zsb3dwYW5lbC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYXJhYmljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItin2YTYs9in2KjZglwiLFxuICBwYWdlTmV4dFRleHQ6IFwi2KfZhNiq2KfZhNmKXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYp9mG2YfYp9ihLSDYqtmFXCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MX0g2LXZgdit2KkgezB9INmF2YZcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLZhti1INii2K7YsVwiLFxuICBlbXB0eVN1cnZleTogXCLZhNinINiq2YjYrNivINi12YHYrdipINmF2LHYptmK2Kkg2KPZiCDYs9ik2KfZhCDZgdmKINin2YTZhdiz2K1cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLYtNmD2LHYpyDZhNmDINmE2KfYs9iq2YPZhdin2YQg2KfZhNin2LPYqtio2YrYp9mGIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIi4uLtmK2KrZhSDYqtit2YXZitmEINin2YTYp9iz2KrYqNmK2KfZhlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCIuLi7Yp9iu2KrYsVwiLFxuICByZXF1aXJlZEVycm9yOiBcIi7Zitix2KzZiSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KfZhNiz2KTYp9mEXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi2YrYsdis2Ykg2KfZhNil2KzYp9io2Kkg2LnZhNmJINin2YTYo9iz2KbZhNipINmB2Yog2KzZhdmK2Lkg2KfZhNi12YHZiNmBXCIsXG4gIG51bWVyaWNFcnJvcjogXCLZitis2Kgg2KPZhiDYqtmD2YjZhiDYp9mE2YLZitmF2Kkg2KfZhNix2YLZhdmK2KkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYrdix2YFcIixcbiAgdGV4dE1heExlbmd0aDogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDYo9mC2YQg2YXZhiB7MH0g2K3YsdmBXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi2YrYsdis2Ykg2KXYr9iu2KfZhCDYo9mD2KvYsSDZhdmGIHswfSDZiNij2YLZhCDZhdmGIHsxfSDYrdix2YFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZitix2KzZiSDZhdmE2KEg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYp9mE2LXZgdmI2YFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2YrYsdis2Ykg2KrYrdiv2YrYryDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INin2YTZhdiq2LrZitix2KfYqlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitiy2YrYryDYudmGIHswfSDYp9mE2YXYqti62YrYsdin2KpcIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZg9ir2LEg2YXZhiB7MX0g2YjZitiz2KfZiNmKINij2Ygg2KPZgtmEINmF2YYgezJ92KdcIixcbiAgbnVtZXJpY01pbjogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF92KdcIixcbiAgbnVtZXJpY01heDogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YLZhCDZhdmGIHsxfdinXCIsXG4gIGludmFsaWRFbWFpbDogXCLYsdis2KfYoSDZgtmFINio2KXYr9iu2KfZhCDYqNix2YrYryDYp9mE2YPYqtix2YjZhtmKINi12K3ZititXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLYt9mE2Kgg2KXYsdis2KfYuSDYrti32KMgJ3swfScuIHsxfdinXCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLYudin2K8g2LfZhNioINio2YrYp9mG2KfYqiDZgdin2LHYutipINij2YggJ9in2YTZhdiz2KfYsScg2YXZhdiq2YTZg9in2Kog2LrZitixINi12K3Zitit2KkgXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi2YjZitmG2KjYutmKINij2YTYpyDZitiq2KzYp9mI2LIg2K3YrNmFINin2YTZhdmE2YEgezB92KdcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINmC2YrZhdipINij2K7YsdmJXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi2KfZhNmF2YTZgSDYp9mE2K7Yp9i1INio2YMg2KrYrdmF2YrZhC4g2YrYsdis2Ykg2KfZhNin2YbYqti42KfYsSDYudiv2Kkg2KvZiNin2YYg2YjYrdin2YjZhCDZhdix2Kkg2KPYrtix2YlcIixcbiAgYWRkUm93OiBcItin2LbYp9mB2Kkg2LXZgVwiLFxuICByZW1vdmVSb3c6IFwi2KXYstin2YTYqSDYtdmBXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcItin2YTYudix2KjZitipXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIi8vVW5jb21tZW50IHRoaXMgbGluZSBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGVcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYnVsZ2FyaWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCd0LDQv9GA0LXQtFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JrRgNCw0LlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0LvQvlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L4gKNC+0L/QuNGI0LXRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QuNGC0L4g0LXQtNC40L1cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi0JLRgdC40YfQutC4XCIsXG4gIHByb2dyZXNzVGV4dDogXCLRgdGC0YAuIHswfSwg0L7QsdGJ0L4g0YHRgtGALiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0JDQvdC60LXRgtCw0YLQsCDQvdC1INGB0YrQtNGK0YDQttCwINCy0LjQtNC40LzQuCDRgdGC0YDQsNC90LjRhtC4INC40LvQuCDQstGK0L/RgNC+0YHQuC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQkdC70LDQs9C+0LTQsNGA0LjQvCDQstC4INC30LAg0YPRh9Cw0YHRgtC40LXRgtC+INCyINCw0L3QutC10YLQsNGC0LAhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQmNC30LPQu9C10LbQtNCwLCDRh9C1INCy0LjQtSDQstC10YfQtSDRgdGC0LUg0L/QvtC/0YrQu9C90LjQu9C4INCw0L3QutC10YLQsNGC0LAuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNGA0LXQttC00LDQvdC1INC90LAg0LDQvdC60LXRgtCw0YLQsC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQmNC30LHQtdGA0LXRgtC1Li4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0JzQvtC70Y8sINC+0YLQs9C+0LLQvtGA0LXRgtC1INC90LAg0YHQu9C10LTQvdC40Y8g0LLRitC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L/QvtC90LUg0L3QsCDQtdC00LjQvSDQvtGCINCy0YrQv9GA0L7RgdC40YLQtS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L3QsCDQstGK0L/RgNC+0YHQuNGC0LUg0L3QsCDQstGB0LjRh9C60Lgg0YDQtdC00L7QstC1LlwiLFxuICBudW1lcmljRXJyb3I6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YfQuNGB0LvQvi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQv9C+0L3QtSB7MH0g0YHQuNC80LLQvtC70LAuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0JzQvtC70Y8sINC40LfQv9C+0LvQt9Cy0LDQudGC0LUg0L3QtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0YHQuNC80LLQvtC70LAuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi0JzQvtC70Y8sINC40LfQv9C+0LvQt9Cy0LDQudGC0LUg0L/QvtCy0LXRh9C1INC+0YIgezB9INC4INC/0L4t0LzQsNC70LrQviDQvtGCIHsxfSDRgdC40LzQstC+0LvQsC5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLQnNC+0LvRjywg0L/QvtC/0YrQu9C90LXRgtC1INC/0L7QvdC1IHswfSDRgNC10LTQsC5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi0JzQvtC70Y8sINC40LfQsdC10YDQtdGC0LUg0L/QvtC90LUgezB9INCy0LDRgNC40LDQvdGC0LAuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItCc0L7Qu9GPLCDQuNC30LHQtdGA0LXRgtC1INC90LUg0L/QvtCy0LXRh9C1INC+0YIgezB9INCy0LDRgNC40LDQvdGC0LAuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCLQodGC0L7QudC90L7RgdGC0YLQsCAnezB9JyDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdCz0L7Qu9GP0LzQsCDQvtGCIHsxfSDQuCDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdC80LDQu9C60LAg0L7RgiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLQodGC0L7QudC90L7RgdGC0YLQsCAnezB9JyDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdCz0L7Qu9GP0LzQsCDQvtGCIHsxfVwiLFxuICBudW1lcmljTWF4OiBcItCh0YLQvtC50L3QvtGB0YLRgtCwICd7MH0nINGB0LvQtdC00LLQsCDQtNCwINCx0YrQtNC1INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LzQsNC70LrQsCDQvtGCIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi0JzQvtC70Y8sINCy0YrQstC10LTQtdGC0LUg0LLQsNC70LjQtNC10L0g0LDQtNGA0LXRgSDQvdCwINC10LvQtdC60YLRgNC+0L3QvdCwINC/0L7RidCwLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQmNC30YDQsNC30YrRgjogezB9INGC0YDRj9Cx0LLQsCDQtNCwINC00LDQstCwINGA0LXQt9GD0LvRgtCw0YIgJ3RydWUnICjQuNGB0YLQuNC90LApLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JfQsNGP0LLQutCw0YLQsCDQstC+0LTQuCDQtNC+INCz0YDQtdGI0LrQsCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCX0LDRj9Cy0LrQsNGC0LAg0L3QtSDQstGA0YrRidCwINC00LDQvdC90Lgg0LjQu9C4INGH0LDRgdGC0YLQsCAncGF0aCcgKNC/0YrRgiDQtNC+INGC0YrRgNGB0LXQvdC40Y8g0YDQtdGB0YPRgNGBINC90LAg0YHRitGA0LLRitGA0LApINC1INC90LXQv9GA0LDQstC40LvQvdC+INC30LDQtNCw0LTQtdC90LBcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQoNCw0LfQvNC10YDRitGCINC90LAg0YTQsNC50LvQsCDRgdC70LXQtNCy0LAg0LTQsCDQvdC1INC/0YDQtdCy0LjRiNCw0LLQsCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQnNC+0LvRjywg0LLRitCy0LXQtNC10YLQtSDQtNGA0YPQs9Cw0YLQsCDRgdGC0L7QudC90L7RgdGCLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGI0LjRgiDRhNCw0LnQuyDRgdC1INC30LDRgNC10LbQtNCwINC90LAg0YHRitGA0LLRitGA0LAuINCc0L7Qu9GPLCDQuNC30YfQsNC60LDQudGC0LUg0L3Rj9C60L7Qu9C60L4g0YHQtdC60YPQvdC00Lgg0Lgg0YLQvtCz0LDQstCwINC+0L/QuNGC0LLQsNC50YLQtSDQvtGC0L3QvtCy0L4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDRgNC10LbQtNCw0L3QtS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCY0LfQsdC10YDQtdGC0LUg0YTQsNC50Lso0L7QstC1KS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCW0LXQu9Cw0LXRgtC1INC70Lgg0LTQsCDQuNC30YLRgNC40LXRgtC1INC30LDQv9C40YHQsD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQodGC0L7QudC90L7RgdGC0YLQsCDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRg9C90LjQutCw0LvQvdCwLlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINC60L7Qu9C+0L3QsFwiLFxuICBhZGRSb3c6IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINGA0LXQtFwiLFxuICByZW1vdmVSb3c6IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDRgNC10LRcIixcbiAgYWRkUGFuZWw6IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINC/0LDQvdC10LtcIixcbiAgcmVtb3ZlUGFuZWw6IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDQv9Cw0L3QtdC7XCIsXG4gIGNob2ljZXNfSXRlbTogXCLQtdC70LXQvNC10L3RglwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCa0L7Qu9C+0L3QsFwiLFxuICBtYXRyaXhfcm93OiBcItCg0LXQtFwiLFxuICBzYXZpbmdEYXRhOiBcItCg0LXQt9GD0LvRgtCw0YLQuNGC0LUg0YHQtSDQt9Cw0L/QsNC30LLQsNGCINC90LAg0YHRitGA0LLRitGA0LAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItCf0L7RgNCw0LTQuCDQstGK0LfQvdC40LrQvdCw0LvQsCDQs9GA0LXRiNC60LAg0YDQtdC30YPQu9GC0LDRgtC40YLQtSDQvdC1INC80L7QttCw0YXQsCDQtNCwINCx0YrQtNCw0YIg0LfQsNC/0LDQt9C10L3QuC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GC0LDRgtC40YLQtSDQsdGP0YXQsCDQt9Cw0L/QsNC30LXQvdC4INGD0YHQv9C10YjQvdC+IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0J3QvtCyINC+0L/QuNGCXCIsXG4gIHRpbWVyTWluOiBcItC80LjQvVwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSB7MH0g0L3QsCDRgtCw0LfQuCDRgdGC0YDQsNC90LjRhtCwINC4INC+0LHRidC+IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUgezB9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSDQvtCx0YnQviB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktC40LUg0LjQt9C/0L7Qt9Cy0LDRhdGC0LUgezB9INC+0YIgezF9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsCDQuCDQvtCx0YnQviB7Mn0g0L7RgiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1IHswfSDQvtGCIHsxfSDQvdCwINGC0LDQt9C4INGB0YLRgNCw0L3QuNGG0LAuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUg0L7QsdGJ0L4gezB9INC+0YIgezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi0JjQt9GH0LjRgdGC0LLQsNC90LVcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCd0LDRh9Cw0LvQvdC+INGB0YrRgdGC0L7Rj9C90LjQtVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQn9GA0LXQvNCw0YXQstCw0L3QtSDQvdCwINGE0LDQudC70LBcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImJnXCJdID0gYnVsZ2FyaWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImJnXCJdID0gXCJCdWxnYXJpYW5cIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjYXRhbGFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZWfDvGVudFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIlVuIGFsdHJlIChkZXNjcmlndWkpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQw6BnaW5hIHswfSBkZSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm8gaGkgaGEgY2FwIHDDoGdpbmEgdmlzaWJsZSBvIHByZWd1bnRhIGEgbCdlbnF1ZXN0YS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJHcsOgY2llcyBwZXIgY29tcGxldGFyIGwnZW5xdWVzdGEhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTCdlbnF1ZXN0YSBzJ2VzdMOgIGNhcnJlZ2FudCAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNjaW9uYSAuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJTaSB1cyBwbGF1IGNvbnRlc3RpIGxhIHByZWd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlNpIHVzIHBsYXUgY29udGVzdGkgbGVzIHByZWd1bnRlcyBkZSBjYWRhIGZpbGVyYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkwnZXN0aW1hY2nDsyBoYSBkZSBzZXIgbnVtw6hyaWNhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgYWxtZW55cyB7MH0gc8OtbWJvbHMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBtZW55cyBkZSB7MH0gc8OtbWJvbHMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBtw6lzIGRlIHswfSBpIG1lbnlzIGRlIHsxfSBzw61tYm9scy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJTaSB1cyBwbGF1IG9tcGxpIGFsbWVueXMgezB9IGZpbGVyZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNpIHVzIHBsYXUgc2VsZWNjaW9uaSBhbG1lbnlzIHswfSB2YXJpYW50cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2kgdXMgcGxhdSBzZWxlY2Npb25pIG5vIG3DqXMgZGUgezB9IHZhcmlhbnRzLlwiLFxuICBudW1lcmljTWluTWF4OiBcIkVsICd7MH0nIGRldSBzZXIgaWd1YWwgbyBtw6lzIGRlIHsxfSBpIGlndWFsIG8gbWVueXMgZGUgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiRWwgJ3swfScgaGEgZGUgc2VyIGlndWFsIG8gbcOpcyBkZSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJFbCAnezB9JyBoYSBkZSBzZXIgaWd1YWwgbyBtZW55cyBkZSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlNpIHVzIHBsYXUgYWZlZ2l1IHVuIGNvcnJldSBlbGVjdHLDsm5pYyB2w6BsaWQuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSBzb2zCt2xpY2l0dWQgdmEgdG9ybmFyIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgc29swrdsaWNpdHVkIHZhIHRvcm5hciBidWlkYSBkZSBkYXRlcyBvIGxhIHByb3BpZXRhdCAndHJhamVjdMOycmlhJyBubyDDqXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJMYSBtaWRhIGRlIGwnYXJ4aXUgbm8gcG90IGV4Y2VkaXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiU2kgdXMgcGxhdSBhZmVnaXUgbCdhbHRyYSBlc3RpbWFjacOzLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRWwgc2V1IGFyeGl1IHMnZXN0w6AgcHVqYW50LiBTaSB1cyBwbGF1IGVzcGVyaSB1bnMgc2Vnb25zIGkgaW50ZW50ZXUtaG8gZGUgbm91LlwiLFxuICBhZGRSb3c6IFwiQWZlZ2l1IHVuYSBmaWxlcmFcIixcbiAgcmVtb3ZlUm93OiBcIkVsaW1pbmFyIHVuYSBmaWxlcmFcIixcbiAgY2hvaWNlc19maXJzdEl0ZW06IFwicHJpbWVyIGFydGljbGVcIixcbiAgY2hvaWNlc19zZWNvbmRJdGVtOiBcInNlZ29uIGFydGljbGVcIixcbiAgY2hvaWNlc190aGlyZEl0ZW06IFwidGVyY2VyIGFydGljbGVcIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiRmlsZXJhXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY2FcIl0gPSBjYXRhbGFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImNhXCJdID0gXCJjYXRhbMOgXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2NhdGFsYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGN6ZWNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlDFmWVkY2hvesOtXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWzFocOtXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJIb3Rvdm9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJKaW7DoSBvZHBvdsSbxI8gKG5hcGnFoXRlKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5hIHswfSB6IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJQcsWvemt1bXUgbmVvYnNhaHVqZSDFvsOhZG7DqSBvdMOhemt5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEm2t1amVtZSB6YSB2eXBsbsSbbsOtIHByxa96a3VtdSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcm9iw61ow6EgbmHEjcOtdMOhbsOtIHByxa96a3VtdS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWeWJlci4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSBvdMOhemt1LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSB2xaFlY2hueSBvdMOhemt5LlwiLFxuICBudW1lcmljRXJyb3I6IFwiViB0b210byBwb2xpIGx6ZSB6YWRhdCBwb3V6ZSDEjcOtc2xhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBtw6luxJsgbmXFviB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSBhIG3DqW7EmyBuZcW+IHsxfSB6bmFrxa8uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVnlwbMWIdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gxZnDoWRrxa8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZ5YmVydGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gdmFyaWFudHkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5ldnliw61yZWp0ZSBwcm9zw61tIHbDrWNlIG5lxb4gezB9IHZhcmlhbnQuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfSBhIG1lbsWhw60gbmVibyByb3ZubyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG92xJvEjyAnezB9JyBieSBtxJtsbyBiw710IG1lbsWhw60gbmVibyByb3ZubyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlphZGVqdGUgcHJvc8OtbSBwbGF0bm91IGUtbWFpbG92b3UgYWRyZXN1LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUG/FvmFkYXZlayB2csOhdGlsIGNoeWJ1ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIlBvxb5hZGF2ZWsgbmV2csOhdGlsIGRhdGEgbmVibyBjZXN0YSBqZSBuZXBsYXRuw6FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJWZWxpa29zdCBzb3Vib3J1IGJ5IG5lbcSbbGEgYsO9dCB2xJt0xaHDrSBuZcW+IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlphZGVqdGUgcHJvc8OtbSBqaW5vdSBob2Rub3R1LlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlbDocWhIHNvdWJvciBzZSBuYWhyw6F2w6EuIFprdXN0ZSB0byBwcm9zw61tIHphIG7Em2tvbGlrIHNla3VuZC5cIixcbiAgYWRkUm93OiBcIlDFmWlkYXQgxZnDoWRla1wiLFxuICByZW1vdmVSb3c6IFwiT2RzdHJhbml0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY3pcIl0gPSBjemVjaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJjelwiXSA9IFwixI1lxaF0aW5hXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBkYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVGlsYmFnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVmlkZXJlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGw6ZyZGlnXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIlZhbGdmcml0IHN2YXIuLi5cIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkluZ2VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlbDpmxnIGFsbGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGFmIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJEZXIgZXIgaW5nZW4gc3lubGlnZSBzcMO4cmdzbcOlbC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJNYW5nZSB0YWsgZm9yIGRpbiBiZXN2YXJlbHNlIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVm9yZXMgZGF0YSB2aXNlciBhdCBkdSBhbGxlcmVkZSBoYXIgZ2VubmVtZsO4cnQgZGV0dGUgc3DDuHJnZXNrZW1hLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlNww7hyZ2Vza2VtYWV0IGhlbnRlcyBmcmEgc2VydmVyZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOmbGcuLi5cIixcbiAgdmFsdWU6IFwidsOmcmRpXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQmVzdmFyIHZlbmxpZ3N0IHNww7hyZ3Ntw6VsZXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkJlc3ZhciB2ZW5saWdzdCBtaW5kc3Qgw6l0IHNww7hyZ3Ntw6VsLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbCBpIGFsbGUgcsOma2tlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkFuZ2l2IGV0IHRhbC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJBbmdpdiBtaW5kc3QgezB9IHRlZ24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIGxlc3MgdGhhbiB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJBbmdpdiBtZXJlIGVuZCB7MH0gb2cgbWluZHJlIGVuZCB7MX0gdGVnbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJVZGZ5bGQgbWluZHN0IHswfSByw6Zra2VyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWw6ZsZyB2ZW5saWdzdCBtaW5kc3QgezB9IHN2YXJtdWxpZ2hlZChlcikuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlbDpmxnIHZlbmxpZ3N0IGbDpnJyZSB7MH0gc3Zhcm11bGlnaGVkZXIoZXIpLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfSBvZyBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHNrYWwgdsOmcmUgbGlnIG1lZCBlbGxlciBtaW5kcmUgZW5kIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiQW5naXYgdmVubGlnc3QgZW4gZ3lsZGlnIGUtbWFpbCBhZHJlc3NlLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJVZHRyeWtrZXQ6IHswfSBza2FsIHJldHVybmVyZSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJGb3Jlc3DDuHJnc2xlbiByZXR1cm5lcmVkZSBmZWpsZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJGb3Jlc3DDuHJnc2xlbiByZXR1cm5lcmVkZSBpbmdlbiBkYXRhIGVsbGVyICdwYXRoJyBwYXJhbWV0ZXJlbiBlciBmb3JrZXJ0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3TDuHJyZWxzZW4gbcOlIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFuZ2l2IGVuIHbDpnJkaSBmb3IgZGl0IHZhbGdmcmllIHN2YXIuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJEaW4gZmlsIGJsaXZlciB1cGxvYWRldC4gVmVudCBub2dsZSBzZWt1bmRlciBvZyBwcsO4diBldmVudHVlbHQgaWdlbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiSW5kbMOmc2VyLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVsOmbGcgZmlsKGVyKS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIlZpbCBkdSBmamVybmUgZGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRlbm5lIHbDpnJkaSBza2FsIHbDpnJlIHVuaWsuXCIsXG4gIGFkZENvbHVtbjogXCJUaWxmw7hqIGtvbG9ubmVcIixcbiAgYWRkUm93OiBcIlRpbGbDuGogcsOma2tlXCIsXG4gIHJlbW92ZVJvdzogXCJGamVyblwiLFxuICBhZGRQYW5lbDogXCJUaWxmw7hqIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkZqZXJuXCIsXG4gIGNob2ljZXNfSXRlbTogXCJ2YWxnXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIlLDpmtrZVwiLFxuICBzYXZpbmdEYXRhOiBcIlJlc3VsdGF0ZXJuZSBibGl2ZXIgZ2VtdCBww6Ugc2VydmVyZW4uLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkRlciBvcHN0b2QgZW4gZmVqbCBvZyB2aSBrdW5uZSBpa2tlIGdlbW1lIHJlc3VsdGF0ZXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZXQgYmxldiBnZW10IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDuHYgaWdlblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiRHUgaGFyIGJydWd0IHswfSBww6UgZGVubmUgc2lkZSBvZyB7MX0gaSBhbHQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkR1IGhhciBicnVndCB7MH0gcMOlIGRlbm5lIHNpZGUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiRHUgaGFyIGJydWd0IHswfSBpIGFsdC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IHDDpSBkZW5uZSBzaWRlIG9nIHsyfSBhZiB7M30gaSBhbHQuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IHDDpSBkZW5uZSBzaWRlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IGkgYWx0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUmVuc1wiLFxuICBjbGVhckNhcHRpb246IFwiRmplcm5cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRmplcm4gZGVubmUgZmlsXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGFcIl0gPSBkYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZGFcIl0gPSBcImRhbnNrXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIi8vQ3JlYXRlZCBvbiBiZWhhbGYgaHR0cHM6Ly9naXRodWIuY29tL0ZyYW5rMTNcbi8vTW9kaWZpZWQgb24gYmVoYWxmIFJvZWxhbmQgVmVyYmFrZWxcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZHV0Y2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVm9yaWdlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJWb2xnZW5kZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVmVyemVuZGVuXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQW5kZXJzLCBubC5cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gdmFuIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJFciBpcyBnZWVuIHppY2h0YmFyZSBwYWdpbmEgb2YgdnJhYWcgaW4gZGV6ZSB2cmFnZW5saWpzdFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkJlZGFua3Qgdm9vciBoZXQgaW52dWxsZW4gdmFuIGRlIHZyYWdlbmxpanN0XCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRGUgdnJhZ2VubGlqc3QgaXMgYWFuIGhldCBsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJLaWVzLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiRGl0IGlzIGVlbiB2ZXJlaXN0ZSB2cmFhZ1wiLFxuICBudW1lcmljRXJyb3I6IFwiSGV0IGFudHdvb3JkIG1vZXQgZWVuIGdldGFsIHppam5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJWdWwgbWluc3RlbnMgezB9IGthcmFrdGVycyBpblwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlY3RlZXIgbWluaW11bSB7MH0gYW50d29vcmRlblwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTZWxlY3RlZXIgbmlldCBtZWVyIGRhbiB7MH0gYW50d29vcmRlblwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfSBlbiBrbGVpbmVyIG9mIGdlbGlqayBhYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZ1bCBlZW4gZ2VsZGlnIGUtbWFpbGFkcmVzIGluXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGUgZ3Jvb3R0ZSB2YW4gaGV0IGJlc3RhbmQgbWFnIG5pZXQgZ3JvdGVyIHppam4gZGFuIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVnVsIGhldCB2ZWxkICdBbmRlcnMsIG5sLicgaW5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJEZXplIHZyYWFnIHZlcmVpc3Qgw6nDqW4gYW50d29vcmQgcGVyIHJpalwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5sXCJdID0gZHV0Y2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibmxcIl0gPSBcIm5lZGVybGFuZHNcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZpbm5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRWRlbGxpbmVuXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZXVyYWF2YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVmFsbWlzXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiTXV1IChrdXZhaWxlKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2l2dSB7MH0vezF9XCIsXG4gIGVtcHR5U3VydmV5OlxuICAgIFwiVMOkc3PDpCBreXNlbHlzc8OkIGVpIG9sZSB5aHTDpGvDpMOkbiBuw6RreXZpbGzDpCBvbGV2YWEgc2l2dWEgdGFpIGt5c3lteXN0w6QuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS2lpdG9zIGt5c2VseXluIHZhc3RhYW1pc2VzdGEhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiS3lzZWx5w6QgbGFkYXRhYW4gcGFsdmVsaW1lbHRhLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZhbGl0c2UuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJWYXN0YWEga3lzeW15a3NlZW4sIGtpaXRvcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkFydm9uIHR1bGVlIG9sbGEgbnVtZWVyaW5lbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJPbGUgaHl2w6QgamEgc3nDtnTDpCB2w6RoaW50w6TDpG4gezB9IG1lcmtracOkLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJPbGUgaHl2w6QgamEgdmFsaXRzZSB2w6RoaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJPbGUgaHl2w6QgamEgdmFsaXRzZSBlbmludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHTDpHl0eXkgb2xsYSBlbmVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX0gamEgdsOkaGVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyB0w6R5dHl5IG9sbGEgZW5lbW3DpG4gdGFpIHlodMOkIHN1dXJpIGt1aW4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgdMOkeXR5eSBvbGxhIHbDpGhlbW3DpG4gdGFpIHlodMOkIHN1dXJpIGt1aW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTecO2dMOkIHZhbGlkaSBzw6Roa8O2cG9zdGlvc29pdGUuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogJ09sZSBoeXbDpCBqYSBzecO2dMOkIFwiTXV1IChrdXZhaWxlKVwiJ1xufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmaVwiXSA9IGZpbm5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmlcIl0gPSBcInN1b21hbGFpbmVuXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2Zpbm5pc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcsOpY8OpZGVudFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU3VpdmFudFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVGVybWluZXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkNvbW1lbmNlclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkF1dHJlIChwcsOpY2lzZXIpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJBdWN1blwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJUb3V0IHPDqWxlY3Rpb25uZXJcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IHN1ciB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiSWwgbid5IGEgbmkgcGFnZSB2aXNpYmxlIG5pIHF1ZXN0aW9uIHZpc2libGUgZGFucyBjZSBxdWVzdGlvbm5haXJlXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiTWVyY2kgZCdhdm9pciByw6lwb25kdSBhdSBxdWVzdGlvbm5haXJlICFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJOb3MgZG9ubsOpZXMgaW5kaXF1ZW50IHF1ZSB2b3VzIGF2ZXogZMOpasOgIHJlbXBsaSBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxlIHF1ZXN0aW9ubmFpcmUgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hvaXNpc3Nlei4uLlwiLFxuICB2YWx1ZTogXCJ2YWxldXJcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJMYSByw6lwb25zZSDDoCBjZXR0ZSBxdWVzdGlvbiBlc3Qgb2JsaWdhdG9pcmUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIk1lcmNpIGRlIHLDqXBvbmRyZSBhdSBtb2lucyDDoCB1bmUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVG91dGVzIGxlcyBsaWduZXMgc29udCBvYmxpZ2F0b2lyZXNcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkxhIHLDqXBvbnNlIGRvaXQgw6p0cmUgdW4gbm9tYnJlLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk1lcmNpIGRlIHNhaXNpciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTWVyY2kgZGUgc2Fpc2lyIG1vaW5zIGRlIHswfSBjYXJhY3TDqHJlcy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJNZXJjaSBkZSBzYWlzaXIgZW50cmUgezB9IGV0IHsxfSBjYXJhY3TDqHJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJNZXJjaSBkZSBjb21wbMOpdGVyIGF1IG1vaW5zIHswfSBsaWduZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbWluaW11bSB7MH0gcsOpcG9uc2VzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIGF1IG1heGltdW0gezB9IHLDqXBvbnNlcy5cIixcbiAgbnVtZXJpY01pbk1heDogXCJWb3RyZSByw6lwb25zZSAnezB9JyBkb2l0IMOqdHJlIHN1cMOpcmlldXJlIG91IMOpZ2FsZSDDoCB7MX0gZXQgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgc3Vww6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTWVyY2kgZCdlbnRyZXIgdW5lIGFkcmVzc2UgbWFpbCB2YWxpZGUuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkwnZXhwcmVzc2lvbjogezB9IGRvaXQgcmV0b3VybmVyICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHJlcXXDqnRlIGEgcmVudm95w6kgdW5lIGVycmV1ciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJMYSByZXF1w6p0ZSBhIHJlbnZvecOpIGRlcyBkb25uw6llcyB2aWRlcyBvdSBsYSBwcm9wcmnDqXTDqSAncGF0aCcgZXN0IGluY29ycmVjdGVcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJMYSB0YWlsbGUgZHUgZmljaGllciBuZSBkb2l0IHBhcyBleGPDqWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJNZXJjaSBkZSBwcsOpY2lzZXIgbGUgY2hhbXAgJ0F1dHJlJy5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJWb3RyZSBmaWNoaWVyIGVzdCBlbiBjb3VycyBkZSBjaGFyZ2VtZW50LiBNZXJjaSBkJ2F0dGVuZHJlIHF1ZWxxdWVzIHNlY29uZGVzIGV0IGRlIHLDqWVzc2F5ZXIuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNoYXJnZW1lbnQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJBam91dGVyIGRlcyBmaWNoaWVycy4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIlZvdWxlei12b3VzIHN1cHByaW1lciBjZXQgZW5yZWdpc3RyZW1lbnQgP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkNldHRlIHZhbGV1ciBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgYWRkQ29sdW1uOiBcIkFqb3V0ZXIgdW5lIGNvbG9ubmVcIixcbiAgYWRkUm93OiBcIkFqb3V0ZXIgdW5lIGxpZ25lXCIsXG4gIHJlbW92ZVJvdzogXCJTdXBwcmltZXJcIixcbiAgYWRkUGFuZWw6IFwiQWpvdXRlclwiLFxuICByZW1vdmVQYW5lbDogXCJTdXBwcmltZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2xvbm5lXCIsXG4gIG1hdHJpeF9yb3c6IFwiTGlnbmVcIixcbiAgc2F2aW5nRGF0YTogXCJMZXMgcsOpc3VsdGF0cyBzb250IGVuIGNvdXJzIGRlIHNhdXZlZ2FyZGUgc3VyIGxlIHNlcnZldXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlVuZSBlcnJldXIgZXN0IHN1cnZlbnVlIGV0IGEgZW1ww6pjaMOpIGxhIHNhdXZlZ2FyZGUgZGVzIHLDqXN1bHRhdHMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkxlcyByw6lzdWx0YXRzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpcyAhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJSw6llc3NheWVyXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgY2V0dGUgcGFnZSBldCB7MX0gYXUgdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciBjZXR0ZSBwYWdlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IGF1IHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciB7MX0gc3VyIGNldHRlIHBhZ2UgZXQgezJ9IHN1ciB7M30gYXUgdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciB7MX0gc3VyIGNldHRlIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIHsxfSBhdSB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIk5ldHRveWVyXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJWaWRlclwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJFbmxldmVyIGNlIGZpY2hpZXJcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJPdWlcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5vblwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZyXCJdID0gZnJlbmNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZyXCJdID0gXCJmcmFuw6dhaXNcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZW9yZ2lhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLhg6Phg5nhg5Dhg5xcIixcbiAgcGFnZU5leHRUZXh0OiBcIuGDqOGDlOGDm+GDk+GDlOGDklwiLFxuICBjb21wbGV0ZVRleHQ6IFwi4YOT4YOQ4YOh4YOg4YOj4YOa4YOU4YOR4YOQXCIsXG4gIHByb2dyZXNzVGV4dDogXCLhg5Lhg5Xhg5Thg6Dhg5Phg5ggezB9IC8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIuGDkOGDoOGDquGDlOGDoOGDl+GDmCDhg5nhg5jhg5fhg67hg5Xhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLhg5Lhg5vhg5Dhg5Phg5rhg53hg5Hhg5cg4YOZ4YOY4YOX4YOu4YOV4YOQ4YOg4YOY4YOhIOGDqOGDlOGDleGDoeGDlOGDkeGDmOGDoeGDl+GDleGDmOGDoSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLhg6nhg5Dhg6Lhg5Xhg5jhg6Dhg5fhg5Xhg5Ag4YOh4YOU4YOg4YOV4YOU4YOg4YOY4YOT4YOQ4YOcLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi4YOh4YOu4YOV4YOQICjhg5Lhg5fhg67hg53hg5Xhg5cg4YOb4YOY4YOj4YOX4YOY4YOX4YOU4YOXKVwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLhg5Dhg6Dhg6nhg5Thg5Xhg5AuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOj4YOe4YOQ4YOh4YOj4YOu4YOU4YOXIOGDmeGDmOGDl+GDruGDleGDkOGDoS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIuGDnuGDkOGDoeGDo+GDruGDmCDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDoOGDmOGDquGDruGDleGDmC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOY4YOn4YOV4YOQ4YOc4YOU4YOXIOGDkOGDoOGDkOGDnOGDkOGDmeGDmuGDlOGDkSB7MH0g4YOh4YOY4YOb4YOR4YOd4YOa4YOdLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOQ4YOY4YOg4YOp4YOY4YOU4YOXIOGDkOGDoOGDkOGDnOGDkOGDmeGDmuGDlOGDkSB7MH0g4YOV4YOQ4YOg4YOY4YOQ4YOc4YOi4YOYLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOQ4YOY4YOg4YOp4YOY4YOU4YOXIOGDkOGDoOGDkOGDo+GDm+GDlOGDouGDlOGDoSB7MH0g4YOV4YOQ4YOg4YOY4YOQ4YOc4YOi4YOYLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg5vhg5Thg6Lhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCwg4YOV4YOY4YOT4YOg4YOUIHsxfSwg4YOT4YOQIOGDnOGDkOGDmeGDmuGDlOGDkeGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYIOGDleGDmOGDk+GDoOGDlCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDm+GDlOGDouGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYIOGDleGDmOGDk+GDoOGDlCB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDnOGDkOGDmeGDmuGDlOGDkeGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYIOGDleGDmOGDk+GDoOGDlCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5jhg6fhg5Xhg5Dhg5zhg53hg5cg4YOU4YOaLiDhg6Thg53hg6Hhg6Lhg5jhg6Eg4YOg4YOU4YOQ4YOa4YOj4YOg4YOYIOGDm+GDmOGDoeGDkOGDm+GDkOGDoOGDl+GDmC5cIixcbiAgb3RoZXJSZXF1aXJlZEVyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDkOGDleGDoeGDlOGDlyDhg5Xhg5Thg5rhg5ggJ+GDoeGDruGDleGDkCdcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJrYVwiXSA9IGdlb3JnaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImthXCJdID0gXCLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5hcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ2VvcmdpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdlcm1hblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJadXLDvGNrXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJXZWl0ZXJcIixcbiAgY29tcGxldGVUZXh0OiBcIkFic2NobGllw59lblwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJTb25zdGlnZXMgKEJlc2NocmVpYnVuZylcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5pY2h0c1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJBbGxlIGF1c3fDpGhsZW5cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNlaXRlIHswfSB2b24gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkVzIGlzdCBrZWluZSBGcmFnZSB2b3JoYW5kZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRGFua2UsIGRhc3MgU2llIGRpZSBVbWZyYWdlIGFiZ2VzY2hsb3NzZW4gaGFiZW4hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJXaXIgaGFiZW4gZmVzdGdlc3RlbGx0LCBkYXNzIFNpZSBkaWVzZSBVbWZyYWdlIGJlcmVpdHMgYWJnZXNjaGxvc3NlbiBoYWJlbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJGcmFnZWJvZ2VuIHdpcmQgZ2VsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJCaXR0ZSBhdXN3w6RobGVuLi4uXCIsXG4gIHZhbHVlOiBcIldlcnRcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCaXR0ZSBiZWFudHdvcnRlbiBTaWUgZGllc2UgRnJhZ2UuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmUgRnJhZ2UuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQml0dGUgYmVhbnR3b3J0ZW4gU2llIGFsbGUgRnJhZ2VuLlwiLFxuICBudW1lcmljRXJyb3I6IFwiRGVyIFdlcnQgbXVzcyBlaW5lIFphaGwgc2Vpbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJCaXR0ZSBnZWJlbiBzaWUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlaW4uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG5pY2h0IG1laHIgYWxzIHswfSBaZWljaGVuIGVpbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJCaXR0ZSBnZWJlbiBzaWUgbWluZGVzdGVucyB7MH0gdW5kIG1heGltYWwgezF9IFplaWNoZW4gZWluLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkJpdHRlIG1hY2hlbiBTaWUgaW4gbWluZGVzdGVucyB7MH0gWmVpbGVuIGVpbmUgRWluZ2FiZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbWluZGVzdGVucyB7MH0gVmFyaWFudGUobikgYXVzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJCaXR0ZSB3w6RobGVuIFNpZSBuaWNodCBtZWhyIGFscyB7MH0gVmFyaWFudGUobikgYXVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgbXVzcyBncsO2w59lciBvZGVyIGdsZWljaCB7MX0gdW5kIGtsZWluZXIgb2RlciBnbGVpY2ggezJ9IHNlaW5cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBtdXNzIGdyw7bDn2VyIG9kZXIgZ2xlaWNoIHsxfSBzZWluXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgbXVzcyBrbGVpbmVyIG9kZXIgZ2xlaWNoIHsxfSBzZWluXCIsXG4gIGludmFsaWRFbWFpbDogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZSBnw7xsdGlnZSBFLU1haWwtQWRyZXNzZSBlaW4uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkRlciBBdXNkcnVjazogezB9IG11c3MgZGVuIFdlcnQgJ3dhaHInKHRydWUpIHp1csO8Y2tsaWVmZXJuLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRGllIEFuZnJhZ2UgbGllZmVydGUgZGVuIGZvbGdlbmRlbiBGZWhsZXIgenVyw7xjayAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkRpZSBBbmZyYWdlIGxpZWZlcnRlIGxlZXJlIERhdGVuIHp1csO8Y2sgb2RlciBkZXIgV2VydCBkZXIgVmFyaWFibGUgJ3BhdGgnIGlzdCBmYWxzY2hcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEaWUgRGF0ZWlncsO2w59lIGRhcmYgezB9IG5pY2h0IMO8YmVyc2NocmVpdGVuLlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQml0dGUgZ2ViZW4gU2llIGRlbiBhbmRlcmVuIFdlcnQgZWluLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiSWhyZSBEYXRlaSB3aXJkIGhvY2hnZWxhZGVuLiBCaXR0ZSB3YXJ0ZW4gU2llIGVpbiBwYWFyIFNla3VuZGVuIHVuZCB2ZXJzdWNoZW4gU2llIGVzIGRhbm4gZXJuZXV0LlwiLFxuICBsb2FkaW5nRmlsZTogXCJXaXJkIGdlbGFkZW4uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJEYXRlaShlbikgYXVzd8OkaGxlbi4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIldvbGxlbiBTaWUgZGVuIEVpbnRyYWcgbMO2c2NoZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGllc2VyIFdlcnQgbXVzcyBlaW5kZXV0aWcgc2Vpbi5cIixcbiAgYWRkQ29sdW1uOiBcIlNwYWx0ZSBoaW56dWbDvGdlblwiLFxuICBhZGRSb3c6IFwiWmVpbGUgaGluenVmw7xnZW5cIixcbiAgcmVtb3ZlUm93OiBcIkVudGZlcm5lblwiLFxuICBhZGRQYW5lbDogXCJOZXUgaGluenVmw7xnZW5cIixcbiAgcmVtb3ZlUGFuZWw6IFwiRW50ZmVybmVuXCIsXG4gIGNob2ljZXNfSXRlbTogXCJFbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU3BhbHRlXCIsXG4gIG1hdHJpeF9yb3c6IFwiWmVpbGVcIixcbiAgc2F2aW5nRGF0YTogXCJEaWUgRXJnZWJuaXNzZSB3ZXJkZW4gYXVmIGRlbSBTZXJ2ZXIgZ2VzcGVpY2hlcnQuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBEaWUgRXJnZWJuaXNzZSBrb25udGVuIG5pY2h0IGdlc3BlaWNoZXJ0IHdlcmRlbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRGllIEVyZ2Vibmlzc2Ugd3VyZGVuIGdlc3BlaWNoZXJ0IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiQml0dGUgdmVyc3VjaGVuIFNpZSBlcyBlcm5ldXRcIixcbiAgdGltZXJNaW46IFwiTWluLlwiLFxuICB0aW1lclNlYzogXCJTZWsuXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiU2llIHdhcmVuIHswfSBhdWYgZGllc2VyIFNlaXRlIHVuZCBpbnNnZXNhbXQgezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJTaWUgd2FyZW4gezB9IGF1ZiBkaWVzZXIgU2VpdGUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiU2llIGhhYmVuIGluc2dlc2FtdCB7MH0gYmVuw7Z0aWd0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiU2llIHdhcmVuIHswfSB2b24gezF9IGF1ZiBkaWVzZXIgU2VpdGUgdW5kIGluc2dlc2FtdCB7Mn0gdm9uIHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiU2llIHdhcmVuIHswfSB2b24gezF9IGF1ZiBkaWVzZXIgU2VpdGUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiU2llIGhhYmVuIGluc2dlc2FtdCB7MH0gdm9uIHsxfSBiZW7DtnRpZ3QuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJTYXViZXJcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkxlZXJlblwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJEYXRlaSBsw7ZzY2hlblwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImRlXCJdID0gZ2VybWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImRlXCJdID0gXCJkZXV0c2NoXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2dlcm1hbi50cyIsIi8vQ3JlYXRlZCBieSBodHRwczovL2dpdGh1Yi5jb20vYWdlbG9zcGFuYWdpb3Rha2lzXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdyZWVrU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIs6gz4HOv863zrPOv8+NzrzOtc69zr9cIixcbiAgcGFnZU5leHRUZXh0OiBcIs6Vz4DPjM68zrXOvc6/XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLOn867zr/Ous67zq7Pgc+Jz4POt1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIs6GzrvOu86/ICjPgM6xz4HOsc66zrHOu8+OIM60zrnOtc+FzrrPgc65zr3Or8+Dz4TOtSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIs6jzrXOu86vzrTOsSB7MH0gzrHPgM+MIHsxfVwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIs6UzrXOvSDPhc+AzqzPgc+HzrXOuSDOus6xzrzOr86xIM6/z4HOsc+Ezq4gz4POtc67zq/OtM6xIM6uIM6/z4HOsc+Ezq4gzrXPgc+Oz4TOt8+Dzrcgz4POtSDOsc+Fz4TPjCDPhM6/IM61z4HPic+EzrfOvM6xz4TOv867z4zOs865zr8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6XG4gICAgXCLOlc+Fz4fOsc+BzrnPg8+Ezr/Pjc68zrUgzrPOuc6xIM+EzrfOvSDPg8+FzrzPgM67zq7Pgc+Jz4POtyDOsc+Fz4TOv8+NIM+Ezr/PhSDOtc+Bz4nPhM63zrzOsc+Ezr/Ou86/zrPOr86/z4UhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwizqTOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/IM+Gzr/Pgc+Ez47Ovc61z4TOsc65IM6xz4DOvyDPhM6/IM60zrnOsc66zr/OvM65z4PPhM6uLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIs6Vz4DOuc67zq3Ovs+EzrUuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrfOvSDOtc+Bz47PhM63z4POty5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjpcbiAgICBcIs6gzrHPgc6xzrrOsc67z44gzrHPgM6xzr3PhM6uz4PPhM61IM+Dz4TOuc+CIM61z4HPic+Ezq7Pg861zrnPgiDPg861IM+MzrvOtc+CIM+EzrnPgiDOs8+BzrHOvM68zq3Pgi5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrHPgc65zrjOvM63z4TOuc66zq4uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+Dz43OvM6yzr/Ou86xLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDOs8+BzrHOvM68zq3Pgi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOtc+AzrnOu86tzr7PhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM61z4DOuc67zq3Ovs+EzrUgz4zPh865IM+AzrHPgc6xz4DOrM69z4kgzrHPgM6/IHswfSDPgM6xz4HOsc67zrvOsc6zzq3Pgi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIs6kzr8gJ3swfScgzrjOsSDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6vz4POvyDOriDOvM61zrPOsc67z43PhM61z4HOvyDOsc+Azr8gz4TOvyB7MX0gzrrOsc65IM6vz4POvyDOriDOvM65zrrPgc+Mz4TOtc+Bzr8gzrHPgM6/IM+Ezr8gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwizqTOvyAnezB9JyDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zrXOs86xzrvPjc+EzrXPgc6/IM6uIM65z4POvyDOvM61IM+Ezr8gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwizqTOvyAnezB9JyDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zrnOus+Bz4zPhM61z4HOvyDOriDOr8+Dzr8gzrHPgM6/IM+Ezr8gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLOoM6xz4HOsc66zrHOu8+OIM60z47Pg8+EzrUgzrzOuc6xIM6xz4DOv860zrXOus+Ezq4gzrTOuc61z43OuM+Fzr3Pg863IGUtbWFpbC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIs6XIM6xzq/PhM63z4POtyDOtc+Azq3Pg8+Ez4HOtc+IzrUgz4PPhs6szrvOvM6xICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDOus61zr3OrCDOtM61zrTOv868zq3Ovc6xIM6uIM63IM65zrTOuc+Mz4TOt8+EzrEgJ868zr/Ovc6/z4DOrM+EzrkvcGF0aCcgzrXOr869zrHOuSDOtc+Dz4bOsc67zrzOrc69zrdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLOpM6/IM68zq3Os861zrjOv8+CIM60zrXOvSDOvM+Azr/Pgc61zq8gzr3OsSDPhc+AzrXPgc6yzrHOr869zrXOuSDPhM6xIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM63zr0gz4TOuc68zq4gzrPOuc6xIM+Ezr8gz4DOtc60zq/OvyAnzqzOu867zr8nLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwizqTOvyDOsc+Bz4fOtc6vzr8gz4POsc+CIM6xzr3Otc6yzrHOr869zrXOuS4gzqDOsc+BzrHOus6xzrvPjiDPgM61z4HOuc68zq3Ovc61z4TOtSDOus6xz4DOv865zrEgzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xIM66zrHOuSDOtM6/zrrOuc68zqzPg8+EzrUgzr7Osc69zqwuXCIsXG4gIGFkZFJvdzogXCLOoM+Bzr/Pg864zq7Ous63IM6zz4HOsc68zrzOrs+CXCIsXG4gIHJlbW92ZVJvdzogXCLOkc+GzrHOr8+BzrXPg863XCJcbn07XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImdyXCJdID0gZ3JlZWtTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZ3JcIl0gPSBcIs61zrvOu863zr3Ouc66zqxcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGhlYnJld1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLXkNeX15XXqNeUXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLXp9eT15nXnteUXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLXodeZ15XXnVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi15PXoyB7MX0g157XqteV15ogezB9XCIsXG4gIGVtcHR5U3VydmV5OiBcIteQ15nXnyDXqdeQ15zXldeqXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi16rXldeT15Qg16LXnCDXnteZ15zXldeZINeU16nXkNec15XXnyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLXmNei15nXoNeUINee15TXqdeo16ouLi5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCLXkNeX16ggKNeg15Ag15zXqteQ16gpXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIteR15fXqC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIteQ16DXkCDXlNep15Eg16LXnCDXlNep15DXnNeUXCIsXG4gIG51bWVyaWNFcnJvcjogXCLXlNeq16nXldeR15Qg16bXqNeZ15vXlCDXnNeU15nXldeqINee16HXpNeoLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIteU15bXnyDXnNek15fXldeqIHswfSDXqteV15XXmdedLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLXkdeX16gg15zXpNeX15XXqiB7MH0g15DXpNep16jXldeZ15XXqi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi15HXl9eoINei15MgezB9INeQ16TXqdeo15XXmdeV16ouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug15LXk9eV15wg154gezF9LCDXldep15XXldeUINecLSB7Mn0g15DXlSDXpNeX15XXqiDXni0ge319XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINeS15PXldecINeeIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXp9eY158g154gezF9XCIsXG4gIGludmFsaWRFbWFpbDogJ9eU15bXnyDXm9eq15XXkdeqINeT15XXkFwi15wg15fXlden15nXqi4nLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6ICfXoNeQINec15TXlteZ158g16DXqteV16DXmdedINeR16nXk9eUIFwi15DXl9eoXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImhlXCJdID0gaGVicmV3U3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImhlXCJdID0gXCLXoteR16jXmdeqXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2hlYnJldy50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaHVuZ2FyaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlZpc3N6YVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG92w6FiYlwiLFxuICBjb21wbGV0ZVRleHQ6IFwiS8Opc3pcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJFZ3nDqWIgKGFkamEgbWVnKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiezB9Li97MX0gb2xkYWxcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS8O2c3rDtm5qw7xrLCBob2d5IGtpdMO2bHTDtnR0ZSBmZWxtw6lyw6lzw7xua2V0IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk3DoXIga2l0w7ZsdMO2dHRlIGEgZmVsbcOpcsOpc3QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRmVsbcOpcsOpcyBiZXTDtmx0w6lzZS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6FsYXNzem9uLi4uXCIsXG4gIHZhbHVlOiBcIsOpcnTDqWtcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJLw6lyasO8aywgdsOhbGFzem9samEgbWVnIGV6dCBhIGvDqXJkw6lzdCFcIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJLw6lyasO8ayBhZGpvbiB2w6FsYXN6dCBtaW5kZW4gc29yYmFuIVwiLFxuICBudW1lcmljRXJyb3I6IFwiQXogw6lydMOpayBzesOhbSBrZWxsLCBob2d5IGxlZ3llbiFcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJBZGpvbiBtZWcgbGVnYWzDoWJiIHswfSBrYXJha3RlcnQhXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTGVnZmVsamViYiB7MH0ga2FyYWt0ZXJ0IGFkam9uIG1lZyFcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJBZGpvbiBtZWcgbGVnYWzDoWJiIHswfSwgZGUgbGVnZmVsamViYiB7MX0ga2FyYWt0ZXJ0IVwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlTDtmx0c8O2biBraSBtaW5pbXVtIHswfSBzb3J0IVwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWw6FsYXNzem9uIGtpIGxlZ2Fsw6FiYiB7MH0gbGVoZXTFkXPDqWdldCFcIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiTmUgdsOhbGFzc3pvbiB0w7ZiYmV0LCBtaW50IHswfSBsZWhldMWRc8OpZyFcIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGxlZ3llbiBuYWd5b2JiLCB2YWd5IGVneWVubMWRLCBtaW50IHsxfSDDqXMga2lzZWJiLCB2YWd5IGVneWVubMWRLCBtaW50IHsyfSFcIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBsZWd5ZW4gbGVnYWzDoWJiIHsxfSFcIixcbiAgbnVtZXJpY01heDogXCJUaGUgJ3swfScgbmUgbGVneWVuIG5hZ3lvYmIsIG1pbnQgezF9IVwiLFxuICBpbnZhbGlkRW1haWw6IFwiQWRqb24gbWVnIGVneSB2YWzDs3MgZW1haWwgY8OtbWV0IVwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSBsZWvDqXJkZXrDqXMgaGliw6F2YWwgdMOpcnQgdmlzc3phOiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkEgbGVrw6lyZGV6w6lzIMO8cmVzIGFkYXR0YWwgdMOpcnQgdmlzc3phLCB2YWd5IGEgJ3BhdGgnIHBhcmFtw6l0ZXIgaGVseXRlbGVuLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkEgbcOpcmV0IG5lbSBsZWhldCBuYWd5b2JiLCBtaW50IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFkamEgbWVnIGF6IGVnecOpYiDDqXJ0w6lrZXQhXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGZWx0w7ZsdMOpcyBmb2x5YW1hdGJhbi4gVsOhcmpvbiBww6FyIG3DoXNvZHBlcmNldCwgbWFqZCBwcsOzYsOhbGphIMO6anJhLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIlTDtnJsaSBlenQgYSByZWtvcmRvdD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJBeiDDqXJ0w6lrbmVrIGVneWVkaW5layBrZWxsIGxlbm5pZS5cIixcbiAgYWRkUm93OiBcIlNvciBob3p6w6FhZMOhc2FcIixcbiAgcmVtb3ZlUm93OiBcIkVsdMOhdm9sw610w6FzXCIsXG4gIGFkZFBhbmVsOiBcIsOaaiBob3p6w6FhZMOhc2FcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgY2hvaWNlc19JdGVtOiBcImVsZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJPc3psb3BcIixcbiAgbWF0cml4X3JvdzogXCJTb3JcIixcbiAgc2F2aW5nRGF0YTogXCJFcmVkbcOpbnkgbWVudMOpc2UgYSBzemVydmVycmUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkVneSBoaWJhIGZvbHl0w6FuIG5lbSB0dWR0dWsgZWxtZW50ZW5pIGF6IGVyZWRtw6lueXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkVyZWRtw6lueSBzaWtlcmVzZW4gbWVudHZlIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDs2LDoWxqYSDDumpyYVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImh1XCJdID0gaHVuZ2FyaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImh1XCJdID0gXCJtYWd5YXJcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaHVuZ2FyaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpY2VsYW5kaWNTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVGlsYmFrYVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiw4FmcmFtXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJMb2tpw7BcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJIaW5uIChza8O9cmluZylcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlPDrcOwYSB7MH0gb2YgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIsOeYcOwIGVyIGVuZ2lubiBzw63DsGEgZcOwYSBzcHVybmluZ2FyIMOtIMO+ZXNzYXJpIGvDtm5udW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGFrayBmeXJpciBhw7AgZnlsbGphIMO6dCDDvmVzc2Ega8O2bm51biFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJLw7ZubnVuaW4gZXIgYcOwIGhsYcOwYS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWZWxkdS4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBzdmFyacOwIHNwdXJuaW5ndW5uaS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWaW5zYW1sZWdhc3Qgc3ZhcmnDsCBzcHVybmluZ3VtIMOtIMO2bGx1bSByw7bDsHVtLlwiLFxuICBudW1lcmljRXJyb3I6IFwiw55ldHRhIGdpbGRpIHZlcsOwdXIgYcOwIHZlcmEgdGFsYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBtaW5uc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1lc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIGZsZWlyaSBlbiB7MH0gb2cgZsOmcnJpIGVuIHsxfSB0w6Frbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWaW5zYW1sZWdhc3QgZnlsbGnDsCDDunIgYcOwIG1pbm5zdGEga29zdGkgezB9IHJhw7Bpci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmluc2FtbGVnYXN0IHZlbGppw7AgYcOwIG1pbm5zdGEga29zdGkgezB9IG3Dtmd1bGVpa2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGVra2kgZmxlaXJpIGVuIHswfSBtw7ZndWxlaWthLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX0gbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJ7MH0nIMOmdHRpIGHDsCB2ZXJhIG1laXJhIGVuIGXDsGEgamFmbnQgb2cgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZpbnNhbWxlZ2FzdCBzbMOhacOwIGlubiBnaWx0IG5ldGZhbmcuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJCZWnDsG5pbm4gc2tpbGHDsGkgZWZ0aXJmYXJhbmFkaSB2aWxsdSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJCZWnDsG5pbm5nIHNraWxhw7BpIGVuZ3VtIGfDtmdudW0gZcOwYSBzbMOzw7Bpbm4gdmFyIHLDtm5nXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiU2tyw6Fpbm4gc2thbCBla2tpIHZlcmEgc3TDpnJyaSBlbiB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJWaW5hbWxlZ2FzdCBmeWxsacOwIMO6dCBoaXR0IGdpbGRpw7AuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTa3LDoWlubiDDvsOtbiB2YXIgc2VuZC4gVmluc2FtbGVnYXN0IGLDrcOwacOwIMOtIG5va2tyYXIgc2Vrw7puZHVyIG9nIHJleW5pw7AgYWZ0dXIuXCIsXG4gIGFkZFJvdzogXCJCw6Z0YSB2acOwIHLDtsOwXCIsXG4gIHJlbW92ZVJvdzogXCJGamFybMOmZ2phXCIsXG4gIGNob2ljZXNfZmlyc3RJdGVtOiBcImZ5cnN0aSBobHV0dXJcIixcbiAgY2hvaWNlc19zZWNvbmRJdGVtOiBcImFubmFyIGhsdXR1clwiLFxuICBjaG9pY2VzX3RoaXJkSXRlbTogXCLDvnJpw7BqaSBobHV0dXJcIixcbiAgbWF0cml4X2NvbHVtbjogXCJEw6Fsa3VyXCIsXG4gIG1hdHJpeF9yb3c6IFwiUsO2w7BcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpc1wiXSA9IGljZWxhbmRpY1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJpc1wiXSA9IFwiw61zbGVuc2thXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaW5kb25lc2lhblN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJTZWJlbHVtbnlhXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZWxhbmp1dG55YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiU2VsZXNhaVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiTXVsYWlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJMYWlubnlhIChqZWxhc2thbilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIlRpZGFrIEFkYVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJQaWxpaCBTZW11YVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiSGFsYW1hbiB7MH0gZGFyaSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGlkYWsgYWRhIGhhbGFtYW4gYXRhdSBwZXJ0YW55YWFuIGRhbGFtIHN1cnZlaS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUZXJpbWEga2FzaWggdGVsYWggbWVueWVsZXNhaWthbiBzdXJ2ZWkhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJDYXRhdGFuIGthbWkgbWVudW5qdWtrYW4gYmFod2EgQW5kYSB0ZWxhaCBtZW55ZWxlc2Fpa2FuIHN1cnZlaSBpbmkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTWVtdWF0IHN1cnZlaS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJQaWxpaC4uLlwiLFxuICB2YWx1ZTogXCJuaWxhaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlNpbGFoa2FuIGphd2FiIHBlcnRhbnlhYW4gYmVyaWt1dC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiU2lsYWhrYW4gamF3YWIgc2V0aWRha255YSBzYXR1IHBldGFueWFhbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJTaWxhaGthbiBqYXdhYiBwZXJ0YW55YWFuIHBhZGEgc2VtdWEgYmFyaXMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJOaWxhaSBoYXJ1cyBiZXJ1cGEgYW5na2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiU2lsYWhrYW4gbWFzdWtrYW4gc2V0aWRha255YSB7MH0ga2FyYWt0ZXIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiU2lsYWhrYW4gbWFzdWtrYW4ga3VyYW5nIHswfSBrYXJha3Rlci5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQU2lsYWhrYW4gbWFzdWtrYW4gbGViaWggZGFyaSB7MH0gZGFuIGt1cmFuZyBkYXJpIHsxfSBrYXJha3Rlci5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJTaWxhaGthbiBpc2kgc2V0aWRha255YSB7MH0gYmFyaXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNpbGFoa2FuIHBpbGloIHNldGlkYWtueWEgezB9IHZhcmlhbi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2lsYWhrYW4gcGlsaWggdGlkYWsgbGViaWggZGFyaSB7MH0gdmFyaWFuLlwiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nIGhhcnVzIHNhbWEgZGVuZ2FuIGF0YXUgbGViaWggZGFyaSB7MX0gZGFuIGhhcnVzIHNhbWEgZGVuZ2FuIGF0YXUga3VyYW5nIGRhcmkgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgaGFydXMgc2FtYSBkZW5nYW4gYXRhdSBsZWJpaCBkYXJpIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGhhcnVzIHNhbWEgZGVuZ2FuIGF0YXUga3VyYW5nIGRhcmkgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTaWxhaGthbiBtYXN1a2thbiBlLW1haWwgeWFuZyBiZW5hci5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiRWtzcHJlc2k6IHswfSBoYXJ1cyBtZW5nZW1iYWxpa2FuICdiZW5hcicuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJQZXJtaW50YWFuIG1lbmdlbWJhbGlrYW4ga2VzYWxhaGFuICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIlBlcm1pbnRhYW4gbWVuZ2VtYmFsaWthbiBkYXRhIGtvc29uZyBhdGF1IHByb3BlcnRpICdwYXRoJyBzYWxhaC5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJVa3VyYW4gYmVya2FzIHRpZGFrIGJvbGVoIG1lbGViaWhpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpbGFoa2FuIG1hc3Vra2FuIG5pbGFpIGxhaW5ubnlhLlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIkJlcmthcyBBbmRhIHNlZGFuZyBkaXVuZ2dhaC4gU2lsYWhrYW4gdHVuZ2d1IGJlYmVyYXBhIHNhYXQgYXRhdSBjb2JhIGxhZ2kuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIk1lbXVhdC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlBpbGloIGJlcmthcy4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIkFwYWthaCBBbmRhIGluZ2luIG1lbmdoYXB1cyBjYXRhdGFuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIk5pbGFpIGhhcnVzIHVuaWsuXCIsXG4gIGFkZENvbHVtbjogXCJUYW1iYWgga29sb21cIixcbiAgYWRkUm93OiBcIlRhbWJhaCBiYXJpc1wiLFxuICByZW1vdmVSb3c6IFwiSGFwdXNcIixcbiAgYWRkUGFuZWw6IFwiVGFtYmFoIGJhcnVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiSGFwdXNcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2xvbVwiLFxuICBtYXRyaXhfcm93OiBcIkJhcmlzXCIsXG4gIHNhdmluZ0RhdGE6IFwiSGFzaWwgc2VkYW5nIGRpc2ltcGFuIHBhZGEgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJLZXNhbGFoYW4gdGVyamFkaSBkYW4ga2FtaSB0aWRhayBkYXBhdCBtZW55aW1wYW4gaGFzaWwuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkhhc2lsIHRlbGFoIHN1a3NlcyBkaXNpbXBhbiFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkNvYmEgbGFnaVwiLFxuICB0aW1lck1pbjogXCJtZW5pdFwiLFxuICB0aW1lclNlYzogXCJkZXRpa1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBwYWRhIGhhbGFtYW4gaW5pIGRhbiB7MX0gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJZQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IHBhZGEgaGFsYW1hbiBpbmkuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBkYXJpIHsxfSBwYWRhIGhhbGFtYW4gaW5pIGRhbiB7Mn0gZGFyaSB7M30gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gcGFkYSBoYWxhbWFuIGluaS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICBjbGVhbkNhcHRpb246IFwiQmVyc2loa2FuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJCZXJzaWhrYW5cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiSGFwdXMgYmVya2FzIGluaVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlkXCJdID0gaW5kb25lc2lhblN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJpZFwiXSA9IFwiQmFoYXNhIEluZG9uZXNpYVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9pbmRvbmVzaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZWNlZGVudGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1Y2Nlc3Npdm9cIixcbiAgY29tcGxldGVUZXh0OiBcIlNhbHZhXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJJbml6aW9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHRybyAoZGVzY3JpdmkpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOb24gY2kgc29ubyBwYWdpbmUgbyBkb21hbmRlIHZpc2liaWxpIG5lbCBxdWVzdGlvbmFyaW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhemllIHBlciBhdmVyIGNvbXBsZXRhdG8gaWwgcXVlc3Rpb25hcmlvIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlwiSSBub3N0cmkgcmVjb3JkcyBtb3N0cmFubyBjaGUgaGFpIGdpw6AgY29tcGxldGF0byBxdWVzdG8gcXVlc3Rpb25hcmlvLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNhcmljYW1lbnRvIGRlbCBxdWVzdGlvbmFyaW8gaW4gY29yc28uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2NlZ2xpLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkNhbXBvIG9iYmxpZ2F0b3Jpb1wiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQZXIgRmF2b3JlLCByaXNwb25kaSBhZCBhbG1lbm8gdW5hIGRvbWFuZGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQ29tcGxldGFyZSB0dXR0ZSBsZSByaWdoZVwiLFxuICBudW1lcmljRXJyb3I6IFwiSWwgdmFsb3JlIGRldmUgZXNzZXJlIG51bWVyaWNvXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiSW5zZXJpcmUgYWxtZW5vIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1heExlbmd0aDogXCJMdW5naGV6emEgbWFzc2ltYSBjb25zZW50aXRhIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIkluc2VyaXJlIHVuYSBzdHJpbmdhIGNvbiBtaW5pbW8gezB9IGUgbWFzc2ltbyB7MX0gY2FyYXR0ZXJpXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiQ29tcGxldGFyZSBhbG1lbm8gezB9IHJpZ2hlLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBhbG1lbm8gezB9IHZhcmlhbnRpLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBtYXNzaW1vIHswfSB2YXJpYW50aS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfSBlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiSW5zZXJpcmUgaW5kaXJpenpvIG1haWwgdmFsaWRvXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSByaWNoaWVzdGEgaGEgcmlzcG9zdG8gY29uIHVuIGVycm9yZSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHJpY2hpZXN0YSBoYSByaXNwb3N0byBudWxsIG9wcHVyZSBpbCBwZXJjb3JzbyBub24gw6ggY29ycmV0dG9cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJJbCBmaWxlIG5vbiBwdcOyIGVjY2VkZXJlIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiSW5zZXJpcmUgaWwgdmFsb3JlICdhbHRybydcIixcbiAgdXBsb2FkaW5nRmlsZTogXCJGaWxlIGluIGNhcmljYW1lbnRvLiBBdHRlbmRpIGFsY3VuaSBzZWNvbmRpIGUgcmlwcm92YVwiLFxuICBjb25maXJtRGVsZXRlOiBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgZWxtaW5hcmUgaWwgcmVjb3JkP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlF1ZXN0byB2YWxvcmUgZGV2ZSBlc3NlcmUgdW5pdm9jby5cIixcbiAgYWRkUm93OiBcIkFnZ2l1bmdpIHJpZ2FcIixcbiAgcmVtb3ZlUm93OiBcIlJpbXVvdmkgcmlnYVwiLFxuICBhZGRQYW5lbDogXCJBZ2dpdW5naSByaWdhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVsaW1pbmFcIixcbiAgY2hvaWNlc19JdGVtOiBcIkVsZW1lbnRvXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb25uYVwiLFxuICBtYXRyaXhfcm93OiBcIlJpZ2FcIixcbiAgc2F2aW5nRGF0YTogXCJTYWx2YXRhZ2dpbyBkYXRpIHN1bCBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlNpIMOoIHZlcmlmaWNhdG8gdW4gZXJyb3JlIGUgbm9uIMOoIHN0YXRvIHBvc3NpYmlsZSBzYWx2YXJlIGkgcmlzdWx0YXRpLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJJIHJpc3VsdGF0aSBzb25vIHN0YXRpIHNhbHZhdGkgY29uIHN1Y2Nlc3NvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmlwcm92YVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiSGFpIGltcGllZ2F0byB7MH0gc3UgcXVlc3RhIHBhZ2luYSBlIHsxfSBpbiB0b3RhbGUuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkhhaSBpbXBpZWdhdG8gezB9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gaW4gdG90YWxlLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEgZSB7Mn0gZGkgezN9IGluIHRvdGFsZS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IGluIHRvdGFsZS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlB1bGlzY2lcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpdFwiXSA9IGl0YWxpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaXRcIl0gPSBcIml0YWxpYW5vXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2l0YWxpYW4udHMiLCIvLyBVbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxyXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xyXG5cclxuZXhwb3J0IHZhciBqYXBhbmVzZVN1cnZleVN0cmluZ3MgPSB7XHJcbiAgcGFnZVByZXZUZXh0OiBcIuWJjeOBrlwiLFxyXG4gIHBhZ2VOZXh0VGV4dDogXCLmrKHjgbhcIixcclxuICBjb21wbGV0ZVRleHQ6IFwi5a6M5LqGXCIsXHJcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIuOCueOCv+ODvOODiFwiLFxyXG4gIG90aGVySXRlbVRleHQ6IFwi44Gd44Gu5LuW77yI6Kqs5piO77yJXCIsXHJcbiAgbm9uZUl0ZW1UZXh0OiBcIuOBquOBl1wiLFxyXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIuOBmeOBueOBpumBuOaKnlwiLFxyXG4gIHByb2dyZXNzVGV4dDogXCJ7MH0vezF96aCBXCIsXHJcbiAgZW1wdHlTdXJ2ZXk6IFwi44GT44Gu6Kq/5p+744Gr6KGo56S644Gn44GN44KL44Oa44O844K444KE6LOq5ZWP44Gv44GC44KK44G+44Gb44KTXCIsXHJcbiAgY29tcGxldGluZ1N1cnZleTogXCLoqr/mn7vjgpLlrozkuobjgZfjgabjgY/jgozjgabjgYLjgorjgYzjgajjgYbjgZTjgZbjgYTjgb7jgZfjgZ9cIixcclxuICBsb2FkaW5nU3VydmV5OiBcIuiqv+afu+OCkuODgOOCpuODs+ODreODvOODieS4rVwiLFxyXG4gIG9wdGlvbnNDYXB0aW9uOiBcIumBuOaKnlwiLFxyXG4gIHJlcXVpcmVkRXJyb3I6IFwi6LOq5ZWP44Gr44GK562U44GI5LiL44GV44GEXCIsXHJcbiAgbnVtZXJpY0Vycm9yOiBcIuaVsOWtl+OBp+OBlOiomOWFpeS4i+OBleOBhFwiLFxyXG4gIHRleHRNaW5MZW5ndGg6IFwiezB9IOaWh+Wtl+S7peS4iuOBp+WFpeWKm+OBl+OBpuS4i+OBleOBhFwiLFxyXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiezB96KGM5Lul5LiK44Gn5YWl5Yqb44GX44Gm5LiL44GV44GEXCIsXHJcbiAgbWluU2VsZWN0RXJyb3I6IFwiezB956iu6aGe5Lul5LiK44KS6YG45oqe44GX44Gm5LiL44GV44GEXCIsXHJcbiAgbnVtZXJpY01pbjogXCInezB9JyDjga/lkIznrYnjgYt7MX3jgojjgorlpKfjgY3jgY/jgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpNcIixcclxuICBudW1lcmljTWF4OiBcIid7MH0nIOOBr+WQjOetieOBi3sxfeOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk1wiLFxyXG4gIGludmFsaWRFbWFpbDogXCLmnInlirnjgarjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgpLjgZToqJjlhaXkuIvjgZXjgYRcIixcclxuICBleGNlZWRNYXhTaXplOiBcIuODleOCoeOCpOODq+OBruOCteOCpOOCuuOBr3swfeOCkui2heOBiOOBpuOBr+OBhOOBkeOBvuOBm+OCk1wiLFxyXG4gIHVwbG9hZGluZ0ZpbGU6XHJcbiAgICBcIuODleOCoeOCpOODq+OCkuOCouODg+ODl+ODreODvOODieS4reOBp+OBmeOAguOBl+OBsOOCieOBj+OBl+OBpuOBi+OCieWGjeW6puOBiuippuOBl+S4i+OBleOBhFwiLFxyXG4gIGxvYWRpbmdGaWxlOiBcIuiqreOBv+i+vOOBv+S4rVwiLFxyXG4gIGNob29zZUZpbGU6IFwi44OV44Kh44Kk44Or44KS6YG45oqeXCIsXHJcbiAgY2xlYW5DYXB0aW9uOiBcIuWJiumZpFwiLFxyXG4gIGNsZWFyQ2FwdGlvbjogXCLnqbrnmb1cIixcclxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLjgZPjga7jg5XjgqHjgqTjg6vjgpLliYrpmaRcIlxyXG59O1xyXG5cclxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXHJcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiamFcIl0gPSBqYXBhbmVzZVN1cnZleVN0cmluZ3M7XHJcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImphXCJdID0gXCLml6XmnKzoqp5cIjtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9qYXBhbmVzZS50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIga29yZWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuydtOyghFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi64uk7J2MXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLsmYTro4xcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIuyLnOyekVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuq4sO2DgCjshKTrqoUpXCIsXG4gIHByb2dyZXNzVGV4dDogXCLtjpjsnbTsp4AgezF9IOykkSB7MH1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi7ISk66y47KeA7JeQIOuztOyXrOyngOuKlCDtjpjsnbTsp4Drgpgg7KeI66y47J20IOyXhuyKteuLiOuLpFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuyEpOusuCDsobDsgqzrpbwg7JmE66OM7ZW0IOyjvOyFlOyEnCDqsJDsgqztlanri4jri6QhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwi6riw66Gd7JeQIOuUsOultOuptCDsnbTrr7gg7ISk66y4IOyhsOyCrOulvCDrp4jsuZjshajsirXri4jri6QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi7ISk66y47KGw7IKs6rCAIOuhnOuTnOykkeyeheuLiOuLpC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLshKDtg53tlZjsi63si5zsmKQuLi5cIixcbiAgdmFsdWU6IFwi6rCSXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi7KeI66y47JeQIOuLte2VmOyLnOyYpC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi7ZWY64KYIOydtOyDgeydmCDsp4jrrLjsl5Ag64u17ZWY7Iut7Iuc7JikLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuuqqOuToCDtlonsl5Ag7J6I64qUIOyniOusuOyXkCDri7XtlZjsi63si5zsmKQuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLqsJLsnYAg7Iir7J6Q7Jes7JW8IO2VqeuLiOuLpC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIOy1nOyGjCB7MH3snpDsl6zslbwg7J6F64uI64ukLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuuLteuzgOydmCDquLjsnbTripQgezB97J6Q66W8IOy0iOqzvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIHswfSAtIHsxfeyekCDsgqzsnbTsl6zslbwg7ZWp64uI64ukLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuy1nOyGjCB7MH3qsJzsnZgg7ZaJ7J2EIOyxhOyasOyLreyLnOyYpFwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLstZzshowgezB96rCc7J2YIOuzgOyImOulvCDshKDtg53tlZjsi63si5zsmKQuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuy1nOuMgCB7MH3qsJzsnZgg67OA7IiY66W8IOyEoO2Dne2VmOyLreyLnOyYpC5cIixcbiAgbnVtZXJpY01pbk1heDogXCInezB9J+ydgCB7MX3rs7Tri6Qg7YGs6rGw64KYIOqwmeqzoCB7Mn3rs7Tri6Qg7J6R6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgbnVtZXJpY01pbjogXCInezB9J+ydgCB7MX3rs7Tri6Qg7YGs6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgbnVtZXJpY01heDogXCInezB9J+ydgCB7MX3rs7Tri6Qg7J6R6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgaW52YWxpZEVtYWlsOiBcIuyYrOuwlOuluCDsnbTrqZTsnbwg7KO87IaM66W8IOyeheugpe2VmOyLreyLnOyYpC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi7ZGc7ZiE7IudOiB7MH3snYAgJ+ywuCfsnbTslrTslbwg7ZWp64uI64ukLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiJ3swfSfsnLzroZwg7J6Y66q765CcIOyalOyyreyeheuLiOuLpC4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLruYTslrTsnojripQg642w7J207YSw66W8IOyalOyyre2WiOqxsOuCmCDsnpjrqrvrkJwg7IaN7ISx7J2YIOqyveuhnOyeheuLiOuLpC5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLtjIzsnbwg7YGs6riw6rCAIHswfeydhCDstIjqs7wg7ZWgIOyImCDsl4bsirXri4jri6QuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLri6Trpbgg7KeI66y47J2EIOyekeyEse2VmOyLreyLnOyYpC5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCLtjIzsnbwg7JeF66Gc65OcIOykkeyeheuLiOuLpC4g7J6g7IucIO2bhCDri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikLlwiLFxuICBsb2FkaW5nRmlsZTogXCLroZzrk5wg7KSRLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi7YyM7J28IOyEoO2DnS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIuq4sOuhneydhCDsgq3soJztlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiIOydtCDqsJLsnYAg6rOg7Jyg7ZW07JW87ZWp64uI64ukLlwiLFxuICBhZGRDb2x1bW46IFwi7Je0IOy2lOqwgFwiLFxuICBhZGRSb3c6IFwi7ZaJIOy2lOqwgFwiLFxuICByZW1vdmVSb3c6IFwi7KCc6rGwXCIsXG4gIGFkZFBhbmVsOiBcIuyDiOuhreqyjCDstpTqsIBcIixcbiAgcmVtb3ZlUGFuZWw6IFwi7KCc6rGwXCIsXG4gIGNob2ljZXNfSXRlbTogXCLtla3rqqlcIixcbiAgbWF0cml4X2NvbHVtbjogXCLsl7RcIixcbiAgbWF0cml4X3JvdzogXCLtlolcIixcbiAgc2F2aW5nRGF0YTogXCLqsrDqs7zqsIAg7ISc67KE7JeQIOyggOyepSDspJHsnoXri4jri6QuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuyYpOulmOqwgCDrsJzsg53tlZjsl6wg6rKw6rO866W8IOyggOyepe2VoCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLqsrDqs7zqsIAg7ISx6rO17KCB7Jy866GcIOyggOyepeuQmOyXiOyKteuLiOuLpCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIuuLpOyLnCDsi5zrj4TtlZjsi63si5zsmKRcIixcbiAgdGltZXJNaW46IFwi67aEXCIsXG4gIHRpbWVyU2VjOiBcIuy0iFwiLFxuICB0aW1lclNwZW50QWxsOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB97J2EIOyGjOyalO2VtCDstJ0gezF97J20IOqxuOuguOyKteuLiOuLpC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi7ZiE7J6sIO2OmOydtOyngOyXkOyEnCB7MF3snbQg6rG466C47Iq164uI64ukXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi7LSdIHswfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwi7ZiE7J6sIO2OmOydtOyngOyXkOyEnCB7MH0vezF97J2EIOyGjOyalO2VtCDstJ0gezJ9L3szfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB9L3sxfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi7LSdIHswfS97MX3snbQg6rG466C47Iq164uI64ukLlwiLFxuICBjbGVhbkNhcHRpb246IFwi64um6riwXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLsp4DsmrDquLBcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJrb1wiXSA9IGtvcmVhblN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJrb1wiXSA9IFwi7ZWc6rWt7Ja0XCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2tvcmVhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbGF0dmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdHBha2HEvFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVMSBbMSBa1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiUGFiZWlndFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiTGFwcHVzZSB7MH0gbm8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk5hdiBuZXZpZW5hIGphdXTEgWp1bWEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiUGF0ZWljYW1pZXMgSnVtcyBwYXIgYW5rZXRhcyBhaXpwaWxkxKvFoWFudSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJJZWzEgWRlIG5vIHNlcnZlcmEuLi5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJDaXRzIChsxatkenUsIGFwcmFrc3RpZXQhKVwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJJenbEk2zEk3RpZXMuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJMxatkenUsIGF0YmlsZGlldCB1eiBqYXV0xIFqdW11IVwiLFxuICBudW1lcmljRXJyb3I6IFwiQXRiaWxkZWkgaXIgasSBYsWrdCBza2FpdGxpbS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJMxatkenUsIGlldmFkaWV0IHZpc21heiB7MH0gc2ltYm9sdXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzFq2R6dSwgaXp2xJNsaWV0aWVzIHZpc21heiB7MH0gdmFyaWFudHUuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzFq2R6dSwgaXp2xJNsaWV0aWVzIG5lIHZhaXJhayBwYXIgezB9IHZhcmlhbnRpZW0uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBqxIFixat0IHZpZW7EgWRhbSB2YWkgbGllbMSBa2FtIG5la8SBIHsxfSwgdW4gdmllbsSBZGFtIHZhaSBtYXrEgWthbSwgbmVrxIEgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBqxIFixat0IHZpZW7EgWRhbSB2YWkgbGllbMSBa2FtIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMWrZHp1LCBpZXZhZGlldCBwYXRpZXN1IGUtcGFzdGEgYWRyZXNpIVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6ICdMxatkenUsIGlldmFkaWV0IGRhdHVzIGxhdWvEgSBcIkNpdHNcIidcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibHZcIl0gPSBsYXR2aWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImx2XCJdID0gXCJsYXR2aWXFoXVcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vbGF0dmlhbi50cyIsIi8vVW5jb21tZW50IHRoaXMgbGluZSBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGVcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbGl0aHVhbmlhU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkF0Z2FsXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJUb2xpYXVcIixcbiAgY29tcGxldGVUZXh0OiBcIkJhaWd0aVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiUHJhZMSXdGlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJLaXRhICjEr3Zlc3RpKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTsSXcmFcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiUGFzaXJpbmt0aSB2aXN1c1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiUHVzbGFwaXMgezB9IGnFoSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiQXBrbGF1c29qZSBuxJdyYSBtYXRvbW8gcHVzbGFwaW8gYXIga2xhdXNpbW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRMSXa29qYW1lIHXFviBkYWx5dmF2aW3EhSBhcGtsYXVzb2plIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTcWrc8WzIMSvcmHFoWFpIHJvZG8sIGthZCBqYXUgYXRsaWtvdGUgxaFpxIUgYXBrbGF1c8SFLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlByYcWhb21lIHBhbGF1a3RpLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlBhc2lyaW5rdGkuLi5cIixcbiAgdmFsdWU6IFwicmVpa8WhbcSXXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQsWrdGluYSBhdHNha3l0aSDEryDFocSvIGtsYXVzaW3EhS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiQsWrdGluYSBhdHNha3l0aSBiZW50IMSvIHZpZW7EhSBrbGF1c2ltxIUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUHJhxaFvbWUgYXRzYWt5dGkgxK8ga2xhdXNpbXVzIHZpc29zZSBlaWx1dMSXc2UuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJUdXJpIGLFq3RpIHNrYWnEjWlhaS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQcmHFoW9tZSBzdXZlc3RpIGJlbnQgezB9IHNpbWJvbGl1cy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQcmHFoW9tZSBzdXZlc3RpIG1hxb5pYXUgbmVpIHswfSBzaW1ib2xpxbMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBkYXVnaWF1IG5laSB7MH0gaXIgbWHFvmlhdSBuZWkgezF9IHNpbWJvbGnFsy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmHFoW9tZSBzdXZlc3RpIG5lIG1hxb5pYXUgbmVpIHswfSBlaWx1xI1pxbMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlByYcWhb21lIHBhc2lyaW5rdGkgYmVudCB7MH0gdmFyaWFudMWzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQYXNpcmlua2l0ZSBuZSBkYXVnaWF1IGthaXAgezB9IHZhcmlhbnR1cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHR1cmkgYsWrdGkgbHlndXMgYXJiYSBkaWRlc25pcyBuZWkgezF9IGlyIGx5Z3VzIGFyYmEgbWHFvmVzbmlzIG5laSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyB0dXLEl3TFsyBixat0aSBseWd1cyBhcmJhIGRpZGVzbmlzIG5laSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyB0dXLEl3TFsyBixat0aSBseWd1cyBhciBtYcW+ZXNuaXMgdcW+IHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUHJhxaFvbWUgxK92ZXN0aSBnYWxpb2phbnTEryBlbGVrdHJvbmluaW8gcGHFoXRvIGFkcmVzxIUuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlJlaWvFoW3ElzogezB9IHR1cmkgZ3LEhcW+aW50aSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJVxb5rbGF1c2EgZ3LEhcW+aW5vIGtsYWlkxIUnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlXFvmtsYXVzYSBncsSFxb5pbm8gdHXFocSNaXVzIGR1b21lbmlzIGFyYmEgJ3BhdGgnIHNhdnlixJcgeXJhIG5ldGVpc2luZ2FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGYWlsbyBkeWRpcyBuZXR1cmkgdmlyxaF5dGkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwixK52ZXNraXRlIGtpdMSFIHJlaWvFoW3EmS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkrFq3PFsyBmYWlsYXMgeXJhIGtlbGlhbWFzLiBQYWxhdWtpdGUga2VsZXTEhSBzZWt1bmTFvmnFsyBpciBiYW5keWtpdGUgZGFyIGthcnTEhS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiUHJhxaFvbWUgcGFsYXVrdGkuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJQYXNpcmlua3RpIGZhaWzEhSh1cykuLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCJBciBub3JpdGUgacWhdHJpbnRpIMSvcmHFocSFP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIsWgaSByZWlrxaFtxJcgdHVyxJd0xbMgYsWrdGkgdW5pa2FsaS5cIixcbiAgYWRkQ29sdW1uOiBcIlByaWTEl3RpIHN0dWxwZWzEr1wiLFxuICBhZGRSb3c6IFwiUHJpZMSXdGkgZWlsdXTEmVwiLFxuICByZW1vdmVSb3c6IFwiScWhdHJpbnRpXCIsXG4gIGFkZFBhbmVsOiBcIlByaWTEl3RpIG5hdWrEhVwiLFxuICByZW1vdmVQYW5lbDogXCJJxaF0cmludGlcIixcbiAgY2hvaWNlc19JdGVtOiBcImVsZW1lbnRhc1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIlN0dWxwZWxpc1wiLFxuICBtYXRyaXhfcm93OiBcIkVpbHV0xJdcIixcbiAgc2F2aW5nRGF0YTogXCJSZXp1bHRhdGFpIHNhdWdvbWkgc2VydmVyeWplLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLErnZ5a28ga2xhaWRhIGlyIG1lcyBuZWdhbMSXam9tZSBpxaFzYXVnb3RpIHJlenVsdGF0xbMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdGF0YWkgYnV2byBpxaFzYXVnb3RpIHPEl2ttaW5nYWkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJCYW5keXRpIGRhciBrYXJ0xIVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlByYWxlaWRvdGUgezB9IMWhaWFtZSBwdXNsYXB5amUgaXIgezF9IGnFoSB2aXNvLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJQcmFsZWlkb3RlIHswfSDFoWlhbWUgcHVzbGFweWplLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlByYWxlaWRvdGUgezB9IGnFoSB2aXNvLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSDFoWlhbWUgcHVzbGFweWplIGlyIHsyfSBpxaEgezN9IGnFoSB2aXNvLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJQcmFsZWlkb3RlIHswfSBpxaEgezF9IMWhaWFtZSBwdXNsYXB5amUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSBpxaEgdmlzby5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIknFoXZhbHl0aVwiLFxuICBjbGVhckNhcHRpb246IFwiVmFseXRpXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIknFoXRyaW50aSDFocSvIGZhaWzEhVwiXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibHRcIl0gPSBsaXRodWFuaWFTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibHRcIl0gPSBcIkxpZXR1dmnFs1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9saXRodWFuaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBub3J3ZWdpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRm9ycmlnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiTmVzdGVcIixcbiAgY29tcGxldGVUZXh0OiBcIkZ1bGxmw7hyXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFubmV0IChiZXNrcml2KVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkZSB7MH0gYXYgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBlciBpbmdlbiBzeW5saWcgc2lkZSBlbGxlciBzcMO4cnNtw6VsIGkgdW5kZXJzw7hrZWxzZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGFrayBmb3IgYXQgZHUgZnVsbGbDuHJ0ZSB1bmRlcnPDuGtlbHNlbiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlbDpXJlIGRhdGEgdmlzZXIgYXQgZHUgYWxsZXJlZGUgaGFyIGdqZW5ub21mw7hydCBkZW5uZSB1bmRlcnPDuGtlbHNlbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJVbmRlcnPDuGtlbHNlbiBsYXN0ZXIuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmVsZy4uLlwiLFxuICB2YWx1ZTogXCJ2ZXJkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBzcMO4cnNtw6VsZXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBtaW5zdCBldHQgc3DDuHJzbcOlbC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWZW5ubGlnc3Qgc3ZhciBww6Ugc3DDuHJzbcOlbCBpIGFsbGUgcmFkZXIuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJWZXJkaWVuIHNrYWwgdsOmcmUgbnVtZXJpc2suXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtaW5zdCB7MH0gdGVnbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIG1pbmRyZSBlbm4gezB9IHRlZ24uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtZXIgZW5uIHswfSBvZyBtaW5kcmUgZW5uIHsxfSB0ZWduLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZlbm5saWdzdCBmeWxsIGlubiBtaW5zdCB7MH0gcmFkZXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZlbm5saWdzdCB2ZWxnIG1pbnN0IHswfSB2YXJpYW50ZXIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZlbm5saWdzdCBpa2tlIHZlbGcgbWVyIGVubiB7MH0gdmFyaWFudGVyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWVyIGVubiB7MX0gb2cgbGlrIGVsbGVyIG1pbmRyZSBlbm4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWVyIGVubiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBiw7hyIHbDpnJlIGxpayBlbGxlciBtaW5kcmUgZW5uIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBlbiBneWxkaWcgZS1wb3N0IGFkcmVzc2UuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJGb3Jlc3DDuHJzZWxlbiByZXR1cm5lcnRlIGZlaWxlbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkZvcmVzcMO4cnNlbGVuIHJldHVybmVydGUgdG9tbWUgZGF0YSwgZWxsZXIgJ3N0aScgLWVnZW5za2FwZW4gZXIgZmVpbFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpbHN0w7hycmVsc2VuIGLDuHIgaWtrZSBvdmVyc3RpZ2UgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBkZW4gYW5kcmUgdmVyZGllbi5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZpbGVuIGRpbiBsYXN0ZXMgb3BwLiBWZW5ubGlnc3QgdmVudCBub2VuIHNla3VuZGVyIG9nIHByw7h2IGlnamVuLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIsOYbnNrZXIgZHUgw6Ugc2xldHRlIHBvc3Rlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEZW5uZSB2ZXJkaWVuIHNrYWwgdsOmcmUgdW5pay5cIixcbiAgYWRkUm93OiBcIkxlZ2cgdGlsIHJhZFwiLFxuICByZW1vdmVSb3c6IFwiRmplcm5cIixcbiAgYWRkUGFuZWw6IFwiTGVnZyB0aWwgbnlcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRmplcm5lXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIlJhZFwiLFxuICBzYXZpbmdEYXRhOiBcIlJlc3VsdGF0ZW5lIGxhZ3JlcyBww6Ugc2VydmVyZW4gLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEZXQgb3Bwc3RvIGVuIGZlaWwsIG9nIHZpIGt1bm5lIGlra2UgbGFncmUgcmVzdWx0YXRlbmUuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZW5lIGJsZSBsYWdyZXQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsO4diBpZ2plblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBww6UgZGVubmUgc2lkZW4gb2cgezF9IHRvdGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBww6UgZGVubmUgc2lkZW4uXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSB0b3RhbHQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSBww6UgZGVubmUgc2lkZW4gb2cgdG90YWx0IHsyfSBhdiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gYXYgezF9IHDDpSBkZW5uZSBzaWRlbi5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSB0b3RhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5zXCJcbn07XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5vXCJdID0gbm9yd2VnaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5vXCJdID0gXCJub3Jza1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBlcnNpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi2YLYqNmE24xcIixcbiAgcGFnZU5leHRUZXh0OiBcItio2LnYr9uMXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYqtqp2YXbjNmEXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi2K/bjNqv2LEo2KrZiNi224zYrSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIti12YHYrdmHIHswfSDYp9iyIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLYtdmB2K3ZhyDYp9uMINuM2Kcg2q/YstuM2YbZhyDYp9uMINio2LHYp9uMINin24zZhiDZvtix2LPYtNmG2KfZhdmHINmF2YjYrNmI2K8g2YbbjNiz2KouXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi2KfYsiDYtNmF2Kcg2KjYp9io2Kog2KraqdmF24zZhCDYp9uM2YYg2b7Ysdiz2LTZhtin2YXZhyDZhdiq2LTaqdix24zZhVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi2KjZhyDZhti42LEg2YXbjCDYsdiz2K8g2YfZhSDZh9mFINin2qnZhtmI2YYg2b7Ysdiz2LTZhtin2YXZhyDYsdinINiq2qnZhduM2YQg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItiv2LHYrdin2YQg2KfbjNis2KfYryDZvtix2LPYtNmG2KfZhdmHXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItin2YbYqtiu2KfYqCDaqdmG24zYry4uLlwiLFxuICB2YWx1ZTogXCLZhdmC2K/Yp9ixXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi2YTYt9mB2Kcg2KjZhyDYs9mI2KfZhCDZvtin2LPYriDYr9mH24zYr1wiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmE2LfZgdinINio2Ycg2KrZhdin2YUg2LPYt9ixINmH2KfbjCDYs9mI2KfZhNin2Kog2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgbnVtZXJpY0Vycm9yOiBcItmF2YLYr9in2LEg2KjYp9uM2K8g2LnYr9iv24wg2KjYp9i02K9cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLZhNi32YHYpyDYrdiv2KfZgtmEICB7MH0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2qnZhdiq2LEg2KfYsiAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYrdix2YEg2Ygg2qnZhdiq2LEg2KfYsiB7MX0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItmE2LfZgdinINit2K/Yp9mC2YQgezB9INiz2LfYsSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2K3Yr9in2YLZhCB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYp9mG2KrYrtin2Kgg2qnZhtuM2K8uXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfScg2KjYp9uM2K8g2KjbjNmGIHsxfSDZiCB7Mn0g2KjYp9i02K9cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDYqNiy2LHar9iq2LEg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDYqNin24zYryDaqdmI2obaqdiq2LEg24zYpyDZhdiz2KfZiNuMIHsxfSDYqNin2LTYr1wiLFxuICBpbnZhbGlkRW1haWw6IFwi2YTYt9mB2Kcg2KfbjNmF24zZhCDYtdit24zYrSDYr9ix2Kwg2qnZhtuM2K9cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItiv2LHYrtmI2KfYs9iqINio2Kcg2K7Yt9inINix2YjYqNix2Ygg2LTYrzogJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi2K/Ysdiu2YjYp9iz2Kog2YXYs9uM2LHbjCDYrtin2YTbjCDYqNin2LLar9i02Kog2K/Yp9iv2Ycg24zYpyDZhdiz24zYsSDYr9ix2LPYqiDYqtmG2LjbjNmFINmG2LTYr9mHXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi2KjbjNi02KrYsduM2YYg2K3YrNmFINmF2KzYp9iyINmB2KfbjNmEOiB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItmF2YLYr9in2LEgJ9iv24zar9ixJyDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi2YHYp9uM2YQg2K/YsSDYrdin2YQg2KLbjNmE2YjYryDZhduMINio2KfYtNivLiDZhNi32YHYpyDYtdio2LEg2qnZhtuM2K8uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi2KLbjNinINmF2KfbjNmEINio2Ycg2K3YsNmBINin24zZhiDYsdiv24zZgSDZh9iz2KrbjNiv2J9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLYp9uM2YYg2YXZgtiv2KfYsSDYqNin24zYryDYutuM2LEg2Kraqdix2KfYsduMINio2KfYtNivXCIsXG4gIGFkZFJvdzogXCLYs9i32LEg2KzYr9uM2K9cIixcbiAgcmVtb3ZlUm93OiBcItit2LDZgVwiLFxuICBhZGRQYW5lbDogXCLYrNiv24zYr1wiLFxuICByZW1vdmVQYW5lbDogXCLYrdiw2YFcIixcbiAgY2hvaWNlc19JdGVtOiBcItii24zYqtmFXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi2LPYqtmI2YZcIixcbiAgbWF0cml4X3JvdzogXCLYs9i32LFcIixcbiAgc2F2aW5nRGF0YTogXCLZhtiq2KfbjNisINiv2LEg2K3Yp9mEINiw2K7bjNix2Ycg2LPYp9iy24wg2K/YsSDYs9ix2YjYsSDZhduMINio2KfYtNivXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLYrti32KfbjNuMINiv2LEg2LDYrtuM2LHZhyDYs9in2LLbjCDZhtiq2KfbjNisINix2K4g2K/Yp9iv2Ycg2KfYs9iqXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItmG2KrYp9uM2Kwg2KjYpyDZhdmI2YHZgtuM2Kog2LDYrtuM2LHZhyDYtNivXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLZhdis2K/YryDYqtmE2KfYtCDaqdmG24zYr1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmYVwiXSA9IHBlcnNpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmFcIl0gPSBcItmB2KfYsdmS2LPZkNmJXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BlcnNpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvbGlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJXc3RlY3pcIixcbiAgcGFnZU5leHRUZXh0OiBcIkRhbGVqXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJHb3Rvd2VcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJJbm5hIG9kcG93aWVkxbogKHdwaXN6KVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3Ryb25hIHswfSB6IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOaWUgbWEgd2lkb2N6bnljaCBweXRhxYQuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRHppxJlrdWplbXkgemEgd3lwZcWCbmllbmllIGFua2lldHkhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVHJ3YSB3Y3p5dHl3YW5pZSBhbmtpZXR5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIld5YmllcnouLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQcm9zesSZIG9kcG93aWVkemllxIcgbmEgdG8gcHl0YW5pZS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQcm9zesSZIG9kcG93aWVkemllxIcgbmEgd3N6eXN0a2llIHB5dGFuaWEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJXIHR5bSBwb2x1IG1vxbxuYSB3cGlzYcSHIHR5bGtvIGxpY3pieS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgY28gbmFqbW5pZWogezB9IHpuYWvDs3cuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIG1uaWVqIG5pxbwgezB9IHpuYWvDs3cuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIHdpxJljZWogbmnFvCB7MH0gaSBtbmllaiBuacW8IHsxfSB6bmFrw7N3LlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlByb3N6xJkgdXp1cGXFgm5pxIcgcHJ6eW5ham1uaWVqIHswfSB3aWVyc3p5LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgY28gbmFqbW5pZWogezB9IHBvenljamkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlByb3N6xJkgd3licmHEhyBuaWUgd2nEmWNlaiBuacW8IHswfSBwb3p5Y2ppLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX0gb3JheiBtbmllanN6YSBsdWIgcsOzd25hIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIHdpxJlrc3phIGx1YiByw7N3bmEgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgbW5pZWpzemEgbHViIHLDs3duYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlByb3N6xJkgcG9kYcSHIHByYXdpZMWCb3d5IGFkcmVzIGVtYWlsLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwixbvEhWRhbmllIHp3csOzY2nFgm8gYsWCxIVkICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwixbvEhWRhbmllIG5pZSB6d3LDs2NpxYJvIGRhbnljaCBhbGJvIMWbY2llxbxrYSBqZXN0IG5pZXByYXdpZMWCb3dhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiUm96bWlhciBwcnplc8WCYW5lZ28gcGxpa3UgbmllIG1vxbxlIHByemVrcmFjemHEhyB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQcm9zesSZIHBvZGHEhyBpbm7EhSBvZHBvd2llZMW6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiVHJ3YSBwcnplbm9zemVuaWUgVHdvamVnbyBwbGlrdSwgcHJvc3rEmSBzcHLDs2Jvd2HEhyBwb25vd25pZSB6YSBraWxrYSBzZWt1bmQuXCIsXG4gIGFkZFJvdzogXCJEb2RhaiB3aWVyc3pcIixcbiAgcmVtb3ZlUm93OiBcIlVzdcWEXCIsXG4gIGFkZFBhbmVsOiBcIkRvZGFqIHBhbmVsXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlVzdcWEXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIldpZXJzelwiLFxuICBzYXZpbmdEYXRhOiBcIlphcGlzdWrEmSB3eW5pa2kgYW5raWV0eSBuYSBzZXJ3ZXJ6ZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiV3lzdMSFcGnFgiBixYLEhWQgaSB3eW5pa2kgbmllIG1vZ8WCeSB6b3N0YcSHIHphcGlzYW5lLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJXeW5pa2kgem9zdGHFgnkgcG9wcmF3bmllIHphcGlzYW5lIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiU3Byw7NidWogcG9ub3duaWVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlNwxJlkemnFgmXFmyB7MH0gbmEgdGVqIHN0cm9uaWUgYSB3IHN1bWllIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiU3DEmWR6acWCZcWbIHswfSBuYSB0ZWogc3Ryb25pZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJTcMSZZHppxYJlxZsgdyBzbXVtaWUgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlNwxJlkemnFgmXFmyB7MH0geiB7MX0gbmEgdGVqIHN0cm9uaWUgYSB3IHN1bWllIHsyfSB6IHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiU3DEmWR6acWCZcWbIHswfSB6IHsxfSBuYSB0ZWogc3Ryb25pZVwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlNwxJlkemnFgmXFmyB7MH0geiB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJXeWN6ecWbxIdcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwbFwiXSA9IHBvbGlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJwbFwiXSA9IFwicG9sc2tpXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvbGlzaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcG9ydHVndWVzZVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiUHLDs3hpbW9cIixcbiAgY29tcGxldGVUZXh0OiBcIkZpbmFsaXphclwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQ29tZcOnYXJcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdXRyb3MgKGRlc2NyZXZlcilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5lbmh1bVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY2lvbmFyIFRvZG9zXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQw6FnaW5hIHswfSBkZSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTsOjbyBow6EgcMOhZ2luYSB2aXPDrXZlbCBvdSBwZXJndW50YSBuYSBwZXNxdWlzYS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJPYnJpZ2FkbyBwb3IgZmluYWxpemFyIGEgcGVzcXVpc2EhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJOb3Nzb3MgcmVnaXN0cm9zIG1vc3RyYW0gcXVlIHZvY8OqIGrDoSBmaW5hbGl6b3UgYSBwZXNxdWlzYS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBIHBlc3F1aXNhIGVzdMOhIGNhcnJlZ2FuZG8uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNpb25lLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCByZXNwb25kYSBhIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQb3IgZmF2b3IsIHJlc3BvbmRhIHBlbG8gbWVub3MgdW1hIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYXMgcGVyZ3VudGFzIGVtIHRvZGFzIGFzIGxpbmhhcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk8gdmFsb3IgZGV2ZSBzZXIgbnVtw6lyaWNvLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIHBlbG8gbWVub3MgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWVub3MgZGUgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWFpcyBkZSB7MH0gZSBtZW5vcyBkZSB7MX0gY2FyYWN0ZXJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmVlbmNoYSBwZWxvIG1lbm9zIHswfSBsaW5oYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNlbGVjaW9uZSBwZWxvIG1lbm9zIHswfSBvcMOnw7Vlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yLCBzZWxlY2lvbmUgbsOjbyBtYWlzIGRvIHF1ZSB7MH0gb3DDp8O1ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9IGUgaWd1YWwgb3UgbWVub3IgcXVlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IGluZmVyaW9yIGEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IsIGluZm9ybWUgdW0gZS1tYWlsIHbDoWxpZG8uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkEgZXhwcmVzc8OjbzogezB9IGRldmUgcmV0b3JuYXIgJ3ZlcmRhZGVpcm8nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSByZXF1aXNpw6fDo28gcmV0b3Jub3UgbyBlcnJvICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSByZXF1aXNpw6fDo28gbsOjbyByZXRvcm5vdSBkYWRvcyBvdSBvICdjYW1pbmhvJyBkYSByZXF1aXNpw6fDo28gbsOjbyBlc3TDoSBjb3JyZXRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTyB0YW1hbmhvIGRvIGFycXVpdm8gbsOjbyBkZXZlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIG8gb3V0cm8gdmFsb3IuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTZXUgYXJxdWl2byBlc3TDoSBzZW5kbyBjYXJyZWdhZG8uIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNhcnJlZ2FuZG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlY2lvbmUgbyhzKSBhcnF1aXZvKHMpLi4uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVGVtIGNlcnRlemEgcXVlIGRlc2VqYSBkZWxldGFyP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkVzc2UgdmFsb3IgZGV2ZSBzZXIgw7puaWNvLlwiLFxuICBhZGRDb2x1bW46IFwiQWRpY2lvbmFyIGNvbHVuYVwiLFxuICBhZGRSb3c6IFwiQWRpY2lvbmFyIGxpbmhhXCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVyIGxpbmhhXCIsXG4gIGFkZFBhbmVsOiBcIkFkaWNpb25hciBub3ZvXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bmFcIixcbiAgbWF0cml4X3JvdzogXCJMaW5oYVwiLFxuICBzYXZpbmdEYXRhOiBcIk9zIHJlc3VsdGFkb3MgZXN0byBzZW5kbyBzYWx2b3Mgbm8gc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIk9jb3JyZXUgdW0gZXJybyBlIG7Do28gZm9pIHBvc3PDrXZlbCBzYWx2YXIgb3MgcmVzdWx0YWRvcy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiT3MgcmVzdWx0YWRvcyBmb3JhbSBzYWx2b3MgY29tIHN1Y2Vzc28hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUZW50ZSBub3ZhbWVudGVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlZ1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvY8OqIGdhc3RvdSB7MH0gbmVzdGEgcMOhZ2luYSBlIHsxfSBubyB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBuZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvY8OqIGdhc3RvdSB7MH0gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBuZXN0YSBww6FnaW5hIGUgezJ9IGRlIHszfSBubyB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbmVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBubyB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkxpbXBhclwiLFxuICBjbGVhckNhcHRpb246IFwiTGltcGFyXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJlbW92ZXIgZXN0ZSBhcnF1aXZvXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInB0XCJdID0gXCJwb3J0dWd1w6pzXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJvbWFuaWFuU3VydmV5U3RyaW5nczogYW55ID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJVcm3Eg3RvclwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyZVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFsdHVsKHByZWNpemHFo2kpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpbiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTnUgc3VudCDDrm50cmVixINyaSBwZW50cnUgYWNlc3QgY2hlc3Rpb25hclwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlbEgyBtdWzFo3VtaW0gcGVudHJ1IHRpbXB1bCBhY29yZGF0IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNoZXN0aW9uYXJ1bCBzZSDDrm5jYXJjxIMuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQWxlZ2XFo2kuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJSxINzcHVuc3VsIGxhIGFjZWFzdMSDIMOubnRyZWJhcmUgZXN0ZSBvYmxpZ2F0b3JpdS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb2F0ZSByxINzcHVuc3VyaWxlIHN1bnQgb2JsaWdhdG9yaWlcIixcbiAgbnVtZXJpY0Vycm9yOiBcIlLEg3NwdW5zdWwgdHJlYnVpZSBzxIMgZmllIG51bWVyaWMuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1pbmltIHswfSBjYXJhY3RlcmUuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGHIm2kgbWluaW0gezB9IG9wxaNpdW5pLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJUcmVidWllIHPEgyBzZWxlY3RhyJtpIG1heGltIHswfSBvcMWjaXVuaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtYXJlIHNhdSBlZ2FsIGNhIHsxfSDFn8OuIG1haSBtaWMgc2F1IGVnYWwgY3UgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1pYyBzYXUgZWdhbCBjYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcWjaSBvIGFkcmVzYSBkZSBlbWFpbCB2YWxpZMSDLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRpbWVuc2l1bmVhIGZpxZ9pZXJ1bHVpIG51IHRyZWJ1aWUgc8SDIGRlcMSDxZ9lYXNjxIMgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVHJlYnVpZSBzxIMgY29tcGxldGHIm2kgY8OibXB1bCAnQWx0dWwnLlwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiRGluIMOubnJlZ2lzdHLEg3JpbGUgbm9hc3RyZSByZWllc2UgY8SDIGHIm2kgY29tcGxldGF0IGRlamEgYWNlc3QgY2hlc3Rpb25hci5cIixcbiAgdmFsdWU6IFwidmFsb2FyZVwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWxIMgcnVnxINtIHPEgyByxINzcHVuZGXIm2kgbGEgY2VsIHB1yJtpbiBvIMOubnRyZWJhcmUuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1heGltIHswfSBjYXJhY3RlcmUuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWFpIG11bHQgZGUgezB9IMiZaSBtYWkgcHXIm2luIGRlIHsxfSBjYXJhY3RlcmUuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVHJlYnVpZSBzxIMgY29tcGxldGHIm2kgbWluaW0gezB9IHLDom5kdXJpLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUmVxdWVzdC11bCBhIHJldHVybmF0IGVyb2FyZWEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJSZXF1ZXN0LXVsIG51IGEgcmV0dXJuYXQgZGF0ZSBzYXUgcHJvcHJpZXRhdGVhICdwYXRoJyBlc3RlIGluY29yZWN0xINcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZpyJlpZXJ1bCBkdW1uZWF2b2FzdHLEgyBlc3RlIMOubiBjdXJzIGRlIMOubmPEg3JjYXJlLiBWxIMgcnVnxINtIGHImXRlcHRhyJtpIGPDonRldmEgc2VjdW5kZSDImWkgcmV2ZW5pyJtpIGFwb2kuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiU3VudGXIm2kgc2lndXIgY8SDIGRvcmnIm2kgc8SDIMiZdGVyZ2XIm2kgw65ucmVnaXN0cmFyZWE/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVmFsb2FyZWEgdHJlYnVpZSBzxIMgZmllIHVuaWPEgy5cIixcbiAgYWRkUm93OiBcIkFkxIN1Z2FyZSByw6JuZFwiLFxuICByZW1vdmVSb3c6IFwiyJh0ZXJnZXJlXCIsXG4gIGFkZFBhbmVsOiBcIkFkxIN1Z2FyZVwiLFxuICByZW1vdmVQYW5lbDogXCLImHRlcmdlcmVcIixcbiAgY2hvaWNlc19JdGVtOiBcIm9wyJtpdW5lXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb2FuxINcIixcbiAgbWF0cml4X3JvdzogXCJSw6JuZFwiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdGF0ZWxlIHN1bnQgw65uIGN1cnMgZGUgc2FsdmFyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiQSBpbnRlcnZlbml0IG8gZXJvYXJlLCByZXp1bHRhdGVsZSBudSBhdSBwdXR1dCBmaSBzYWx2YXRlLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHRhdGVsZSBhdSBmb3N0IHNhbHZhdGUgY3Ugc3VjY2VzIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiw45uY2VyY2HIm2kgZGluIG5vdVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiQcibaSBwZXRyZWN1dCB7MH0gcGUgYWNlYXN0xIMgcGFnaW7EgyDImWkgezF9IMOubiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiQcibaSBwZXRyZWN1dCB7MH0gcGUgYWNlYXN0xIMgcGFnaW7Egy5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJByJtpIHBldHJlY3V0IHswfSDDrm4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJByJtpIHBldHJlY3V0IHswfSBkaW4gezF9IHBlIGFjZWFzdMSDIHBhZ2luxIMgyJlpIHsyfSBkaW4gezN9IMOubiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiQcibaSBwZXRyZWN1dCB7MH0gZGluIHsxfSBwZSBhY2Vhc3TEgyBwYWdpbsSDLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkHIm2kgcGV0cmVjdXQgezB9IGRpbiB7MX0gw65uIHRvdGFsLlwiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJyb1wiXSA9IHJvbWFuaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJvXCJdID0gXCJyb23Dom7Eg1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9yb21hbmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcnVzc2lhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQndCw0LfQsNC0XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQlNCw0LvQtdC1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQk9C+0YLQvtCy0L5cIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0YLRjFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L7QtSAo0L/QvtC20LDQu9GD0LnRgdGC0LAsINC+0L/QuNGI0LjRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QtdGCXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCS0YvQsdGA0LDRgtGMINCy0YHRkVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtGA0LDQvdC40YbQsCB7MH0g0LjQtyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0J3QtdGCINC90Lgg0L7QtNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCS0LDRgSDQt9CwINC30LDQv9C+0LvQvdC10L3QuNC1INCw0L3QutC10YLRiyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItCS0Ysg0YPQttC1INC/0YDQvtGF0L7QtNC40LvQuCDRjdGC0L7RgiDQvtC/0YDQvtGBLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCX0LDQs9GA0YPQt9C60LAg0YEg0YHQtdGA0LLQtdGA0LAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JLRi9Cx0YDQsNGC0YwuLi5cIixcbiAgdmFsdWU6IFwi0LfQvdCw0YfQtdC90LjQtVwiLFxuICByZXF1aXJlZEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L7RgtCy0LXRgtGM0YLQtSDQv9C+INC60YDQsNC50L3QtdC5INC80LXRgNC1INC90LAg0L7QtNC40L0g0LLQvtC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGB0Ysg0LIg0LrQsNC20LTQvtC5INGB0YLRgNC+0LrQtS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcItCe0YLQstC10YIg0LTQvtC70LbQtdC9INCx0YvRgtGMINGH0LjRgdC70L7QvC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCDQstCy0LXQtNC40YLQtSDQsdC+0LvRjNGI0LUgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAg0LLQstC10LTQuNGC0LUg0LzQtdC90YzRiNC1IHswfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItCf0L7QttCw0LvRg9C50YHRgtCwINCy0LLQtdC00LjRgtC1INCx0L7Qu9GM0YjQtSB7MH0g0Lgg0LzQtdC90YzRiNC1IHsxfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQt9Cw0L/QvtC70L3QuNGC0LUg0L3QtSDQvNC10L3RjNGI0LUgezB9INGB0YLRgNC+0LouXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INGF0L7RgtGPINCx0YsgezB9INCy0LDRgNC40LDQvdGC0L7Qsi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0YvQsdC10YDQuNGC0LUg0L3QtSDQsdC+0LvQtdC1IHswfSDQstCw0YDQuNCw0L3RgtC+0LIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQvNC10L3RjNGI0LUg0YfQtdC8IHsxfSwg0Lgg0L3QtSDQsdC+0LvRjNGI0LUg0YfQtdC8IHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINC00L7Qu9C20L3QviDQsdGL0YLRjCDQvdC1INC80LXQvdGM0YjQtSDRh9C10LwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LUg0LHQvtC70YzRiNC1INGH0LXQvCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3Ri9C5INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQktGL0YDQsNC20LXQvdC40LUgezB9INC00L7Qu9C20L3QviDQstC+0LfQstGA0LDRidCw0YLRjCAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQl9Cw0L/RgNC+0YEg0LLQtdGA0L3Rg9C7INC+0YjQuNCx0LrRgyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCe0YLQstC10YIg0L3QsCDQt9Cw0L/RgNC+0YEg0L/RgNC40YjQtdC7INC/0YPRgdGC0L7QuSDQuNC70Lgg0YHQstC+0LnRgdGC0LLQviAncGF0aCcg0YPQutCw0LfQsNC90L4g0L3QtdCy0LXRgNC90L5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQoNCw0LfQvNC10YAg0YTQsNC50LvQsCDQvdC1INC00L7Qu9C20LXQvSDQv9GA0LXQstGL0YjQsNGC0YwgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LDQvdC90YvQtSDQsiDQv9C+0LvQtSAn0JTRgNGD0LPQvtC1J1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGIINGE0LDQudC7INC30LDQs9GA0YPQttCw0LXRgtGB0Y8uINCf0L7QtNC+0LbQtNC40YLQtSDQvdC10YHQutC+0LvRjNC60L4g0YHQtdC60YPQvdC0INC4INC/0L7Qv9GA0L7QsdGD0LnRgtC1INGB0L3QvtCy0LAuXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDQs9GA0YPQt9C60LAuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQktGL0LHQtdGA0LjRgtC1INGE0LDQudC7KNGLKS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCS0Ysg0YLQvtGH0L3QviDRhdC+0YLQuNGC0LUg0YPQtNCw0LvQuNGC0Ywg0LfQsNC/0LjRgdGMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCt0YLQviDQt9C90LDRh9C10L3QuNC1INC00L7Qu9C20L3QviDQsdGL0YLRjCDRg9C90LjQutCw0LvRjNC90YvQvC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QsdCw0LLQuNGC0Ywg0LrQvtC70L7QvdC60YNcIixcbiAgYWRkUm93OiBcItCU0L7QsdCw0LLQuNGC0Ywg0YHRgtGA0L7QutGDXCIsXG4gIHJlbW92ZVJvdzogXCLQo9C00LDQu9C40YLRjFwiLFxuICBhZGRQYW5lbDogXCLQlNC+0LHQsNCy0LjRgtGMINC90L7QstGD0Y5cIixcbiAgcmVtb3ZlUGFuZWw6IFwi0KPQtNCw0LvQuNGC0YxcIixcbiAgY2hvaWNlc19JdGVtOiBcItCS0LDRgNC40LDQvdGCXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0JrQvtC70L7QvdC60LBcIixcbiAgbWF0cml4X3JvdzogXCLQodGC0YDQvtC60LBcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YzRgtCw0YLRiyDRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPINC90LAg0YHQtdGA0LLQtdGALi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQn9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwLCDRgNC10LfRg9C70YzRgtCw0YIg0L3QtSDQsdGL0Lsg0YHQvtGF0YDQsNC90ZHQvS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GM0YLQsNGCINGD0YHQv9C10YjQvdC+INGB0L7RhdGA0LDQvdGR0L0hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQn9C+0L/RgNC+0LHQvtCy0LDRgtGMINGB0L3QvtCy0LBcIixcbiAgdGltZXJNaW46IFwi0LzQuNC9XCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUg0LggezF9INCy0YHQtdCz0L4uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INCyINGC0LXRh9C10L3QuNC1INGC0LXRgdGC0LAuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1INC4IHsyfSDQuNC3IHszfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQuNC3IHsxfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICBjbGVhbkNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICBjbGVhckNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQo9C00LDQu9C40YLRjCDRhNCw0LnQu1wiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInJ1XCJdID0gcnVzc2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJydVwiXSA9IFwi0YDRg9GB0YHQutC40LlcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aG1XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpobVcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi5byA5aeL6Zeu5Y23XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi5aGr5YaZ5YW25LuW562U5qGIXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLml6BcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi6YCJ5oup5YWo6YOoXCIsXG4gIHByb2dyZXNzVGV4dDogXCLnrKwgezB9IOmhtSwg5YWxIHsxfSDpobVcIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIuesrCB7MH0vezF9IOmimFwiLFxuICBlbXB0eVN1cnZleTogXCLpl67ljbfkuK3msqHmnInpl67popjmiJbpobXpnaJcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLkvaDlt7LlrozmiJDpl67ljbcuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6LCi5oKo55qE5Y+C5LiOIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIumXruWNt+ato+WcqOWKoOi9veS4rS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLor7fpgInmi6kuLi5cIixcbiAgdmFsdWU6IFwi5YC8XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi6K+35aGr5YaZ5q2k6Zeu6aKYXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIuiHs+WwkeWbnuetlOS4gOmimC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLor7floavlhpnmiYDmnInooYzkuK3pl67pophcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuetlOahiOW/hemhu+aYr+S4quaVsOWtl1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVv+W6puiHs+WwkSB7MH0g5Liq5a2X56ymXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5LiN6IO96LaF6L+HIHswfSDkuKrlrZfnrKZcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplb/luqblv4XpobvlnKggezB9IC0gezF9IOS4quWtl+espuS5i+mXtFwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WGmSB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX0g5LiU5bCP5LqO562J5LqOIHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpobvlpKfkuo7nrYnkuo4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wwj+S6juetieS6jiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuivt+i+k+WFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi5YWs5byPOiB7MH0g5peg5pWILlwiLCBcbiAgdXJsUmVxdWVzdEVycm9yOiBcIui9veWFpemAiemhueaXtuWPkeeUn+mUmeivryAnezB9JzogezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLmnKrog73ovb3lhaXmnInmlYjnmoTpgInpobnmiJbor7fmsYLlj4LmlbDot6/lvoTmnInor69cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXov4cgezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLor7flrozmiJDlhbbku5bpl67pophcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLmlofku7bkuIrkvKDkuK0uLi4g6K+36ICQ5b+D562J5b6F5Yeg56eS5ZCO6YeN6K+VXCIsXG4gIGxvYWRpbmdGaWxlOiBcIuWKoOi9vS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIumAieaLqeaWh+S7ti4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi5pyq6YCJ5oup5paH5Lu2XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi5Yig6Zmk6K6w5b2VP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIuS4u+mUruS4jeiDvemHjeWkjVwiLFxuICBhZGRDb2x1bW46IFwi5re75Yqg5YiXXCIsXG4gIGFkZFJvdzogXCLmt7vliqDooYxcIixcbiAgcmVtb3ZlUm93OiBcIuWIoOmZpOetlOahiFwiLFxuICBhZGRQYW5lbDogXCLmlrDmt7tcIixcbiAgcmVtb3ZlUGFuZWw6IFwi5Yig6ZmkXCIsXG4gIGNob2ljZXNfSXRlbTogXCLpgInpoblcIixcbiAgbWF0cml4X2NvbHVtbjogXCLliJdcIixcbiAgbWF0cml4X3JvdzogXCLooYxcIixcbiAgc2F2aW5nRGF0YTogXCLmraPlnKjlsIbnu5Pmnpzkv53lrZjliLDmnI3liqHlmaguLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuWcqOS/neWtmOe7k+aenOi/h+eoi+S4reWPkeeUn+S6humUmeivr++8jOe7k+aenOacquiDveS/neWtmFwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLnu5Pmnpzkv53lrZjmiJDlip8hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLor7fph43or5VcIixcbiAgdGltZXJNaW46IFwi5YiGXCIsXG4gIHRpbWVyU2VjOiBcIuenklwiLFxuICB0aW1lclNwZW50QWxsOiBcIuacrOmhteeUqOaXtiB7MH0g5oC76K6h55So5pe2ezF9IC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi5pys6aG155So5pe2ezB9IC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLmgLvorqHnlKjml7YgezB9IC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIuacrOmhteeUqOaXtiB7MH0g5YWxIHsxfe+8jCDmgLvorqHnlKjml7YgezJ9IOWFsSB7M30gLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLmnKzpobXnlKjml7YgezB9IOWFsSB7MX0gLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuaAu+iuoeeUqOaXtiB7MH0g5YWxIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIua4heeQhlwiLFxuICBjbGVhckNhcHRpb246IFwi5riF6ZmkXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIuenu+mZpOaWh+S7tlwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInpoLWNuXCJdID0gc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtY25cIl0gPSBcIueugOS9k+S4reaWh1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHNwYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNpZ3VpZW50ZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldG9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdHJvIChkZXNjcmliYSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlDDoWdpbmEgezB9IGRlIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJObyBoYXkgcMOhZ2luYSB2aXNpYmxlIG8gcHJlZ3VudGEgZW4gbGEgZW5jdWVzdGEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhY2lhcyBwb3IgY29tcGxldGFyIGxhIGVuY3Vlc3RhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxhIGVuY3Vlc3RhIGVzdMOhIGNhcmdhbmRvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmUuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGEgcHJlZ3VudGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUG9yIGZhdm9yIGNvbnRlc3RlIGxhcyBwcmVndW50YXMgZW4gY2FkYSBoaWxlcmEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJMYSBlc3RpbWFjacOzbiBkZWJlIHNlciBudW3DqXJpY2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIHBvciBsbyBtZW5vcyB7MH0gc8OtbWJvbG9zLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBtZW5vcyBkZSB7MH0gc8OtbWJvbG9zLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBtw6FzIGRlIHswfSB5IG1lbm9zIGRlIHsxfSBzw61tYm9sb3MuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUG9yIGZhdm9yIGxsZW5lIHBvciBsbyBtZW5vcyB7MH0gaGlsZXJhcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yIHNlbGVjY2lvbmUgcG9yIGxvIG1lbm9zIHswfSB2YXJpYW50ZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciBzZWxlY2Npb25lIG5vIG3DoXMgZGUgezB9IHZhcmlhbnRlcy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIkVsICd7MH0nIGRlYmUgZGUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX0geSBpZ3VhbCBvIG1lbm9zIGRlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJFbCAnezB9JyBkZWJlIHNlciBpZ3VhbCBvIG1lbm9zIGRlIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUG9yIGZhdm9yIGFncmVndWUgdW4gY29ycmVvIGVsZWN0csOzbmljbyB2w6FsaWRvLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIHZhY8OtbyBkZSBkYXRhIG8gbGEgcHJvcGllZGFkICd0cmF5ZWN0b3JpYScgbm8gZXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJFbCB0YW1hw7FvIGRlbCBhcmNoaXZvIG5vIGRlYmUgZGUgZXhjZWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgYWdyZWd1ZSBsYSBvdHJhIGVzdGltYWNpw7NuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU3UgYXJjaGl2byBzZSBlc3TDoSBzdWJpZW5kby4gUG9yIGZhdm9yIGVzcGVyZSB1bm9zIHNlZ3VuZG9zIGUgaW50ZW50ZSBkZSBudWV2by5cIixcbiAgYWRkUm93OiBcIkFncmVndWUgdW5hIGhpbGVyYVwiLFxuICByZW1vdmVSb3c6IFwiRWxpbWluYXIgdW5hIGhpbGVyYVwiLFxuICBjaG9pY2VzX2ZpcnN0SXRlbTogXCJwcmltZXIgYXJ0w61jdWxvXCIsXG4gIGNob2ljZXNfc2Vjb25kSXRlbTogXCJzZWd1bmRvIGFydMOtY3Vsb1wiLFxuICBjaG9pY2VzX3RoaXJkSXRlbTogXCJ0ZXJjZXJhIGFydMOtY3Vsb1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJIaWxlcmFcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZXNcIl0gPSBcImVzcGHDsW9sXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCIvL0NyZWF0ZSBieSBNYXR0aWFzIEFzcGx1bmRcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3dlZGlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJGw7ZyZWfDpWVuZGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIk7DpHN0YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRsOkcmRpZ1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFubmF0IChiZXNrcml2KVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkYSB7MH0gYXYgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBmaW5ucyBpbmdlbiBzeW5saWcgc2lkYSBlbGxlciBmcsOlZ2EgaSBlbmvDpHRlbi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWNrIGbDtnIgYXR0IGR1IGdlbm9tZsO2cnQgZW5rw6R0ZW4hIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkVua8OkdGVuIGxhZGRhcy4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6Rsai4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhciB2w6RubGlnIGJlc3ZhcmEgZnLDpWdhbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6Vnb3JuYSBww6UgYWxsYSByYWRlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlbDpHJkZXQgc2thIHZhcmEgbnVtZXJpc2t0LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZhciB2w6RubGlnIGFuZ2UgbWluc3QgezB9IHRlY2tlbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWYXIgdsOkbmxpZyBmeWxsIGkgbWluc3QgezB9IHJhZGVyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWYXIgdsOkbmxpZyB2w6RsaiDDpXRtaW5zdG9uZSB7MH0gdmFyaWFudGVyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWYXIgdsOkbmxpZyB2w6RsaiBpbnRlIGZsZXIgw6RuIHswfSB2YXJpYW50ZXIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtZXIgw6RuIHsxfSBzYW10IGxpa2EgbWVkIGVsbGVyIG1pbmRyZSDDpG4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtaW5kcmUgw6RuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmFyIHbDpG5saWcgYW5nZSBlbiBrb3JyZWt0IGUtcG9zdGFkcmVzcy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkbDtnJmcsOlZ2FuIHJldHVybmVyYWRlIGZlbGV0ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQW50aW5nZW4gcmV0dXJuZXJhZGUgZsO2cmZyw6VnYW4gaW5nZW4gZGF0YSBlbGxlciBzw6Ugw6RyIGVnZW5za2FwZW4gJ3BhdGgnIGludGUga29ycmVrdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpbHN0b3JsZWtlbiBmw6VyIGVqIMO2dmVyc3RpZ2EgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmFyIHbDpG5saWcgYW5nZSBkZXQgYW5kcmEgdsOkcmRldC5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRpbiBmaWwgbGFkZGFzIHVwcC4gVmFyIHbDpG5saWcgdsOkbnRhIG7DpWdyYSBzZWt1bmRlciBvY2ggZsO2cnPDtmsgc2VkYW4gaWdlbi5cIixcbiAgYWRkUm93OiBcIkzDpGdnIHRpbGwgcmFkXCIsXG4gIHJlbW92ZVJvdzogXCJUYSBib3J0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wic3ZcIl0gPSBzd2VkaXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInN2XCJdID0gXCJzdmVuc2thXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3N3ZWRpc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHRyYWRpdGlvbmFsQ2hpbmVzZVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLkuIrkuIDpoIFcIixcbiAgcGFnZU5leHRUZXh0OiBcIuS4i+S4gOmggVwiLFxuICBjb21wbGV0ZVRleHQ6IFwi5o+Q5Lqk5ZWP5Y23XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi5aGr5a+r5YW25LuW562U5qGIXCIsXG4gIHByb2dyZXNzVGV4dDogXCLnrKwgezB9IOmggSwg5YWxIHsxfSDpoIFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi5ZWP5Y235Lit5rKS5pyJ5ZWP6aGM5oiW6aCB6Z2iXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6Kyd5oKo55qE5Y+D6IiHIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuWVj+WNt+i8ieWFpeS4rS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLoq4vpgbjmk4cuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLoq4vloavlr6vmraTllY/poYxcIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLoq4vloavlr6vmiYDmnInooYzkuK3llY/poYxcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuetlOahiOW/hemgiOaYr+WAi+aVuOWtl1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVt+W6puiHs+WwkSB7MH0g5YCL5a2X5YWDXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW35bqm5LiN6IO96LaF6YGOIHswfSDlgIvlrZflhYNcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplbfluqblv4XpoIjlnKggezB9IC0gezF9IOWAi+Wtl+WFg+S5i+mWk1wiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WvqyB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemBuOaThyB7MH0g6aCF562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemBuOaThyB7MH0g6aCF562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemgiOWkp+aWvOetieaWvCB7MX0g5LiU5bCP5pa8562J5pa8IHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpoIjlpKfmlrznrYnmlrwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemgiOWwj+aWvOetieaWvCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuiri+i8uOWFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIui8ieWFpemBuOmgheaZgueZvOeUn+mMr+iqpCAnezB9JzogezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLmnKrog73ovInlhaXmnInmlYjnmoTpgbjpoIXmiJboq4vmsYLlj4Pmlbjot6/lvpHmnInoqqRcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXpgY4gezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLoq4vlrozmiJDlhbbku5bllY/poYxcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLmlofku7bkuIrlgrPkuK0uLi4g6KuL6ICQ5b+D562J5b6F5bm+56eS5b6M6YeN6KmmXCIsXG4gIGFkZFJvdzogXCLmt7vliqDnrZTmoYhcIixcbiAgcmVtb3ZlUm93OiBcIuWIqumZpOetlOahiFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi6YG46aCFXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi5YiXXCIsXG4gIG1hdHJpeF9yb3c6IFwi6KGMXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCH57WQ5p6c5L+d5a2Y5Yiw5pyN5YuZ5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjntZDmnpzpgY7nqIvkuK3nmbznlJ/kuobpjK/oqqTvvIzntZDmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57WQ5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6KuL6YeN6KmmXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtdHdcIl0gPSB0cmFkaXRpb25hbENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtdHdcIl0gPSBcIue5gemrlOS4reaWh1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi90cmFkaXRpb25hbC1jaGluZXNlLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0dXJraXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkdlcmlcIixcbiAgcGFnZU5leHRUZXh0OiBcIsSwbGVyaVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQW5rZXRpIFRhbWFtbGFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJEacSfZXIgKGHDp8Sxa2xhecSxbsSxeilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNheWZhIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJBbmtldHRlIGfDtnLDvG50w7xsZW5lY2VrIHNheWZhIHlhIGRhIHNvcnUgbWV2Y3V0IGRlxJ9pbC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJBbmtldGltaXppIHRhbWFtbGFkxLHEn8SxbsSxeiBpw6dpbiB0ZcWfZWtrw7xyIGVkZXJpei5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBbmtldCBzdW51Y3VkYW4gecO8a2xlbml5b3IgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlw6dpbml6IC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkzDvHRmZW4gc29ydXlhIGNldmFwIHZlcmluaXpcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkdpcmlsZW4gZGXEn2VyIG51bWVyaWsgb2xtYWzEsWTEsXJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJFbiBheiB7MH0gc2VtYm9sIGdpcmluaXouXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2F0xLFyxLEgZG9sZHVydW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNlw6dlbmXEn2kgc2XDp2luaXouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzDvHRmZW4gezB9IGFkZXR0ZW4gZmF6bGEgc2XDp21leWluaXouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX0gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgdmV5YSBiw7x5w7xrIG9sbWFsxLFkxLFyXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgZGXEn2VyaSB7MX0gZGXEn2VyaW5lIGXFn2l0IHlhIGRhIGvDvMOnw7xrIG9sbWFsxLFkxLFyLlwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMO8dGZlbiBnZcOnZXJsaSBiaXIgZXBvc3RhIGFkcmVzaSBnaXJpbml6LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFsZWJpIMWfdSBoYXRhecSxIGTDtm5kw7wgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRvc3lhIGJveXV0dSB7MH0gZGXEn2VyaW5pIGdlw6dlbWV6LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBkacSfZXIgZGXEn2VybGVyaSBnaXJpbml6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRG9zeWFuxLF6IHnDvGtsZW5peW9yLiBMw5x0ZmVuIGJpcmthw6cgc2FuaXllIGJla2xleWluIHZlIHRla3JhciBkZW5leWluLlwiLFxuICBhZGRSb3c6IFwiU2F0xLFyIEVrbGVcIixcbiAgcmVtb3ZlUm93OiBcIkthbGTEsXJcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0clwiXSA9IHR1cmtpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1widHJcIl0gPSBcInTDvHJrw6dlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHVrcmFpbmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQndCw0LfQsNC0XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQlNCw0LvRllwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JfQsNCy0LXRgNGI0LjRgtC4XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLQn9C+0YfQsNGC0LhcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQhtC90YjQtSAo0LHRg9C00Ywg0LvQsNGB0LrQsCwg0L7Qv9C40YjRltGC0YwpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQltC+0LTQtdC9XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCS0LjQsdGA0LDRgtC4INCy0YHQtVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtC+0YDRltC90LrQsCB7MH0g0LcgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLQktGW0LTQv9C+0LLRltC70Lgg0L3QsCB7MH0vezF9INC/0LjRgtCw0L3RjFwiLFxuICBlbXB0eVN1cnZleTogXCLQndC10LzQsNGUINC20L7QtNC90L7Qs9C+INC/0LjRgtCw0L3QvdGPLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCU0Y/QutGD0ZTQvNC+INCS0LDQvCDQt9CwINC30LDQv9C+0LLQvdC10L3QvdGPINCw0L3QutC10YLQuCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItCS0Lgg0LLQttC1INC/0YDQvtGF0L7QtNC40LvQuCDRhtC1INC+0L/QuNGC0YPQstCw0L3QvdGPLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCX0LDQstCw0L3RgtCw0LbQtdC90L3RjyDQvtC/0LjRgtGD0LLQsNC90L3Rjy4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQktC40LHRgNCw0YLQuC4uLlwiLFxuICB2YWx1ZTogXCLQt9C90LDRh9C10L3QvdGPXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LTQsNC50YLQtSDQstGW0LTQv9C+0LLRltC00YwuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItCR0YPQtNGMINC70LDRgdC60LAsINC00LDQudGC0LUg0LLRltC00L/QvtCy0ZbQtNGMINGF0L7Rh9CwINCxINC90LAg0L7QtNC90LUg0L/QuNGC0LDQvdC90Y8uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LTQsNC50YLQtSDQstGW0LTQv9C+0LLRltC00Ywg0L3QsCDQv9C40YLQsNC90L3RjyDQsiDQutC+0LbQvdC+0LzRgyDRgNGP0LTQutGDLlwiLFxuICBudW1lcmljRXJyb3I6IFwi0JLRltC00L/QvtCy0ZbQtNGMINC/0L7QstC40L3QvdCwINCx0YPRgtC4INGH0LjRgdC70L7QvC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LLQtdC00ZbRgtGMINCx0ZbQu9GM0YjQtSB7MH0g0YHQuNC80LLQvtC70ZbQsi5cIixcbiAgdGV4dE1heExlbmd0aDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LLQtdC00ZbRgtGMINC80LXQvdGI0LUgezB9INGB0LjQvNCy0L7Qu9GW0LIuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCDQstCy0LXQtNGW0YLRjCDQsdGW0LvRjNGI0LUgezB9INC4INC80LXQvdGI0LUgezF9INGB0LjQvNCy0L7Qu9GW0LIuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LfQsNC/0L7QstC90ZbRgtGMINC90LUg0LzQtdC90YjQtSB7MH0g0YDRj9C00LrRltCyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQstC40LHQtdGA0ZbRgtGMINGF0L7Rh9CwINCxIHswfSDQstCw0YDRltCw0L3RgtGW0LIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LjQsdC10YDRltGC0Ywg0L3QtSDQsdGW0LvRjNGI0LUgezB9INCy0LDRgNGW0LDQvdGC0ZbQsi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nINC/0L7QstC40L3QvdC+INCx0YPRgtC4INC90LUg0LzQtdC90YjQtSDQvdGW0LYgezF9LCDRliDQvdC1INCx0ZbQu9GM0YjQtSDQvdGW0LYgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg0L/QvtCy0LjQvdC90L4g0LHRg9GC0Lgg0L3QtSDQvNC10L3RiNC1INC90ZbQtiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDQvdC1INCx0ZbQu9GM0YjQtSDQvdGW0LYgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQstCy0LXQtNGW0YLRjCDQtNGW0LnRgdC90YMg0LDQtNGA0LXRgdGDINC10LvQtdC60YLRgNC+0L3QvdC+0Zcg0L/QvtGI0YLQuC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi0JLQuNGA0LDQtyB7MH0g0L/QvtCy0LjQvdC10L0g0L/QvtCy0LXRgNGC0LDRgtC4ICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItCX0LDQv9C40YIg0L/QvtCy0LXRgNC90YPQsiDQv9C+0LzQuNC70LrRgyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCS0ZbQtNC/0L7QstGW0LTRjCDQvdCwINC30LDQv9C40YIg0L/QvtCy0LXRgNC90YPQu9Cw0YHRjCDQv9C+0YDQvtC20L3RjNC+0Y4g0LDQsdC+INCy0LvQsNGB0YLQuNCy0ZbRgtGMICdwYXRoJyDQstC60LDQt9Cw0L3QviDQvdC10LLRltGA0L3QvlwiLFxuICBleGNlZWRNYXhTaXplOiBcItCg0L7Qt9C80ZbRgCDRhNCw0LnQu9GDINC90LUg0L/QvtCy0LjQvdC10L0g0L/QtdGA0LXQstC40YnRg9Cy0LDRgtC4IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LLQtdC00ZbRgtGMINC00LDQvdGWINCyINC/0L7Qu9C1ICfQhtC90YjQtSdcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcItCS0LDRiCDRhNCw0LnQuyDQt9Cw0LLQsNC90YLQsNC20YPRlNGC0YzRgdGPLiDQl9Cw0YfQtdC60LDQudGC0LUg0LTQtdC60ZbQu9GM0LrQsCDRgdC10LrRg9C90LQg0ZYg0YHQv9GA0L7QsdGD0LnRgtC1INC30L3QvtCy0YMuXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDQstCw0L3RgtCw0LbQtdC90L3Rjy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCS0LjQsdC10YDRltGC0Ywg0YTQsNC50Lso0LgpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLQpNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi0JLQuCDRhdC+0YfQtdGC0LUg0LLQuNC00LDQu9C40YLQuCDQt9Cw0L/QuNGBP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCm0LUg0LfQvdCw0YfQtdC90L3RjyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDRg9C90ZbQutCw0LvRjNC90LjQvC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QtNCw0YLQuCDQutC+0LvQvtC90LrRg1wiLFxuICBhZGRSb3c6IFwi0JTQvtC00LDRgtC4INGA0Y/QtNC+0LpcIixcbiAgcmVtb3ZlUm93OiBcItCS0LjQtNCw0LvQuNGC0LhcIixcbiAgYWRkUGFuZWw6IFwi0JTQvtC00LDRgtC4INC90L7QstGDXCIsXG4gIHJlbW92ZVBhbmVsOiBcItCS0LjQtNCw0LvQuNGC0LhcIixcbiAgY2hvaWNlc19JdGVtOiBcItCS0LDRgNGW0LDQvdGCXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0JrQvtC70L7QvdC60LBcIixcbiAgbWF0cml4X3JvdzogXCLQoNGP0LTQvtC6XCIsXG4gIHNhdmluZ0RhdGE6IFwi0KDQtdC30YPQu9GM0YLQsNGC0Lgg0LfQsdC10YDRltCz0LDRjtGC0YzRgdGPINC90LAg0YHQtdGA0LLQtdGALi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQktGW0LTQsdGD0LvQsNGB0Y8g0L/QvtC80LjQu9C60LAsINGA0LXQt9GD0LvRjNGC0LDRgiDQvdC1INCx0YPQsiDQt9Cx0LXRgNC10LbQtdC90LjQuS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30LLRg9C70YzRgtCw0YIg0YPRgdC/0ZbRiNC90L4g0LfQsdC10YDQtdC20LXQvdC40LkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQodC/0YDQvtCx0YPQstCw0YLQuCDQt9C90L7QstGDXCIsXG4gIHRpbWVyTWluOiBcItGF0LJcIixcbiAgdGltZXJTZWM6IFwi0YHQtdC6XCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYg0ZYgezF9INC30LDQs9Cw0LvQvtC8LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRli5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0L/RgNC+0YLRj9Cz0L7QvCDRgtC10YHRgtGDLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC3IHsxfSDQvdCwINGG0ZbQuSDRgdGC0L7RgNGW0L3RhtGWINGWIHsyfSDQtyB7M30g0LTQu9GPINCy0YHRjNC+0LPQviDRgtC10YHRgtGDLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0LcgezF9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC3IHsxfSDQtNC70Y8g0LLRgdGM0L7Qs9C+INGC0LXRgdGC0YMuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLQntGH0LjRgdGC0LjRgtC4XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLQntGH0LjRgdGC0LjRgtC4XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCS0LjQtNCw0LvQuNGC0Lgg0YTQsNC50LtcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ1YVwiXSA9IHVrcmFpbmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ1YVwiXSA9IFwi0YPQutGA0LDRl9C90YHRjNC60LBcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdWtyYWluaWFuLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgYm9vbGVhbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbEZhbHNlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbFRydWVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5sYWJlbFRydWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYm9vbGVhbkNoZWNrZWRMYWJlbFwiKTtcbiAgICB0aGlzLmxhYmVsRmFsc2UgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYm9vbGVhblVuY2hlY2tlZExhYmVsXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBjaGVjayB3aWxsIGJlIHJlbmRlcmVkIGluIGluZGV0ZXJtaW5hdGUgbW9kZS4gdmFsdWUgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0L3NldCBxdWVzdGlvbiB2YWx1ZSBpbiAzIG1vZGVzOiBpbmRldGVybWluYXRlICh2YWx1ZSBpcyBlbXB0eSksIHRydWUgKGNoZWNrIGlzIHNldCkgYW5kIGZhbHNlIChjaGVjayBpcyB1bnNldCkuXG4gICAqIEBzZWUgdmFsdWVUcnVlXG4gICAqIEBzZWUgdmFsdWVGYWxzZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGVja2VkVmFsdWUoKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZhbHVlID09IHRoaXMuZ2V0VmFsdWVUcnVlKCk7XG4gIH1cbiAgcHVibGljIHNldCBjaGVja2VkVmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWwgPT0gdHJ1ZSA/IHRoaXMuZ2V0VmFsdWVUcnVlKCkgOiB0aGlzLmdldFZhbHVlRmFsc2UoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSBvZiB0aGUgY2hlY2s6IFwiaW5kZXRlcm1pbmF0ZVwiIC0gZGVmYXVsdCAodmFsdWUgaXMgZW1wdHkvbnVsbCksIFwidHJ1ZVwiIC0gdmFsdWUgZXF1YWxzIHZhbHVlVHJ1ZSBvciB0cnVlLCBcImZhbHNlXCIgLSB2YWx1ZSBlcXVhbHMgdmFsdWVGYWxzZSBvciBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZSh2YWw6IGFueSkge1xuICAgIGlmICh2YWwgPT09IHRydWUpIHZhbCA9IFwidHJ1ZVwiO1xuICAgIGlmICh2YWwgPT09IGZhbHNlKSB2YWwgPSBcImZhbHNlXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJpbmRldGVybWluYXRlXCIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcInRydWVcIlxuICAgICAgPyB0aGlzLmdldFZhbHVlVHJ1ZSgpXG4gICAgICA6IHRoaXMuZ2V0VmFsdWVGYWxzZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNob3dUaXRsZSB8fCB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmxvY0xhYmVsLnRleHQpXG4gICAgICA/IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKVxuICAgICAgOiB0aGlzLmxvY0xhYmVsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY2hlY2tib3ggbGFiZWwuIElmIGl0IGlzIGVtcHR5IGFuZCBzaG93VGl0bGUgaXMgZmFsc2UgdGhlbiB0aXRsZSBpcyByZW5kZXJlZFxuICAgKiBAc2VlIHNob3dUaXRsZVxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBsYWJlbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTGFiZWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibGFiZWxcIik7XG4gIH1cbiAgZ2V0IGxvY0Rpc3BsYXlMYWJlbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9jTGFiZWwudGV4dCkgcmV0dXJuIHRoaXMubG9jTGFiZWw7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlID8gdGhpcy5sb2NMYWJlbCA6IHRoaXMubG9jVGl0bGU7XG4gIH1cbiBcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IGxhYmVsIGZvciBzdGF0ZSB3aGVuIGNoZWNrIGlzIHNldC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbGFiZWxUcnVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxUcnVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFiZWxUcnVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbFRydWVcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTGFiZWxUcnVlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsVHJ1ZVwiKTtcbiAgfVxuIFxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGFiZWwgZm9yIHN0YXRlIHdoZW4gY2hlY2sgaXMgdW5zZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhYmVsRmFsc2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbEZhbHNlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFiZWxGYWxzZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxGYWxzZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NMYWJlbEZhbHNlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsRmFsc2VcIik7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgdGhlIHF1ZXN0aW9uIHRpdGxlLiBJdCBpcyBoaWRkZW4gYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHRydWUgd2hlbiBjaGVjayBpcyBzZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlVHJ1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVRydWVcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZVRydWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVRydWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZnJvbSBmYWxzZSB3aGVuIGNoZWNrIGlzIHVuc2V0LlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZUZhbHNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlRmFsc2VcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZUZhbHNlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVGYWxzZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVUcnVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVUcnVlID8gdGhpcy52YWx1ZVRydWUgOiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVGYWxzZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlRmFsc2UgPyB0aGlzLnZhbHVlRmFsc2UgOiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcInRydWVcIikgdGhpcy5jaGVja2VkVmFsdWUgPSB0cnVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImZhbHNlXCIpIHRoaXMuY2hlY2tlZFZhbHVlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImJvb2xlYW5cIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFZhbHVlOmRyb3Bkb3duXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiYm9vbGVhbkRlZmF1bHRWYWx1ZVwiLFxuICAgICAgZGVmYXVsdDogXCJpbmRldGVybWluYXRlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbmRldGVybWluYXRlXCIsIFwiZmFsc2VcIiwgXCJ0cnVlXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibGFiZWw6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTGFiZWxcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibGFiZWxUcnVlOnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbFRydWVcIlxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJsYWJlbEZhbHNlOnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbEZhbHNlXCJcbiAgICB9LFxuICAgIFwic2hvd1RpdGxlOmJvb2xlYW5cIixcbiAgICBcInZhbHVlVHJ1ZVwiLFxuICAgIFwidmFsdWVGYWxzZVwiXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW5Nb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGNoZWNrYm94IHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIHByaXZhdGUgbm9uZUl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcIm5vbmVcIik7XG4gIHByaXZhdGUgc2VsZWN0QWxsSXRlbVZhbHVlOiBJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwic2VsZWN0YWxsXCIpO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIG5vbmVJdGVtVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJub25lVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICBub25lSXRlbVRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub25lSXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLm5vbmVJdGVtVmFsdWUubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMubm9uZUl0ZW1WYWx1ZS5zZXRMb2NUZXh0KG5vbmVJdGVtVGV4dCk7XG5cbiAgICB2YXIgc2VsZWN0QWxsSXRlbVRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgICAgXCJzZWxlY3RBbGxUZXh0XCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgc2VsZWN0QWxsSXRlbVRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzZWxlY3RBbGxJdGVtVGV4dFwiKTtcbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0QWxsSXRlbS5sb2NPd25lciA9IHRoaXM7XG4gICAgdGhpcy5zZWxlY3RBbGxJdGVtLnNldExvY1RleHQoc2VsZWN0QWxsSXRlbVRleHQpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImhhc05vbmVcIiwgXCJub25lVGV4dFwiLCBcImhhc1NlbGVjdEFsbFwiLCBcInNlbGVjdEFsbFRleHRcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaGVja2JveFwiO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQ3JlYXRpbmcoKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicmVuZGVyZWRWYWx1ZVwiKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmFsdWVcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfMFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3QgYWxsIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICogQHNlZSBoYXNTZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEFsbEl0ZW1WYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbm9uZSBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzTm9uZVxuICAgKi9cbiAgcHVibGljIGdldCBub25lSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLm5vbmVJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG5vbmUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbm9uZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcIm5vbmVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9uZUl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5vbmVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJub25lVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NOb25lVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJub25lVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3IgU2VsZWN0IEFsbCBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RBbGxUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJzZWxlY3RBbGxUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2VsZWN0QWxsSXRlbVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0QWxsVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwic2VsZWN0QWxsVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NTZWxlY3RBbGxUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInNlbGVjdEFsbFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgdGhlIFwiU2VsZWN0IEFsbFwiIGl0ZW0gb24gdGhlIHRvcC4gSWYgZW5kLXVzZXIgY2hlY2tzIHRoaXMgaXRlbSwgdGhlbiBhbGwgaXRlbXMgYXJlIGNoZWNrZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1NlbGVjdEFsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzU2VsZWN0QWxsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc1NlbGVjdEFsbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoYXNTZWxlY3RBbGxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBhcmUgc2VsZWN0ZWRcbiAgICogQHNlZSB0b2dnbGVTZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNJdGVtU2VsZWN0ZWQodGhpcy5ub25lSXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgYWxsSXRlbUNvdW50ID0gdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIGFsbEl0ZW1Db3VudC0tO1xuICAgIGlmICh0aGlzLmhhc05vbmUpIGFsbEl0ZW1Db3VudC0tO1xuICAgIGlmICh0aGlzLmhhc1NlbGVjdEFsbCkgYWxsSXRlbUNvdW50LS07XG4gICAgdmFyIHNlbGVjdGVkQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMub3RoZXJJdGVtKSkgc2VsZWN0ZWRDb3VudC0tO1xuICAgIHJldHVybiBzZWxlY3RlZENvdW50ID09PSBhbGxJdGVtQ291bnQ7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFNlbGVjdGVkKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSXQgd2lsbCBzZWxlY3QgYWxsIGl0ZW1zLCBleGNlcHQgb3RoZXIgYW5kIG5vbmUuIElmIGFsbCBpdGVtcyBoYXZlIGJlZW4gYWxyZWFkeSBzZWxlY3RlZCB0aGVuIGl0IHdpbGwgY2xlYXIgdGhlIHZhbHVlXG4gICAqIEBzZWUgaXNBbGxTZWxlY3RlZFxuICAgKiBAc2VlIHNlbGVjdEFsbFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSAhdGhpcy5pc0FsbFNlbGVjdGVkO1xuICB9XG4gIC8qKlxuICAgKiBTZWxlY3QgYWxsIGl0ZW1zLCBleGNlcHQgb3RoZXIgYW5kIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCkge1xuICAgIHZhciB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy52aXNpYmxlQ2hvaWNlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5ub25lSXRlbSB8fFxuICAgICAgICBpdGVtID09PSB0aGlzLm90aGVySXRlbSB8fFxuICAgICAgICBpdGVtID09PSB0aGlzLnNlbGVjdEFsbEl0ZW1cbiAgICAgIClcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YWwucHVzaChpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gc2hvdyB0aGUgXCJOb25lXCIgaXRlbSBvbiB0aGUgYm90dG9tLiBJZiBlbmQtdXNlciBjaGVja3MgdGhpcyBpdGVtLCBhbGwgb3RoZXIgaXRlbXMgd291bGQgYmUgdW5jaGVja2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNOb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNOb25lXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc05vbmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzTm9uZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgaXRlbSBpcyBjaGVja2VkXG4gICAqIEBwYXJhbSBpdGVtIGNoZWNrYm94IGl0ZW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5zZWxlY3RBbGxJdGVtKSByZXR1cm4gdGhpcy5pc0FsbFNlbGVjdGVkO1xuICAgIHZhciB2YWwgPSB0aGlzLnJlbmRlcmVkVmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHZhbFtpXSwgaXRlbS52YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YShuZXdWYWx1ZSk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIW5ld1ZhbHVlKSBuZXdWYWx1ZSA9IFtdO1xuICAgIGlmICghdmFsdWUpIHZhbHVlID0gW107XG4gICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh2YWx1ZSwgbmV3VmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGFzTm9uZSkge1xuICAgICAgdmFyIHByZXZOb25lSW5kZXggPSB0aGlzLm5vbmVJbmRleEluQXJyYXkodmFsdWUpO1xuICAgICAgdmFyIG5ld05vbmVJbmRleCA9IHRoaXMubm9uZUluZGV4SW5BcnJheShuZXdWYWx1ZSk7XG4gICAgICBpZiAocHJldk5vbmVJbmRleCA+IC0xKSB7XG4gICAgICAgIGlmIChuZXdOb25lSW5kZXggPiAtMSAmJiBuZXdWYWx1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbmV3VmFsdWUuc3BsaWNlKG5ld05vbmVJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXdOb25lSW5kZXggPiAtMSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnNwbGljZSgwLCBuZXdWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5ub25lSXRlbS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG4gIHByaXZhdGUgbm9uZUluZGV4SW5BcnJheSh2YWw6IGFueSkge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiAtMTtcbiAgICB2YXIgbm9uZVZhbHVlID0gdGhpcy5ub25lSXRlbS52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbFtpXSA9PSBub25lVmFsdWUpIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblVzZUZpbHRlcmVkQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGFzTm9uZSAmJiAhdGhpcy5oYXNTZWxlY3RBbGwgJiYgc3VwZXIuY2FuVXNlRmlsdGVyZWRDaG9pY2VzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFRvVmlzaWJsZUNob2ljZXMoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICBpZiAodGhpcy5oYXNTZWxlY3RBbGwpIHtcbiAgICAgIGl0ZW1zLnVuc2hpZnQodGhpcy5zZWxlY3RBbGxJdGVtKTtcbiAgICB9XG4gICAgc3VwZXIuYWRkVG9WaXNpYmxlQ2hvaWNlcyhpdGVtcyk7XG4gICAgaWYgKHRoaXMuaGFzTm9uZSkge1xuICAgICAgaXRlbXMucHVzaCh0aGlzLm5vbmVJdGVtKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHJldHVybiBzdXBlci5nZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQsIHZhbHVlKTtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWxTdHIgPSB0aGlzLmdldENob2ljZXNEaXNwbGF5VmFsdWUoaXRlbXMsIHZhbHVlW2ldKTtcbiAgICAgIGlmICh2YWxTdHIpIHtcbiAgICAgICAgaWYgKHN0cikgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgc3RyICs9IHZhbFN0cjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDb3JlKCkge1xuICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RBbmREaXNhYmxlZFZhbHVlcyhmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyRGlzYWJsZWRWYWx1ZXNDb3JlKCkge1xuICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RBbmREaXNhYmxlZFZhbHVlcyh0cnVlKTtcbiAgfVxuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXMoY2xlYXJEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICBpZiAoIWNsZWFyRGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tbWVudCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghY2xlYXJEaXNhYmxlZCAmJiAhdGhpcy5jYW5DbGVhclZhbHVlQW5Vbmtub3codmFsW2ldKSkgfHxcbiAgICAgICAgKGNsZWFyRGlzYWJsZWQgJiYgIXRoaXMuaXNWYWx1ZURpc2FibGVkKHZhbFtpXSkpXG4gICAgICApIHtcbiAgICAgICAgbmV3VmFsdWUucHVzaCh2YWxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IHZhbC5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICBpZiAob3BlcmF0b3IgPT0gXCJjb250YWluc1wiIHx8IG9wZXJhdG9yID09IFwibm90Y29udGFpbnNcIikge1xuICAgICAganNvbltcInR5cGVcIl0gPSBcInJhZGlvZ3JvdXBcIjtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSGVscGVycy5pc0FycmF5Q29udGFpbnNFcXVhbCh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWVXaXRoT3RoZXJzKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsLmluZGV4T2YodGhpcy5vdGhlckl0ZW0udmFsdWUpID49IDA7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3N1cGVyLnZhbHVlRnJvbURhdGEodmFsKV07XG4gICAgbGV0IHZhbHVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaG9pY2VpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuYWN0aXZlQ2hvaWNlcywgdmFsW2ldKTtcbiAgICAgIGlmICghIWNob2ljZWl0ZW0pIHtcbiAgICAgICAgdmFsdWUucHVzaChjaG9pY2VpdGVtLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkgcmV0dXJuIHZhbDtcbiAgICAgIGlmICh0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWxbaV0pKSB7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IHZhbFtpXTtcbiAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICBuZXdWYWxbaV0gPSB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwgfHwgIXZhbC5sZW5ndGgpIHJldHVybiB2YWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29tbWVudCgpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMuZ2V0Q29tbWVudCgpO1xuICAgICAgICAgIHJldHVybiBuZXdWYWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzVW5rbm93blZhbHVlKHZhbDogYW55LCBpbmNsdWRlT3RoZXI6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc05vbmUgJiYgdmFsID09IHRoaXMubm9uZUl0ZW1WYWx1ZS52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBzdXBlci5oYXNVbmtub3duVmFsdWUodmFsLCBpbmNsdWRlT3RoZXIpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRTdXBwb3J0ZWRWYWxpZGF0b3JzKHN1cHBvcnRlZFZhbGlkYXRvcnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBzdXBlci5hZGRTdXBwb3J0ZWRWYWxpZGF0b3JzKHN1cHBvcnRlZFZhbGlkYXRvcnMpO1xuICAgIHN1cHBvcnRlZFZhbGlkYXRvcnMucHVzaChcImFuc3dlcmNvdW50XCIpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNoZWNrYm94XCIsXG4gIFtcbiAgICBcImhhc1NlbGVjdEFsbDpib29sZWFuXCIsXG4gICAgXCJoYXNOb25lOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwibm9uZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY05vbmVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwic2VsZWN0QWxsVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jU2VsZWN0QWxsVGV4dFwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjb21tZW50IHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbW1lbnRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiLCB0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNUZXh0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbWltIHRleHQgbGVuZ3RoLiBJZiBpdCBpcyAtMSwgZGVmYXVsIHZhbHVlLCB0aGVuIHRoZSBzdXJ2ZXkgbWF4VGV4dExlbmd0aCBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQuXG4gICAqIElmIGl0IGlzIDAsIHRoZW4gdGhlIHZhbHVlIGlzIHVubGltaXRlZFxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRNYXhMZW5ndGgoKTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRNYXhMZW5ndGgoXG4gICAgICB0aGlzLm1heExlbmd0aCxcbiAgICAgIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkubWF4VGV4dExlbmd0aCA6IC0xXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBwbGFjZUhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGxhY2VIb2xkZXJcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHJvd3MgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGdldCByb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cbiAgcHVibGljIHNldCByb3dzKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCBjb2xzIGF0dHJpYnV0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29scygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29scyh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgfVxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzKTtcbiAgICBzdXBwb3J0ZWRWYWxpZGF0b3JzLnB1c2goXCJ0ZXh0XCIsIFwicmVnZXhcIik7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29tbWVudFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwiY29sczpudW1iZXJcIiwgZGVmYXVsdDogNTAgfSxcbiAgICB7IG5hbWU6IFwicm93czpudW1iZXJcIiwgZGVmYXVsdDogNCB9LFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Db21tZW50TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGFuIHF1ZXN0aW9uIHRoYXQgcmVuZGVycyBlbXB0eSBcImRpdlwiIHRhZy4gSXQgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHNvbWUgY3VzdG9tIHdpZGdldHNcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRW1wdHlNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1wdHlcIjtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImVtcHR5XCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRW1wdHlNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIEV2ZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgVXBsb2FkaW5nRmlsZUVycm9yLCBFeGNlZWRTaXplRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgZmlsZSBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByaXZhdGUgaXNVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBxdWVzdGlvbiBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHF1ZXN0aW9uIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN0YXRlIG5ldyBxdWVzdGlvbiBzdGF0ZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBvblN0YXRlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogUXVlc3Rpb25GaWxlTW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFF1ZXN0aW9uRmlsZU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICBwdWJsaWMgcHJldmlld1ZhbHVlOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgY3VycmVudFN0YXRlID0gXCJlbXB0eVwiO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IHRoZSBwcmV2aWV3IGZvciB0aGUgaW1hZ2UgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2aWV3XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBhbGxvdyBzZWxlY3QgbXVsdGlwbGUgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93TXVsdGlwbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93TXVsdGlwbGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dNdWx0aXBsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd011bHRpcGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VIZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFjY2VwdGVkIGZpbGUgdHlwZXMuIFBhc3NlZCB0byB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZSBmaWxlIGlucHV0IHRhZy4gU2VlIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfYWNjZXB0LmFzcCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGdldCBhY2NlcHRlZFR5cGVzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFjY2VwdGVkVHlwZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBhY2NlcHRlZFR5cGVzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWNjZXB0ZWRUeXBlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNlcmlhbGl6ZSBmaWxlIGNvbnRlbnQgYXMgdGV4dCBpbiB0aGUgc3VydmV5LmRhdGEuXG4gICAqIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gd3JpdGUgdGhlIGNvZGUgb25VcGxvYWRGaWxlcyBldmVudCB0byBzdG9yZSB0aGUgZmlsZSBjb250ZW50LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm9uVXBsb2FkRmlsZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcmVEYXRhQXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZURhdGFBc1RleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZURhdGFBc1RleHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVEYXRhQXNUZXh0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgZmlsZXMgd2lsbCBiZSB1cGxvYWRlZCB0byB5b3VyIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2FpdEZvclVwbG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2FpdEZvclVwbG9hZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCB3YWl0Rm9yVXBsb2FkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndhaXRGb3JVcGxvYWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgaW1hZ2VzIHByZXZpZXcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93SW1hZ2VzUHJldmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dJbWFnZXNQcmV2aWV3XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dJbWFnZXNQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93SW1hZ2VzUHJldmlld1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXR1cCB0aGUgbWF4aW11bSBhbGxvd2VkIGZpbGUgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhTaXplXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4U2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0dXAgY29uZmlybWF0aW9uIHRvIHJlbW92ZSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGdldCBuZWVkQ29uZmlybVJlbW92ZUZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5lZWRDb25maXJtUmVtb3ZlRmlsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5lZWRDb25maXJtUmVtb3ZlRmlsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuZWVkQ29uZmlybVJlbW92ZUZpbGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlbW92ZSBmaWxlIGNvbmZpcm1hdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgcHVibGljIGdldENvbmZpcm1SZW1vdmVNZXNzYWdlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJjb25maXJtUmVtb3ZlRmlsZVwiKVxuICAgICAgW1wiZm9ybWF0XCJdKGZpbGVOYW1lKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlbW92ZSBhbGwgZmlsZXMgY29uZmlybWF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBnZXQgY29uZmlybVJlbW92ZUFsbE1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1SZW1vdmVBbGxGaWxlc1wiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG5vIGZpbGUgY2hvc2VuIGNhcHRpb24gZm9yIG1vZGVybiB0aGVtZS5cbiAgICovXG4gIGdldCBub0ZpbGVDaG9zZW5DYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub0ZpbGVDaG9zZW5cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjaG9vc2UgZmlsZXMgYnV0dG9uIGNhcHRpb24gZm9yIG1vZGVybiB0aGVtZS5cbiAgICovXG4gIGdldCBjaG9vc2VCdXR0b25DYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9vc2VGaWxlQ2FwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsZWFuIGZpbGVzIGJ1dHRvbiBjYXB0aW9uLlxuICAgKi9cbiAgZ2V0IGNsZWFuQnV0dG9uQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYW5DYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGZpbGUgYnV0dG9uIGNhcHRpb24uXG4gICAqL1xuICBnZXQgcmVtb3ZlRmlsZUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZUZpbGVDYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGl0bGUgdmFsdWUuXG4gICAqL1xuICBnZXQgaW5wdXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKSByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImxvYWRpbmdGaWxlXCIpO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9vc2VGaWxlXCIpO1xuICAgIHJldHVybiBcIiBcIjtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdmFsdWUgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcihkb25lQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyh0aGlzLm5hbWUsIHRoaXMudmFsdWUsIG51bGwsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgICEhZG9uZUNhbGxiYWNrICYmIGRvbmVDYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgZmlsZSBpdGVtIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRmlsZShjb250ZW50OiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyhcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBjb250ZW50Lm5hbWUsXG4gICAgICAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvbGRWYWx1ZS5maWx0ZXIoZiA9PiBmLm5hbWUgIT09IGNvbnRlbnQubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogTG9hZCBtdWx0aXBsZSBmaWxlcyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmlsZXNcbiAgICovXG4gIHB1YmxpYyBsb2FkRmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXNPayhmaWxlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRpbmdcIik7XG5cbiAgICB2YXIgbG9hZEZpbGVzUHJvYyA9ICgpID0+IHtcbiAgICAgIHZhciBjb250ZW50ID0gPEFycmF5PGFueT4+W107XG4gICAgICBpZiAodGhpcy5zdG9yZURhdGFBc1RleHQpIHtcbiAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICBsZXQgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNvbmNhdChbXG4gICAgICAgICAgICAgIHsgbmFtZTogZmlsZS5uYW1lLCB0eXBlOiBmaWxlLnR5cGUsIGNvbnRlbnQ6IGZpbGVSZWFkZXIucmVzdWx0IH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5jb25jYXQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkudXBsb2FkRmlsZXModGhpcy5uYW1lLCBmaWxlcywgKHN0YXR1cywgZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KFxuICAgICAgICAgICAgICBkYXRhLm1hcCgocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHIuZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgdHlwZTogci5maWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiByLmNvbnRlbnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgbG9hZEZpbGVzUHJvYygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyKGxvYWRGaWxlc1Byb2MpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2FuUHJldmlld0ltYWdlKGZpbGVJdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0ltYWdlc1ByZXZpZXcgJiYgISFmaWxlSXRlbSAmJiB0aGlzLmlzRmlsZUltYWdlKGZpbGVJdGVtKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSBbXTtcbiAgICB2YXIgc3RhdGUgPVxuICAgICAgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJiAhIW5ld1ZhbHVlKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgID8gdGhpcy5zaG93UHJldmlld1xuICAgICAgICAgID8gXCJsb2FkaW5nXCJcbiAgICAgICAgICA6IFwibG9hZGVkXCJcbiAgICAgICAgOiBcImVtcHR5XCI7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoc3RhdGUpO1xuICAgIGlmICghdGhpcy5zaG93UHJldmlldyB8fCAhbmV3VmFsdWUpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShuZXdWYWx1ZSlcbiAgICAgID8gbmV3VmFsdWVcbiAgICAgIDogISFuZXdWYWx1ZVxuICAgICAgICA/IFtuZXdWYWx1ZV1cbiAgICAgICAgOiBbXTtcblxuICAgIGlmICh0aGlzLnN0b3JlRGF0YUFzVGV4dCkge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICB2YXIgY29udGVudCA9IHZhbHVlLmNvbnRlbnQgfHwgdmFsdWU7XG4gICAgICAgIHRoaXMucHJldmlld1ZhbHVlID0gdGhpcy5wcmV2aWV3VmFsdWUuY29uY2F0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICB2YXIgY29udGVudCA9IHZhbHVlLmNvbnRlbnQgfHwgdmFsdWU7XG4gICAgICAgIHRoaXMuc3VydmV5LmRvd25sb2FkRmlsZSh0aGlzLm5hbWUsIHZhbHVlLCAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlld1ZhbHVlID0gdGhpcy5wcmV2aWV3VmFsdWUuY29uY2F0KFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEsXG4gICAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS50eXBlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldmlld1ZhbHVlLmxlbmd0aCA9PT0gbmV3VmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nICYmIHRoaXMud2FpdEZvclVwbG9hZCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBVcGxvYWRpbmdGaWxlRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInVwbG9hZGluZ0ZpbGVcIiksXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc3RhdGVDaGFuZ2VkKHN0YXRlOiBzdHJpbmcpIHtcbiAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSBcImxvYWRlZFwiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHsgc3RhdGU6IHN0YXRlIH0pO1xuICB9XG4gIHByaXZhdGUgYWxsRmlsZXNPayhmaWxlczogRmlsZVtdKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9yTGVuZ3RoID0gdGhpcy5lcnJvcnMgPyB0aGlzLmVycm9ycy5sZW5ndGggOiAwO1xuICAgIChmaWxlcyB8fCBbXSkuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm1heFNpemUgPiAwICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBFeGNlZWRTaXplRXJyb3IodGhpcy5tYXhTaXplLCB0aGlzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yTGVuZ3RoID09PSB0aGlzLmVycm9ycy5sZW5ndGg7XG4gIH1cbiAgcHJpdmF0ZSBpc0ZpbGVJbWFnZShmaWxlOiB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbiAgfSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmlsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGltYWdlUHJlZml4ID0gXCJkYXRhOmltYWdlXCI7XG4gICAgdmFyIHN1YlN0ciA9IGZpbGUuY29udGVudCAmJiBmaWxlLmNvbnRlbnQuc3Vic3RyKDAsIGltYWdlUHJlZml4Lmxlbmd0aCk7XG4gICAgc3ViU3RyID0gc3ViU3RyICYmIHN1YlN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXN1bHQgPVxuICAgICAgc3ViU3RyID09PSBpbWFnZVByZWZpeCB8fFxuICAgICAgKCEhZmlsZS50eXBlICYmIGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJpbWFnZS9cIikgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IGZhbHNlO1xuICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHZhbHVlcy5tYXAoKGRhdGFWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAgICB0aXRsZTogXCJGaWxlXCIsXG4gICAgICAgICAgdmFsdWU6IChkYXRhVmFsdWUuY29udGVudCAmJiBkYXRhVmFsdWUuY29udGVudCkgfHwgZGF0YVZhbHVlLFxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogKGRhdGFWYWx1ZS5uYW1lICYmIGRhdGFWYWx1ZS5uYW1lKSB8fCBkYXRhVmFsdWUsXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICBpc05vZGU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImZpbGVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJzaG93UHJldmlldzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcImFsbG93TXVsdGlwbGU6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJhbGxvd0ltYWdlc1ByZXZpZXc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJpbWFnZUhlaWdodFwiLFxuICAgIFwiaW1hZ2VXaWR0aFwiLFxuICAgIFwiYWNjZXB0ZWRUeXBlc1wiLFxuICAgIHsgbmFtZTogXCJzdG9yZURhdGFBc1RleHQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcIndhaXRGb3JVcGxvYWQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIFwibWF4U2l6ZTpudW1iZXJcIixcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJuZWVkQ29uZmlybVJlbW92ZUZpbGU6Ym9vbGVhblwiLCB2aXNpYmxlOiB0cnVlLCBkZWZhdWx0OiBmYWxzZSB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZmlsZVwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2ZpbGUudHMiLCJpbXBvcnQgeyBRdWVzdGlvbk5vblZhbHVlIH0gZnJvbSBcIi4vcXVlc3Rpb25ub252YWx1ZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGh0bWwgcXVlc3Rpb24uIFVubGlrZSBvdGhlciBxdWVzdGlvbnMgaXQgZG9lc24ndCBoYXZlIHZhbHVlIGFuZCB0aXRsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSHRtbE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25Ob25WYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgbG9jSHRtbCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIsIHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBsb2NIdG1sLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICEhc2VsZi5zdXJ2ZXkgPyBzZWxmLnN1cnZleS5wcm9jZXNzSHRtbChzdHIpIDogc3RyO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJodG1sXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBodG1sIHRvIGRpc3BsYXkgaXRcbiAgICovXG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZEh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucHJvY2Vzc0h0bWwodGhpcy5odG1sKSA6IHRoaXMuaHRtbDtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJodG1sXCIsXG4gIFt7IG5hbWU6IFwiaHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NIdG1sXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibm9udmFsdWVcIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWxNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2h0bWwudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHNlbGVjdCBpbWFnZSBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY29sQ291bnQgPSAwO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaW1hZ2VwaWNrZXJcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJdGVtVmFsdWVUeXBlKCkge1xuICAgIHJldHVybiBcImltYWdlaXRlbXZhbHVlXCI7XG4gIH1cbiAgLyoqXG4gICAqIE11bHRpIHNlbGVjdCBvcHRpb24uIElmIHNldCB0byB0cnVlLCB0aGVuIGFsbG93cyB0byBzZWxlY3QgbXVsdGlwbGUgaW1hZ2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBtdWx0aVNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibXVsdGlTZWxlY3RcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgbXVsdGlTZWxlY3QobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtdWx0aVNlbGVjdFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIGlzIGNoZWNrZWRcbiAgICogQHBhcmFtIGl0ZW0gaW1hZ2UgcGlja2VyIGl0ZW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICB2YXIgdmFsID0gdGhpcy5yZW5kZXJlZFZhbHVlO1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0KSByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHZhbCwgaXRlbS52YWx1ZSk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh2YWxbaV0sIGl0ZW0udmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNVbmtub3duVmFsdWUodmFsW2ldLCB0cnVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB2YWwubGVuZ3RoKSByZXR1cm47XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgbGFiZWwgdW5kZXIgdGhlIGltYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TGFiZWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TGFiZWxcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgdmFyIHZhbHVlID0gc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gICAgaWYodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZih0aGlzLm11bHRpU2VsZWN0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiAgdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VIZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBmaXQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VGaXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUZpdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRlbnRNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbnRlbnRNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29udGVudE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb250ZW50TW9kZVwiLCB2YWwpO1xuICAgIGlmICh2YWwgPT09IFwidmlkZW9cIikge1xuICAgICAgdGhpcy5zaG93TGFiZWwgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFwiaW1hZ2VpdGVtdmFsdWVcIiwgW10sIHVuZGVmaW5lZCwgXCJpdGVtdmFsdWVcIik7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VpdGVtdmFsdWVcIiwge1xuICBuYW1lOiBcImltYWdlTGlua1wiXG59KTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJpbWFnZXBpY2tlclwiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc090aGVyXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm90aGVyVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJvcHRpb25zQ2FwdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJvdGhlckVycm9yVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29udGVudE1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW1hZ2VcIixcbiAgICAgIGNob2ljZXM6IFtcImltYWdlXCIsIFwidmlkZW9cIl1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaW1hZ2VGaXRcIixcbiAgICAgIGRlZmF1bHQ6IFwiY29udGFpblwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImNvbnRhaW5cIiwgXCJjb3ZlclwiLCBcImZpbGxcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJpbWFnZUhlaWdodDpudW1iZXJcIiwgZGVmYXVsdDogMTUwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHsgbmFtZTogXCJpbWFnZVdpZHRoOm51bWJlclwiLCBkZWZhdWx0OiAyMDAsIG1pblZhbHVlOiAwIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcInNob3dMYWJlbDpib29sZWFuXCIsXG4gIGRlZmF1bHQ6IGZhbHNlXG59KTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsXG4gIGRlZmF1bHQ6IDAsXG4gIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0LCA1XVxufSk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcIm11bHRpU2VsZWN0OmJvb2xlYW5cIixcbiAgZGVmYXVsdDogZmFsc2Vcbn0pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJjaG9pY2VzOmltYWdlaXRlbXZhbHVlW11cIlxufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaW1hZ2VwaWNrZXJcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbChuYW1lKTtcbiAgLy9xLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25faW1hZ2VwaWNrZXIudHMiLCJpbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbCB9IGZyb20gXCIuL21hcnRpeEJhc2VcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZywgSUxvY2FsaXphYmxlT3duZXIgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4vcXVlc3Rpb25fZHJvcGRvd25cIjtcbmltcG9ydCB7IElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEYXRhIHtcbiAgb25NYXRyaXhSb3dDaGFuZ2VkKHJvdzogTWF0cml4Um93TW9kZWwpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4Um93TW9kZWwge1xuICBwcml2YXRlIGRhdGE6IElNYXRyaXhEYXRhO1xuICBwcml2YXRlIGl0ZW06IEl0ZW1WYWx1ZTtcbiAgcHJvdGVjdGVkIHJvd1ZhbHVlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHB1YmxpYyBmdWxsTmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IElNYXRyaXhEYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5pdGVtID0gaXRlbTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucm93VmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMucm93VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhKSB0aGlzLmRhdGEub25NYXRyaXhSb3dDaGFuZ2VkKHRoaXMpO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhDZWxsc093bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRSb3dzKCk6IEFycmF5PGFueT47XG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55Pjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hcnRyaXhDZWxscyB7XG4gIHByaXZhdGUgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjZWxsc093bmVyOiBJTWF0cml4Q2VsbHNPd25lcikge31cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIHNldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICByb3cgPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShyb3csIHRoaXMucm93cyk7XG4gICAgY29sdW1uID0gdGhpcy5nZXRDZWxsUm93Q29sdW1uVmFsdWUoY29sdW1uLCB0aGlzLmNvbHVtbnMpO1xuICAgIGlmICghcm93IHx8ICFjb2x1bW4pIHJldHVybjtcbiAgICBpZiAodmFsKSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd10pIHRoaXMudmFsdWVzW3Jvd10gPSB7fTtcbiAgICAgIGlmICghdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dKVxuICAgICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0gPSB0aGlzLmNyZWF0ZVN0cmluZygpO1xuICAgICAgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dLnRleHQgPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlc1tyb3ddICYmIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSkge1xuICAgICAgICB2YXIgbG9jID0gdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICBsb2MudGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChsb2MuaXNFbXB0eSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudmFsdWVzW3Jvd10pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZXNbcm93XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHNldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldENlbGxUZXh0KHNldHRpbmdzLm1hdHJpeERlZmF1bHRSb3dOYW1lLCBjb2x1bW4sIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldENlbGxMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByb3cgPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShyb3csIHRoaXMucm93cyk7XG4gICAgY29sdW1uID0gdGhpcy5nZXRDZWxsUm93Q29sdW1uVmFsdWUoY29sdW1uLCB0aGlzLmNvbHVtbnMpO1xuICAgIGlmICghcm93IHx8ICFjb2x1bW4pIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52YWx1ZXNbcm93XSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0pIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRDZWxsTG9jVGV4dChjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5TG9jVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGNlbGxUZXh0ID0gdGhpcy5nZXRDZWxsTG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgaWYgKGNlbGxUZXh0ICYmICFjZWxsVGV4dC5pc0VtcHR5KSByZXR1cm4gY2VsbFRleHQ7XG4gICAgY2VsbFRleHQgPSB0aGlzLmdldENlbGxMb2NUZXh0KHNldHRpbmdzLm1hdHJpeERlZmF1bHRSb3dOYW1lLCBjb2x1bW4pO1xuICAgIGlmIChjZWxsVGV4dCAmJiAhY2VsbFRleHQuaXNFbXB0eSkgcmV0dXJuIGNlbGxUZXh0O1xuICAgIGlmICh0eXBlb2YgY29sdW1uID09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbHVtbiA9XG4gICAgICAgIGNvbHVtbiA+PSAwICYmIGNvbHVtbiA8IHRoaXMuY29sdW1ucy5sZW5ndGhcbiAgICAgICAgICA/IHRoaXMuY29sdW1uc1tjb2x1bW5dXG4gICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5sb2NUZXh0KSByZXR1cm4gY29sdW1uLmxvY1RleHQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMuZ2V0Q2VsbExvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MuY2FsY3VsYXRlZFRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldENlbGxMb2NUZXh0KHNldHRpbmdzLm1hdHJpeERlZmF1bHRSb3dOYW1lLCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MuY2FsY3VsYXRlZFRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheVRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MuY2FsY3VsYXRlZFRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93cygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jZWxsc093bmVyID8gdGhpcy5jZWxsc093bmVyLmdldFJvd3MoKSA6IFtdO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jZWxsc093bmVyID8gdGhpcy5jZWxsc093bmVyLmdldENvbHVtbnMoKSA6IFtdO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHZhbDogYW55LCB2YWx1ZXM6IEFycmF5PGFueT4pOiBhbnkge1xuICAgIGlmICh0eXBlb2YgdmFsID09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+PSB2YWx1ZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhbCA9IHZhbHVlc1t2YWxdLnZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsLnZhbHVlKSByZXR1cm4gdmFsLnZhbHVlO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciByb3cgaW4gdGhpcy52YWx1ZXMpIHtcbiAgICAgIHZhciByZXNSb3c6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgdmFyIHJvd1ZhbHVlcyA9IHRoaXMudmFsdWVzW3Jvd107XG4gICAgICBmb3IgKHZhciBjb2wgaW4gcm93VmFsdWVzKSB7XG4gICAgICAgIHJlc1Jvd1tjb2xdID0gcm93VmFsdWVzW2NvbF0uZ2V0SnNvbigpO1xuICAgICAgfVxuICAgICAgcmVzW3Jvd10gPSByZXNSb3c7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGZvciAodmFyIHJvdyBpbiB2YWx1ZSkge1xuICAgICAgaWYgKHJvdyA9PSBcInBvc1wiKSBjb250aW51ZTtcbiAgICAgIHZhciByb3dWYWx1ZXMgPSB2YWx1ZVtyb3ddO1xuICAgICAgdGhpcy52YWx1ZXNbcm93XSA9IHt9O1xuICAgICAgZm9yICh2YXIgY29sIGluIHJvd1ZhbHVlcykge1xuICAgICAgICBpZiAoY29sID09IFwicG9zXCIpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgbG9jID0gdGhpcy5jcmVhdGVTdHJpbmcoKTtcbiAgICAgICAgbG9jLnNldEpzb24ocm93VmFsdWVzW2NvbF0pO1xuICAgICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbF0gPSBsb2M7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdHJpbmcoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcy5jZWxsc093bmVyLCB0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgc2ltcGxlIG1hdHJpeCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4TW9kZWxcbiAgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbDxNYXRyaXhSb3dNb2RlbCwgSXRlbVZhbHVlPlxuICBpbXBsZW1lbnRzIElNYXRyaXhEYXRhLCBJTWF0cml4Q2VsbHNPd25lciB7XG4gIHByaXZhdGUgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIGNlbGxzVmFsdWU6IE1hcnRyaXhDZWxscztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jZWxsc1ZhbHVlID0gbmV3IE1hcnRyaXhDZWxscyh0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbHVtbnNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uQ29sdW1uc0NoYW5nZWQoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicm93c1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghc2VsZi5maWx0ZXJJdGVtcygpKSB7XG4gICAgICAgIHNlbGYub25Sb3dzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4XCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIGlmIHlvdSB3YW50IGEgdXNlciB0byBhbnN3ZXIgYWxsIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsUm93UmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbGxSb3dSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0FsbFJvd1JlcXVpcmVkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciBpdGVtcyBpbiBhIHNwZWNpZmljIG9yZGVyOiBcInJhbmRvbVwiIG9yIFwiaW5pdGlhbFwiLiBEZWZhdWx0IGlzIFwiaW5pdGlhbFwiLlxuICAgKi9cbiAgcHVibGljIGdldCByb3dzT3JkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c09yZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93c09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSB0aGlzLnJvd3NPcmRlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NPcmRlclwiLCB2YWwpO1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIGdldFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm93cztcbiAgfVxuICBnZXRDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWl6UXVlc3Rpb25Db3VudCgpIHtcbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmNvcnJlY3RBbnN3ZXJbdGhpcy5yb3dzW2ldLnZhbHVlXSkpIHJlcysrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICB2YXIgcmVzID0gMDtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5yb3dzW2ldLnZhbHVlO1xuICAgICAgaWYgKFxuICAgICAgICAhSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWVbcm93XSkgJiZcbiAgICAgICAgSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMuY29ycmVjdEFuc3dlcltyb3ddLCB2YWx1ZVtyb3ddKVxuICAgICAgKVxuICAgICAgICByZXMrKztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4Um93TW9kZWw+KCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93LnZhbHVlKSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaChcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaXhSb3coXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIHRoaXMuaWQgKyBcIl9cIiArIHJvdy52YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoL1xccy9nLCBcIl9cIiksXG4gICAgICAgICAgdmFsW3Jvdy52YWx1ZV1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCAmJiAhdGhpcy5maWx0ZXJlZFJvd3MpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhcbiAgICAgICAgICBuZXcgSXRlbVZhbHVlKG51bGwpLFxuICAgICAgICAgIHRoaXMubmFtZS5yZXBsYWNlKC9cXHMvZywgXCJfXCIpLFxuICAgICAgICAgIHZhbFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIHNvcnRWaXNpYmxlUm93cyhcbiAgICBhcnJheTogQXJyYXk8TWF0cml4Um93TW9kZWw+XG4gICk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5yb3dzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT09IFwicmFuZG9tXCIpXG4gICAgICByZXR1cm4gSGVscGVycy5yYW5kb21pemVBcnJheTxNYXRyaXhSb3dNb2RlbD4oYXJyYXkpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5zb3J0VmlzaWJsZVJvd3ModGhpcy5yb3dzKTtcbiAgfVxuICBwcm90ZWN0ZWQgcHJvY2Vzc1Jvd3NPblNldChuZXdSb3dzOiBBcnJheTxhbnk+KSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydFZpc2libGVSb3dzKG5ld1Jvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmlzaWJsZSByb3dzIGFzIG1vZGVsIG9iamVjdHMuXG4gICAqIEBzZWUgcm93c1Zpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVSb3dzKCk7XG4gIH1cbiAgcHVibGljIGdldCBjZWxscygpOiBNYXJ0cml4Q2VsbHMge1xuICAgIHJldHVybiB0aGlzLmNlbGxzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjZWxscyh2YWx1ZTogTWFydHJpeENlbGxzKSB7XG4gICAgdGhpcy5jZWxscy5zZXRKc29uKHZhbHVlICYmIHZhbHVlLmdldEpzb24gPyB2YWx1ZS5nZXRKc29uKCkgOiBudWxsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NlbGxUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jZWxscy5pc0VtcHR5O1xuICB9XG4gIHB1YmxpYyBzZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnksIHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5jZWxscy5zZXRDZWxsVGV4dChyb3csIGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxscy5nZXRDZWxsVGV4dChyb3csIGNvbHVtbik7XG4gIH1cbiAgcHVibGljIHNldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNlbGxzLnNldERlZmF1bHRDZWxsVGV4dChjb2x1bW4sIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMuZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbik7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5VGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmdldENlbGxEaXNwbGF5VGV4dChyb3csIGNvbHVtbik7XG4gIH1cbiAgcHJpdmF0ZSBlbXB0eUxvY2FsaXphYmxlU3RyaW5nID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMpO1xuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jZWxscy5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MgOiB0aGlzLmVtcHR5TG9jYWxpemFibGVTdHJpbmc7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JJblJvd3MoKSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IobnVsbCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc0FsbFJvd1JlcXVpcmVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICF0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpO1xuICB9XG4gIHByaXZhdGUgaGFzVmFsdWVzSW5BbGxSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gcm93c1tpXS52YWx1ZTtcbiAgICAgIGlmICghdmFsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5nZXRJc0Fuc3dlcmVkKCkgJiYgdGhpcy5oYXNWYWx1ZXNJbkFsbFJvd3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBmdWxsTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogTWF0cml4Um93TW9kZWwge1xuICAgIHJldHVybiBuZXcgTWF0cml4Um93TW9kZWwoaXRlbSwgZnVsbE5hbWUsIHRoaXMsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nIHx8XG4gICAgICAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fFxuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMFxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzWzBdLnZhbHVlID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XG4gICAgICAgIHZhciByb3dWYWwgPSB2YWxbcm93Lm5hbWVdID8gdmFsW3Jvdy5uYW1lXSA6IG51bGw7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udmFsdWUgPSByb3dWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgdmFyIG5ld0tleSA9IGtleXNBc1RleHRcbiAgICAgICAgPyBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy5yb3dzLCBrZXkpXG4gICAgICAgIDoga2V5O1xuICAgICAgaWYgKCFuZXdLZXkpIG5ld0tleSA9IGtleTtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLmNvbHVtbnMsIHZhbHVlW2tleV0pO1xuICAgICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgcmVzW25ld0tleV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZVxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gT2JqZWN0LmtleXModmFsdWVzIHx8IHt9KS5tYXAocm93TmFtZSA9PiB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLnJvd3MuZmlsdGVyKFxuICAgICAgICAgIChyOiBNYXRyaXhSb3dNb2RlbCkgPT4gci52YWx1ZSA9PT0gcm93TmFtZVxuICAgICAgICApWzBdO1xuICAgICAgICB2YXIgcm93RGF0YUl0ZW0gPSA8YW55PntcbiAgICAgICAgICBuYW1lOiByb3dOYW1lLFxuICAgICAgICAgIHRpdGxlOiAhIXJvdyA/IHJvdy50ZXh0IDogXCJyb3dcIixcbiAgICAgICAgICB2YWx1ZTogdmFsdWVzW3Jvd05hbWVdLFxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyxcbiAgICAgICAgICAgIHZhbHVlc1tyb3dOYW1lXVxuICAgICAgICAgICksXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICBpc05vZGU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKFxuICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMsXG4gICAgICAgICAgdmFsdWVzW3Jvd05hbWVdXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIWl0ZW0pIHtcbiAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goY2FsY3VsYXRpb24gPT4ge1xuICAgICAgICAgICAgcm93RGF0YUl0ZW1bY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXSA9XG4gICAgICAgICAgICAgIGl0ZW1bY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93RGF0YUl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5yb3dzW2ldLnZhbHVlKSB7XG4gICAgICAgIG5hbWVzLnB1c2godGhpcy5uYW1lICsgXCIuXCIgKyB0aGlzLnJvd3NbaV0udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV07XG4gICAgICBpZiAoISFyb3cudmFsdWUpIHtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUgKyBcIi5cIiArIHJvdy52YWx1ZSxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnByb2Nlc3NlZFRpdGxlICsgXCIuXCIgKyByb3cuY2FsY3VsYXRlZFRleHQsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgdmFyIHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChwYXRoKTtcbiAgICBxdWVzdGlvbi5jaG9pY2VzID0gdGhpcy5jb2x1bW5zO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocXVlc3Rpb24pO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgaWYgKHRoaXMuaGFzUm93cykge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChyb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfXCIgKyByb3dzWzBdLm5hbWUgKyBcIl9cIiArIDA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgLy9JTWF0cml4RGF0YVxuICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCkge1xuICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy5oYXNSb3dzKSB7XG4gICAgICB0aGlzLnNldE5ld1ZhbHVlKHJvdy52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld1ZhbHVlID0ge307XG4gICAgICB9XG4gICAgICBuZXdWYWx1ZVtyb3cubmFtZV0gPSByb3cudmFsdWU7XG4gICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfY29sdW1uXCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY2VsbHM6Y2VsbHNcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImNlbGxzXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJvd3NPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJpbml0aWFsXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gICAgfSxcbiAgICBcImlzQWxsUm93UmVxdWlyZWQ6Ym9vbGVhblwiXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeC50cyIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBJTWF0cml4RHJvcGRvd25EYXRhXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxufVxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRvdGFsVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInJvd3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgIHNlbGYuZmlsdGVySXRlbXMoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGRyb3Bkb3duXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHNob3cgaXQgb24gdGhlIGZpcnN0IGNvbHVtbiBmb3IgdGhlIHRvdGFsIHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdG90YWxUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRvdGFsVGV4dFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxUZXh0XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUb3RhbFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidG90YWxUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBnZXRGb290ZXJUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUb3RhbFRleHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybiB2YWx1ZXM7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3dWYWx1ZSA9IHRoaXMucm93c1tpXS52YWx1ZTtcbiAgICAgIHZhciB2YWwgPSB2YWx1ZXNbcm93VmFsdWVdO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleXNBc1RleHQpIHtcbiAgICAgICAgdmFyIGRpc3BsYXlSb3dWYWx1ZSA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICAgICAgICB0aGlzLnJvd3MsXG4gICAgICAgICAgcm93VmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhZGlzcGxheVJvd1ZhbHVlKSB7XG4gICAgICAgICAgcm93VmFsdWUgPSBkaXNwbGF5Um93VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICg8YW55PnJlcylbcm93VmFsdWVdID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLnJvd3NbaV0udmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdmFyIHByZWZpeCA9IHRoaXMubmFtZSArIFwiLlwiICsgdGhpcy5yb3dzW2ldLnZhbHVlICsgXCIuXCI7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBuYW1lcy5wdXNoKHByZWZpeCArIHRoaXMuY29sdW1uc1tqXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0ID8gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29udGV4dCkgPiAtMSA6IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5yb3dzW2ldO1xuICAgICAgaWYgKCFyb3cudmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdmFyIHByZWZpeE5hbWUgPSB0aGlzLm5hbWUgKyBcIi5cIiArIHJvdy52YWx1ZSArIFwiLlwiO1xuICAgICAgdmFyIHByZWZpeFRpdGxlID0gdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgcm93LmNhbGN1bGF0ZWRUZXh0ICsgXCIuXCI7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zW2pdO1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHByZWZpeE5hbWUgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB0ZXh0OiBwcmVmaXhUaXRsZSArIGNvbHVtbi5mdWxsVGl0bGUsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgICAgICBpZiAoY29sdW1uID09IGNvbnRleHQpIGNvbnRpbnVlO1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IFwicm93LlwiICsgY29sdW1uLm5hbWUsXG4gICAgICAgICAgdGV4dDogXCJyb3cuXCIgKyBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShyb3dzLCBrZXkpKSB7XG4gICAgICAgIGlmIChuZXdWYWwgPT0gbnVsbCkgbmV3VmFsID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbClba2V5XSA9IHZhbFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXNJblJvd3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+KCk7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghcm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhyb3dzW2ldLCB2YWxbcm93c1tpXS52YWx1ZV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Sb3dNb2RlbChpdGVtLnZhbHVlLCBpdGVtLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCJcbiAgICB9LFxuICAgIFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICB7IG5hbWU6IFwidG90YWxUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUb3RhbFRleHRcIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgcS5yb3dzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJpbXBvcnQge1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgSU1hdHJpeERyb3Bkb3duRGF0YSxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW5cbn0gZnJvbSBcIi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IE1pblJvd0NvdW50RXJyb3IsIEtleUR1cGxpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHluYW1pY1Jvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5kZXg6IG51bWJlciwgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xuICAgIHN1cGVyKGRhdGEsIHZhbHVlKTtcbiAgICB0aGlzLmJ1aWxkQ2VsbHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbWF0cml4IGR5bWFuaWMgcXVlc3Rpb24uIFlvdSBtYXkgdXNlIGEgZHJvcGRvd24sIGNoZWNrYm94LCByYWRpb2dyb3VwLCB0ZXh0IGFuZCBjb21tZW50IHF1ZXN0aW9ucyBhcyBhIGNlbGwgZWRpdG9ycy5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHJvd3MsIHVubGlrZSBpbiBtYXRyaXggZHJvcGRvd24gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2VcbiAgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgcHJpdmF0ZSByb3dDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSByb3dDb3VudFZhbHVlOiBudW1iZXIgPSAyO1xuICBwcml2YXRlIHNldFJvd0NvdW50VmFsdWVGcm9tRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkeW5hbWljXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1Jvd3NEeW5hbWljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgb24gcmVtb3ZpbmcgYSByb3dcbiAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gYSBjb2x1bW4gbmFtZSBhbmQgdGhlIGxpYnJhcnkgc2hvd3MgZHVwbGljYXRpb24gZXJyb3IsIGlmIHRoZXJlIGFyZSBzYW1lIHZhbHVlcyBpbiBkaWZmZXJlbnQgcm93cyBpbiB0aGUgY29sdW1uLlxuICAgKiBAc2VlIGtleUR1cGxpY2F0aW9uRXJyb3JcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5TmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogSWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGV2ZXJ5IG5ldyByb3csIGluY2x1ZGluZyByb3dzIGNyZWF0ZWQgaW5pdGlhbGx5LCB1bmxlc3MgdGhlIGRlZmF1bHRWYWx1ZSBpcyBub3QgZW1wdHlcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1xuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0Um93VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFJvd1ZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFJvd1ZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFJvd1ZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gbmV3IGFkZGVkIHJvdyBmcm9tIHRoZSBsYXN0IHJvdy4gSWYgZGVmYXVsdFJvd1ZhbHVlIGlzIHNldCBhbmQgdGhpcyBwcm9wZXJ0eSBlcXVhbHMgdG8gdHJ1ZSxcbiAgICogdGhlbiB0aGUgdmFsdWUgZm9yIG5ldyBhZGRlZCByb3cgaXMgbWVyZ2luZy5cbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0Um93VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRSb3dWYWx1ZSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0Um93VmFsdWUpIHx8XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpXG4gICAgKSB7XG4gICAgICBzdXBlci5zZXREZWZhdWx0VmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLnJvd0NvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgbmV3VmFsdWUucHVzaCh0aGlzLmRlZmF1bHRSb3dWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBtYXRyaXguXG4gICAqIEBzZWUgbWluUm93Q291bnRcbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCByb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd0NvdW50VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCByb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IHNldHRpbmdzLm1hdHJpeE1heGltdW1Sb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0Um93Q291bnRWYWx1ZUZyb21EYXRhID0gZmFsc2U7XG4gICAgdmFyIHByZXZWYWx1ZSA9IHRoaXMucm93Q291bnRWYWx1ZTtcbiAgICB0aGlzLnJvd0NvdW50VmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiB2YWwpIHtcbiAgICAgIHZhciBxVmFsID0gdGhpcy52YWx1ZTtcbiAgICAgIHFWYWwuc3BsaWNlKHZhbCk7XG4gICAgICB0aGlzLnZhbHVlID0gcVZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5zcGxpY2UodmFsKTtcbiAgICAgIGZvciAodmFyIGkgPSBwcmV2VmFsdWU7IGkgPCB2YWw7IGkrKykge1xuICAgICAgICB2YXIgbmV3Um93ID0gdGhpcy5jcmVhdGVNYXRyaXhSb3cobnVsbCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MucHVzaChuZXdSb3cpO1xuICAgICAgICB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChuZXdSb3cpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gcm93IGNvdW50LiBBIHVzZXIgY291bGQgbm90IGRlbGV0ZSBhIHJvdyBpZiB0aGUgcm93Q291bnQgZXF1YWxzIHRvIG1pblJvd0NvdW50XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtaW5Sb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5Sb3dDb3VudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblJvd0NvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHZhbCA9IDA7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluUm93Q291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsID4gdGhpcy5tYXhSb3dDb3VudCkgdGhpcy5tYXhSb3dDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA8IHZhbCkgdGhpcy5yb3dDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gcm93IGNvdW50LiBBIHVzZXIgY291bGQgbm90IGFkZCBhIHJvdyBpZiB0aGUgcm93Q291bnQgZXF1YWxzIHRvIG1heFJvd0NvdW50XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhSb3dDb3VudFwiLCBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Um93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHJldHVybjtcbiAgICBpZiAodmFsID4gc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50KVxuICAgICAgdmFsID0gc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50O1xuICAgIGlmICh2YWwgPT0gdGhpcy5tYXhSb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA8IHRoaXMubWluUm93Q291bnQpIHRoaXMubWluUm93Q291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPiB2YWwpIHRoaXMucm93Q291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgYSBuZXcgcm93IGNhbiBiZSBhZGRlZC5cbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKiBAc2VlIGNhblJlbW92ZVJvd3NcbiAgICogQHNlZSByb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5BZGRSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzUmVhZE9ubHkgJiYgdGhpcy5yb3dDb3VudCA8IHRoaXMubWF4Um93Q291bnQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgcm93IGNhbiBiZSByZW1vdmVkLlxuICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAqIEBzZWUgY2FuQWRkUm93XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuUmVtb3ZlUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSZWFkT25seSAmJiB0aGlzLnJvd0NvdW50ID4gdGhpcy5taW5Sb3dDb3VudDtcbiAgfVxuICBwdWJsaWMgY2FuUmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF0cml4QWxsb3dSZW1vdmVSb3coXG4gICAgICB0aGlzLFxuICAgICAgKDxNYXRyaXhEeW5hbWljUm93TW9kZWw+cm93KS5pbmRleCxcbiAgICAgIHJvd1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgYWRkIGEgbmV3IHJvdy5cbiAgICovXG4gIHB1YmxpYyBhZGRSb3coKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiB0aGlzLCBjYW5BZGRSb3c6IHRoaXMuY2FuQWRkUm93IH07XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuY2FuQWRkUm93KSByZXR1cm47XG4gICAgdGhpcy5vblN0YXJ0Um93QWRkaW5nUmVtb3ZpbmcoKTtcbiAgICB0aGlzLmFkZFJvd0NvcmUoKTtcbiAgICB0aGlzLm9uRW5kUm93QWRkaW5nKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Jvd3NBc0l0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGFkZFJvd0NvcmUoKSB7XG4gICAgdmFyIHByZXZSb3dDb3VudCA9IHRoaXMucm93Q291bnQ7XG4gICAgdGhpcy5yb3dDb3VudCA9IHRoaXMucm93Q291bnQgKyAxO1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRSb3dWYWx1ZSh0cnVlKTtcbiAgICB2YXIgbmV3VmFsdWUgPSBudWxsO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5ydW5DZWxsc0NvbmRpdGlvbihcbiAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICAgICk7XG4gICAgICB2YXIgcm93ID0gdGhpcy52aXNpYmxlUm93c1t0aGlzLnJvd0NvdW50IC0gMV07XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHJvdy52YWx1ZSkpIHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdLCByb3cudmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdID0gcm93LnZhbHVlO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIGlmIChwcmV2Um93Q291bnQgKyAxID09IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Um93QWRkZWQodGhpcyk7XG4gICAgICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldERlZmF1bHRSb3dWYWx1ZShpc1Jvd0FkZGVkOiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSB0aGlzLmNvbHVtbnNbaV0udGVtcGxhdGVRdWVzdGlvbjtcbiAgICAgIGlmICghIXEgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHEuZ2V0RGVmYXVsdFZhbHVlKCkpKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgKDxhbnk+cmVzKVt0aGlzLmNvbHVtbnNbaV0ubmFtZV0gPSBxLmdldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgKDxhbnk+cmVzKVtrZXldID0gdGhpcy5kZWZhdWx0Um93VmFsdWVba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUm93QWRkZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWVGcm9tTGFzdFJvdykge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoISF2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPj0gdGhpcy5yb3dDb3VudCAtIDEpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gdmFsW3RoaXMucm93Q291bnQgLSAyXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHJvd1ZhbHVlKSB7XG4gICAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAgICg8YW55PnJlcylba2V5XSA9IHJvd1ZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBieSBpdCdzIGluZGV4LiBJZiBjb25maXJtRGVsZXRlIGlzIHRydWUsIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAqIEBwYXJhbSBpbmRleCBhIHJvdyBpbmRleCwgZnJvbSAwIHRvIHJvd0NvdW50IC0gMVxuICAgKiBAc2VlIHJlbW92ZVJvd1xuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3dVSSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdmFsdWUgJiYgISF2YWx1ZS5yb3dOYW1lKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnZpc2libGVSb3dzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgdmFsdWUgPSBpbmRleDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNSZXF1aXJlQ29uZmlybU9uUm93RGVsZXRlKHZhbHVlKSB8fFxuICAgICAgY29uZmlybSh0aGlzLmNvbmZpcm1EZWxldGVUZXh0KVxuICAgICkge1xuICAgICAgdGhpcy5yZW1vdmVSb3codmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNSZXF1aXJlQ29uZmlybU9uUm93RGVsZXRlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA+PSB2YWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2luZGV4XSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByb3cgYnkgaXQncyBpbmRleC5cbiAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUm93cykgcmV0dXJuO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMub25TdGFydFJvd0FkZGluZ1JlbW92aW5nKCk7XG4gICAgdGhpcy5yZW1vdmVSb3dDb3JlKGluZGV4KTtcbiAgICB0aGlzLm9uRW5kUm93UmVtb3ZpbmcoaW5kZXgpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUm93Q29yZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgICAgICA/IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaW5kZXhdXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeFJvd1JlbW92ZWQodGhpcywgaW5kZXgsIHJvdyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzICYmIGluZGV4IDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlLS07XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHZhciB2YWwgPSBbXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIGluZGV4IDwgdGhpcy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFsID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHZhbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdmFsID0gdGhpcy5kZWxldGVSb3dWYWx1ZSh2YWwsIG51bGwpO1xuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZHVwbGljYXRpb24gdmFsdWUgZXJyb3IgdGV4dC4gU2V0IGl0IHRvIHNob3cgdGhlIHRleHQgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBzZWUga2V5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBrZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5RHVwbGljYXRpb25FcnJvcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NLZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZFJvd1RleHQoKSB7XG4gICAgdmFyIGRlZmF1bHRMb2NOYW1lID0gdGhpcy5pc0NvbHVtbkxheW91dEhvcml6b250YWwgPyBcImFkZFJvd1wiIDogXCJhZGRDb2x1bW5cIjtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImFkZFJvd1RleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoZGVmYXVsdExvY05hbWUpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFkZFJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImFkZFJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQWRkUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlICdBZGQgUm93JyBidXR0b24gaXMgc2hvd24gb24gYm90dG9tIGlmIGNvbHVtbkxheW91dCBpcyBob3Jpem9udGFsIGFuZCBvbiB0b3AgaWYgY29sdW1uTGF5b3V0IGlzIHZlcnRpY2FsLiA8YnIvPlxuICAgKiBZb3UgbWF5IHNldCBpdCB0byBcInRvcFwiLCBcImJvdHRvbVwiIG9yIFwidG9wQm90dG9tXCIgKHRvIHNob3cgb24gdG9wIGFuZCBib3R0b20pLlxuICAgKiBAc2VlIGNvbHVtbkxheW91dFxuICAgKi9cbiAgcHVibGljIGdldCBhZGRSb3dMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhZGRSb3dMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFkZFJvd0xvY2F0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWRkUm93TG9jYXRpb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWRkUm93T25Ub3AoKSB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZFJvdykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmFkZFJvd0xvY2F0aW9uID09PSBcImRlZmF1bHRcIilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxheW91dCA9PT0gXCJ2ZXJ0aWNhbFwiO1xuICAgIHJldHVybiB0aGlzLmFkZFJvd0xvY2F0aW9uICE9PSBcImJvdHRvbVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBZGRSb3dPbkJvdHRvbSgpIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkUm93KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuYWRkUm93TG9jYXRpb24gPT09IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGF5b3V0ID09PSBcImhvcml6b250YWxcIjtcbiAgICByZXR1cm4gdGhpcy5hZGRSb3dMb2NhdGlvbiAhPT0gXCJ0b3BcIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbW92ZVJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJyZW1vdmVSb3dUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUm93XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbW92ZVJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlbW92ZVJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVtb3ZlUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aCAmJiBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgdmFsdWVzW2ldID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgbmFtZXMucHVzaCh0aGlzLm5hbWUgKyBcIlswXS5cIiArIHRoaXMuY29sdW1uc1tpXS5uYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0ID8gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29udGV4dCkgPiAtMSA6IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lICsgXCJbMF0uXCIgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiWzBdLlwiICsgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgICAgcXVlc3Rpb246IHRoaXNcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc0NvbnRleHQgJiYgY29sdW1uICE9IGNvbnRleHQpIHtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInJvdy5cIiArIGNvbHVtbi5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicm93LlwiICsgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1Jvd1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgIGlmICh0aGlzLmhhc0Vycm9ySW5Sb3dzKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBNaW5Sb3dDb3VudEVycm9yKHRoaXMubWluUm93Q291bnQsIHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICB2YXIgcHJldlZhbHVlID0gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjayk7XG4gICAgdmFyIGlzRHVwbGljYXRlZCA9IHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQoKTtcbiAgICByZXR1cm4gaXNEdXBsaWNhdGVkIHx8IHByZXZWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1pblJvd0NvdW50IDw9IDAgfHwgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgdmFyIHNldFJvd0NvdW50ID0gMDtcbiAgICBmb3IgKFxuICAgICAgdmFyIHJvd0luZGV4ID0gMDtcbiAgICAgIHJvd0luZGV4IDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7XG4gICAgICByb3dJbmRleCsrXG4gICAgKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tyb3dJbmRleF07XG4gICAgICBpZiAoIXJvdy5pc0VtcHR5KSBzZXRSb3dDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gc2V0Um93Q291bnQgPCB0aGlzLm1pblJvd0NvdW50O1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmtleU5hbWUgfHwgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUodGhpcy5rZXlOYW1lKTtcbiAgICBpZiAoIWNvbHVtbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBrZXlWYWx1ZXMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgPVxuICAgICAgICB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkSW5Sb3coXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXSxcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAga2V5VmFsdWVzXG4gICAgICAgICkgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWRJblJvdyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAga2V5VmFsdWVzOiBBcnJheTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09IGtleVZhbHVlc1tpXSkge1xuICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihcbiAgICAgICAgICBuZXcgS2V5RHVwbGljYXRpb25FcnJvcih0aGlzLmtleUR1cGxpY2F0aW9uRXJyb3IsIHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBrZXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhEeW5hbWljUm93TW9kZWw+KCk7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3codGhpcy5nZXRSb3dWYWx1ZUJ5SW5kZXgodmFsLCBpKSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyh2YWx1ZTogYW55KTogTWF0cml4RHluYW1pY1Jvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeER5bmFtaWNSb3dNb2RlbCh0aGlzLnJvd0NvdW50ZXIrKywgdGhpcywgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybjtcbiAgICB2YXIgbmV3Um93Q291bnQgPSB2YWwubGVuZ3RoO1xuICAgIGlmIChuZXdSb3dDb3VudCA9PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnNldFJvd0NvdW50VmFsdWVGcm9tRGF0YSAmJiBuZXdSb3dDb3VudCA8IHRoaXMucm93Q291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFJvd0NvdW50VmFsdWVGcm9tRGF0YSA9IHRydWU7XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlID0gbmV3Um93Q291bnQ7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKCk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCFyZXN1bHQgfHwgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmVzdWx0ID0gW107XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiB0aGlzLnJvd0NvdW50KSByZXN1bHQuc3BsaWNlKHRoaXMucm93Q291bnQpO1xuICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKTtcbiAgICByb3dWYWx1ZSA9IHJvd1ZhbHVlIHx8IHt9O1xuICAgIGZvciAodmFyIGkgPSByZXN1bHQubGVuZ3RoOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChIZWxwZXJzLmdldFVuYmluZFZhbHVlKHJvd1ZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdChuZXdWYWx1ZVtpXSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWVbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd1ZhbHVlQnlJbmRleChxdWVzdGlvblZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgcXVlc3Rpb25WYWx1ZS5sZW5ndGhcbiAgICAgID8gcXVlc3Rpb25WYWx1ZVtpbmRleF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93VmFsdWVDb3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcXVlc3Rpb25WYWx1ZTogYW55LFxuICAgIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4ge307XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KFxuICAgICAgcXVlc3Rpb25WYWx1ZSxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpXG4gICAgKTtcbiAgICBpZiAoIXJlcyAmJiBjcmVhdGUpIHJlcyA9IHt9O1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkeW5hbWljXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicm93Q291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDIsIG1pblZhbHVlOiAwIH0sXG4gICAgeyBuYW1lOiBcIm1pblJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4Um93Q291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnRcbiAgICB9LFxuICAgIHsgbmFtZTogXCJrZXlOYW1lXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCJcbiAgICB9LFxuICAgIFwiZGVmYXVsdFJvd1ZhbHVlOnJvd3ZhbHVlXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvdzpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcImNvbmZpcm1EZWxldGU6Ym9vbGVhblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbmZpcm1EZWxldGVUZXh0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYWRkUm93TG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcInRvcEJvdHRvbVwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFkZFJvd1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0FkZFJvd1RleHRcIiB9LFxuICAgIHsgbmFtZTogXCJyZW1vdmVSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZW1vdmVSb3dUZXh0XCIgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7XG4gIEJhc2UsXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleSxcbiAgSVBhbmVsLFxuICBJRWxlbWVudCxcbiAgSVRleHRQcm9jZXNzb3Jcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yLCBJVmFsaWRhdG9yT3duZXIgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCB7IFF1ZXN0aW9uLCBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcIi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBbnN3ZXJSZXF1aXJlZEVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNdWx0aXBsZVRleHREYXRhIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIsIElQYW5lbCB7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yO1xuICBnZXRBbGxWYWx1ZXMoKTogYW55O1xuICBnZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIHNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueTtcbiAgZ2V0SXRlbURlZmF1bHRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIGdldElzUmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCBleHRlbmRzIEJhc2VcbiAgaW1wbGVtZW50cyBJVmFsaWRhdG9yT3duZXIsIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCB7XG4gIHByaXZhdGUgZWRpdG9yVmFsdWU6IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElNdWx0aXBsZVRleHREYXRhO1xuXG4gIHZhbHVlQ2hhbmdlZENhbGxiYWNrOiAobmV3VmFsdWU6IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBhbnkgPSBudWxsLCB0aXRsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lZGl0b3JWYWx1ZSA9IHRoaXMuY3JlYXRlRWRpdG9yKG5hbWUpO1xuICAgIHRoaXMuZWRpdG9yLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9O1xuICAgIHRoaXMuZWRpdG9yLnRpdGxlTG9jYXRpb24gPSBcImxlZnRcIjtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRpdGVtXCI7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pZDtcbiAgfVxuICAvKipcbiAgICogVGhlIGl0ZW0gbmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5uYW1lO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLm5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3IoKTogUXVlc3Rpb25UZXh0TW9kZWwge1xuICAgIHJldHVybiB0aGlzLmVkaXRvclZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVFZGl0b3IobmFtZTogc3RyaW5nKTogUXVlc3Rpb25UZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwobmFtZSk7XG4gIH1cbiAgcHVibGljIGFkZFVzZWRMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBzdXBlci5hZGRVc2VkTG9jYWxlcyhsb2NhbGVzKTtcbiAgICB0aGlzLmVkaXRvci5hZGRVc2VkTG9jYWxlcyhsb2NhbGVzKTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB0aGlzLmVkaXRvci5sb2NTdHJzQ2hhbmdlZCgpO1xuICB9XG4gIHNldERhdGEoZGF0YTogSU11bHRpcGxlVGV4dERhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIGlmICghIWRhdGEpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlZmF1bHRWYWx1ZSA9IGRhdGEuZ2V0SXRlbURlZmF1bHRWYWx1ZSh0aGlzLm5hbWUpO1xuICAgICAgdGhpcy5lZGl0b3Iuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICAgIHRoaXMuZWRpdG9yLnBhcmVudCA9IGRhdGE7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBpdGVtIGEgcmVxdWlyZWQuIElmIGEgdXNlciBkb2Vzbid0IGZpbGwgdGhlIGl0ZW0gdGhlbiBhIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuZWRpdG9yLmlzUmVxdWlyZWQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaW5wdXRUeXBlO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5wdXRUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IuaW5wdXRUeXBlID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBJdGVtIHRpdGxlLiBJZiBpdCBpcyBlbXB0eSwgdGhlIGl0ZW0gbmFtZSBpcyByZW5kZXJlZCBhcyB0aXRsZS4gVGhpcyBwcm9wZXJ0eSBzdXBwb3J0cyBtYXJrZG93bi5cbiAgICogQHNlZSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci50aXRsZSA9IHZhbDtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9yIGh0bWwgZm9yIHJlbmRlcmluZyB0aGUgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5mdWxsVGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbWltIHRleHQgbGVuZ3RoLiBJZiBpdCBpcyAtMSwgZGVmYXVsIHZhbHVlLCB0aGVuIHRoZSBzdXJ2ZXkgbWF4VGV4dExlbmd0aCBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQuXG4gICAqIElmIGl0IGlzIDAsIHRoZW4gdGhlIHZhbHVlIGlzIHVubGltaXRlZFxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLm1heExlbmd0aDtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuZWRpdG9yLm1heExlbmd0aCA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0TWF4TGVuZ3RoKCk6IGFueSB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0TWF4TGVuZ3RoKFxuICAgICAgdGhpcy5tYXhMZW5ndGgsXG4gICAgICBzdXJ2ZXkgPyBzdXJ2ZXkubWF4VGV4dExlbmd0aCA6IC0xXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IucGxhY2VIb2xkZXI7XG4gIH1cbiAgcHVibGljIHNldCBwbGFjZUhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLnBsYWNlSG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmxvY1BsYWNlSG9sZGVyO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIG9uIHJlcXVpcmVkIGVycm9yLiBVc2UgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNob3cgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IucmVxdWlyZWRFcnJvclRleHQ7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLnJlcXVpcmVkRXJyb3JUZXh0ID0gdmFsO1xuICB9XG4gIGdldCBsb2NSZXF1aXJlZEVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmxvY1JlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBxdWVzdGlvbiB2YWxpZGF0b3JzLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLmVkaXRvci52YWxpZGF0b3JzID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gSGVscGVycy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHVibGljIG9uVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy52YWx1ZUNoYW5nZWRDYWxsYmFjaykgdGhpcy52YWx1ZUNoYW5nZWRDYWxsYmFjayhuZXdWYWx1ZSk7XG4gIH1cbiAgLy9JU3VydmV5SW1wbFxuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFN1cnZleSgpIDogbnVsbDtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFRleHRQcm9jZXNzb3IoKSA6IG51bGw7XG4gIH1cbiAgLy9JU3VydmV5RGF0YVxuICBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWUpO1xuICB9XG4gIHNldFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHt9XG4gIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykge31cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGF0YSkgcmV0dXJuIHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEFsbFZhbHVlcygpO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSB9O1xuICB9XG4gIC8vSVZhbGlkYXRvck93bmVyXG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGl0bGU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxuICBnZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICB9XG4gIGdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbXVsdGlwbGUgdGV4dCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElNdWx0aXBsZVRleHREYXRhLCBJUGFuZWwge1xuICBjb2xDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5jcmVhdGVOZXdBcnJheShcIml0ZW1zXCIsIGZ1bmN0aW9uKGl0ZW06IGFueSkge1xuICAgICAgaXRlbS5zZXREYXRhKHNlbGYpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpdGVtc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb2xDb3VudFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0XCI7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldLnNldERhdGEodGhpcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMuZWRpdG9yc09uU3VydmV5TG9hZCgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIGZhbHNlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmVkaXRvcikgaXRlbS5lZGl0b3IudXBkYXRlVmFsdWVGcm9tU3VydmV5KGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uZWRpdG9yKSBpdGVtLmVkaXRvci5vblN1cnZleVZhbHVlQ2hhbmdlZChpdGVtLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlZGl0b3JzT25TdXJ2ZXlMb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uZWRpdG9yKSB7XG4gICAgICAgICg8YW55Pml0ZW0pLmVkaXRvci5vblN1cnZleUxvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGlucHV0IGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtcyh2YWw6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgdGV4dCBpdGVtLlxuICAgKiBAcGFyYW0gbmFtZSBhIGl0ZW0gbmFtZVxuICAgKiBAcGFyYW0gdGl0bGUgYSBpdGVtIHRpdGxlIChvcHRpb25hbClcbiAgICovXG4gIHB1YmxpYyBhZGRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHZhciBpdGVtID0gdGhpcy5jcmVhdGVUZXh0SXRlbShuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLml0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVzLnB1c2godGhpcy5uYW1lICsgXCIuXCIgKyB0aGlzLml0ZW1zW2ldLm5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUgKyBcIi5cIiArIGl0ZW0ubmFtZSxcbiAgICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgaXRlbS5mdWxsVGl0bGUsXG4gICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5TmFtZShwYXRoKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QoaXRlbSk7XG4gICAganNvbltcInR5cGVcIl0gPSBcInRleHRcIjtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSB8fCB2YWwgPiA1KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGV4dCBpbnB1dCBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGl0ZW1TaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbVNpemVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiByZW5kZXJlZCByb3dzLlxuICAgKi9cbiAgcHVibGljIGdldFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIGNvbENvdW50ID0gdGhpcy5jb2xDb3VudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciByb3dzID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5kZXggPT0gMCkge1xuICAgICAgICByb3dzLnB1c2goW10pO1xuICAgICAgfVxuICAgICAgcm93c1tyb3dzLmxlbmd0aCAtIDFdLnB1c2goaXRlbXNbaV0pO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGlmIChpbmRleCA+PSBjb2xDb3VudCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG4gIHByaXZhdGUgaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMub25JdGVtVmFsdWVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVRleHRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtTW9kZWwobmFtZSwgdGl0bGUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1WYWx1ZUNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbVZhbHVlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuaXRlbXNbaV0ubmFtZSBpbiB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGl0ZW1WYWx1ZSA9IHRoaXMudmFsdWVbdGhpcy5pdGVtc1tpXS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXRlbXNbaV0ub25WYWx1ZUNoYW5nZWQoaXRlbVZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cGVyLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5lZGl0b3IuaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uZWRpdG9yLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gKFxuICAgICAgICBoYXNFcnJvcnM6IGJvb2xlYW5cbiAgICAgICkgPT4ge1xuICAgICAgICB0aGlzLnJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgIH07XG4gICAgICByZXMgPSB0aGlzLml0ZW1zW2ldLmVkaXRvci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlcnJvcnMgPSB0aGlzLml0ZW1zW2ldLmVkaXRvci5nZXRBbGxFcnJvcnMoKTtcbiAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3IuY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0uZWRpdG9yLmNvbnRhaW5zRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRpdG9yID0gdGhpcy5pdGVtc1tpXS5lZGl0b3I7XG4gICAgICBpZiAoZWRpdG9yLmlzVmlzaWJsZSAmJiAhZWRpdG9yLmlzQW5zd2VyZWQpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvL0lNdWx0aXBsZVRleHREYXRhXG4gIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy52YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVbbmFtZV07XG4gIH1cbiAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICB9XG4gICAgbmV3VmFsdWVbbmFtZV0gPSB2YWx1ZTtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIGdldEl0ZW1EZWZhdWx0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRlZmF1bHRWYWx1ZSA/IHRoaXMuZGVmYXVsdFZhbHVlW25hbWVdIDogbnVsbDtcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5O1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3I7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCkgOiBudWxsO1xuICB9XG4gIGdldElzUmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0IDogXCJcIjtcbiAgfVxuICAvL0lQYW5lbFxuICBhZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7fVxuICByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBlbGVtZW50V2lkdGhDaGFuZ2VkKGVsOiBJRWxlbWVudCkge31cbiAgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGluZGV4T2YoZWw6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtdWx0aXBsZXRleHRpdGVtXCIsXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaW5wdXRUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcInRleHRcIixcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgXCJjb2xvclwiLFxuICAgICAgICBcImRhdGVcIixcbiAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICBcImRhdGV0aW1lLWxvY2FsXCIsXG4gICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgXCJtb250aFwiLFxuICAgICAgICBcIm51bWJlclwiLFxuICAgICAgICBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0ZWxcIixcbiAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgIFwidGltZVwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcIndlZWtcIlxuICAgICAgXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRpdGxlXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gICAgeyBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJcbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKFwiXCIpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIiFpdGVtczp0ZXh0aXRlbXNcIiwgY2xhc3NOYW1lOiBcIm11bHRpcGxldGV4dGl0ZW1cIiB9LFxuICAgIHsgbmFtZTogXCJpdGVtU2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMjUsIG1pblZhbHVlOiAwIH0sXG4gICAgeyBuYW1lOiBcImNvbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAxLCBjaG9pY2VzOiBbMSwgMiwgMywgNCwgNV0gfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwobmFtZSk7XG4gIHEuYWRkSXRlbShcInRleHQxXCIpO1xuICBxLmFkZEl0ZW0oXCJ0ZXh0MlwiKTtcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBJRWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBCYXNlLFxuICBJUGFuZWwsXG4gIFN1cnZleUVycm9yLFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleSxcbiAgSVN1cnZleUltcGwsXG4gIElUZXh0UHJvY2Vzc29yXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uLCBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgS2V5RHVwbGljYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gXCIuL2tub2Nrb3V0L2tvcGFnZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBnZXRJdGVtSW5kZXgoaXRlbTogSVN1cnZleURhdGEpOiBudW1iZXI7XG4gIGdldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEpOiBhbnk7XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEsIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpOiBhbnk7XG4gIGdldFNoYXJlZFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgcGFuZWxJbmRleDogbnVtYmVyKTogUXVlc3Rpb247XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRSb290RGF0YSgpOiBJU3VydmV5RGF0YTtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSVRleHRQcm9jZXNzb3Ige1xuICBwdWJsaWMgc3RhdGljIEl0ZW1WYXJpYWJsZU5hbWUgPSBcInBhbmVsXCI7XG4gIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInBhbmVsSW5kZXhcIjtcbiAgcHJpdmF0ZSBwYW5lbFZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGE7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgY29uc3RydWN0b3IoZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSwgcGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFuZWxWYWx1ZSA9IHBhbmVsO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbihcbiAgICAgIHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlXG4gICAgKSB7XG4gICAgICBzZWxmLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5zZXRTdXJ2ZXlJbXBsKCk7XG4gIH1cbiAgcHVibGljIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKCkge1xuICAgIHRoaXMucGFuZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzW25hbWVdO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmRhdGEuc2V0UGFuZWxJdGVtRGF0YSh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge31cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5nZXRWYWx1ZShuYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeCk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nLCBsb2NOb3RpZmljYXRpb246IGFueSkge1xuICAgIHRoaXMuc2V0VmFsdWUobmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldFBhbmVsSXRlbURhdGEodGhpcyk7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgdmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgdmFyIHN1cnZleVZhbHVlcyA9XG4gICAgICAhIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YS5nZXRSb290RGF0YSgpXG4gICAgICAgID8gdGhpcy5kYXRhLmdldFJvb3REYXRhKCkuZ2V0RmlsdGVyZWRWYWx1ZXMoKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiBzdXJ2ZXlWYWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gc3VydmV5VmFsdWVzW2tleV07XG4gICAgfVxuICAgIHZhbHVlc1tRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZV0gPSB0aGlzLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhLmdldFJvb3REYXRhKCkpXG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmdldFJvb3REYXRhKCkuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy9JVGV4dFByb2Nlc3NvclxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkge1xuICAgIGlmICghdGV4dFZhbHVlKSByZXR1cm47XG4gICAgdmFyIHBhbmVsSW5kZXggPSAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRJdGVtSW5kZXgodGhpcykgOiAtMTtcbiAgICBpZiAodGV4dFZhbHVlLm5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gcGFuZWxJbmRleCArIDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSBmaXJzdE5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWU7XG4gICAgdGV4dFZhbHVlLmNhblByb2Nlc3MgPSB0ZXh0VmFsdWUuaXNFeGlzdHM7XG4gICAgaWYgKCF0ZXh0VmFsdWUuY2FuUHJvY2VzcykgcmV0dXJuO1xuICAgIC8vbmFtZSBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGFuZWxcbiAgICB0ZXh0VmFsdWUubmFtZSA9IHRleHRWYWx1ZS5uYW1lLnJlcGxhY2UoXG4gICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZSArIFwiLlwiLFxuICAgICAgXCJcIlxuICAgICk7XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUodGV4dFZhbHVlLm5hbWUpO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLnBhbmVsLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoZmlyc3ROYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9uICYmIHBhbmVsSW5kZXggPiAtMSkge1xuICAgICAgcXVlc3Rpb24gPSB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoZmlyc3ROYW1lLCBwYW5lbEluZGV4KTtcbiAgICB9XG4gICAgdmFyIHZhbHVlcyA9IHt9O1xuICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZVxuICAgICAgICA6IHF1ZXN0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYWxsVmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICAgIGlmIChhbGxWYWx1ZXMpIHtcbiAgICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gYWxsVmFsdWVzW2ZpcnN0TmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSwgdmFsdWVzKTtcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGV4dCA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgcmV0dXJuIHN1cnZleSA/IHN1cnZleS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpIDogdGV4dDtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogYW55IHtcbiAgICB0ZXh0ID0gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB7IGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSwgdGV4dDogdGV4dCB9O1xuICAgIGlmICh0aGlzLmdldFN1cnZleSgpKSB7XG4gICAgICByZXMgPSB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPVxuICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biAmJiBoYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNUZW1wbGF0ZVN1cnZleUltcGwgaW1wbGVtZW50cyBJU3VydmV5SW1wbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhKSB7fVxuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldFN1cnZleSgpO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBwYW5lbCBkeW1hbmljIHF1ZXN0aW9uLiBZb3Ugc2V0dXAgdGhlIHRlbXBsYXRlIHBhbmVsLCBidXQgYWRkaW5nIGVsZW1lbnRzIChhbnkgcXVlc3Rpb24gb3IgYSBwYW5lbCkgYW5kIGFzc2lnbiBhIHRleHQgdG8gaXQncyB0aXRsZSwgYW5kIHRoaXMgcGFuZWwgd2lsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpbmcgZHluYW1pYyBwYW5lbHMuIFRoZSBudW1iZXIgb2YgcGFuZWxzIGlzIGRlZmluZWQgYnkgcGFuZWxDb3VudCBwcm9wZXJ0eS5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHBhbmVscywgdW5sZXNzIHlvdSBmb3JiaWRkZW4gdGhpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBwcml2YXRlIHRlbXBsYXRlVmFsdWU6IFBhbmVsTW9kZWw7XG4gIHByaXZhdGUgbG9hZGluZ1BhbmVsQ291bnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjaGFuZ2luZ1ZhbHVlUXVlc3Rpb246IFF1ZXN0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRJbmRleFZhbHVlOiBudW1iZXIgPSAtMTtcblxuICByZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJwYW5lbHNcIik7XG4gICAgdGhpcy50ZW1wbGF0ZVZhbHVlID0gdGhpcy5jcmVhdGVBbmRTZXR1cE5ld1BhbmVsT2JqZWN0KCk7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXJXaWR0aCA9IFwiMTAwJVwiO1xuICAgIHRoaXMudGVtcGxhdGUuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24gPSB0aGlzO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGVtcGxhdGUuYWRkRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgc2VsZi5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQpO1xuICAgICAgc2VsZi5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbW92ZUVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIHNlbGYucmVidWlsZFBhbmVscygpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJwYW5lbHNTdGF0ZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICB0aGlzLnNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCk7XG4gICAgdGhpcy5zZXRQYW5lbHNTdXJ2ZXlJbXBsKCk7XG4gIH1cbiAgcHJpdmF0ZSBhc3NpZ25PblByb3BlcnR5Q2hhbmdlZFRvVGVtcGxhdGUoKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy50ZW1wbGF0ZS5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5vblByb3BlcnR5Q2hhbmdlZC5hZGQoZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgc2VsZi5vblRlbXBsYXRlRWxlbWVudFByb3BlcnR5Q2hhbmdlZChlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICAoPFBhbmVsTW9kZWw+KDxhbnk+ZWxlbWVudCkpLmFkZEVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgc2VsZi5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvblRlbXBsYXRlRWxlbWVudFByb3BlcnR5Q2hhbmdlZChlbGVtZW50OiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eSA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KGVsZW1lbnQuZ2V0VHlwZSgpLCBvcHRpb25zLm5hbWUpO1xuICAgIGlmICghcHJvcGVydHkpIHJldHVybjtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHBhbmVsc1tpXS5nZXRRdWVzdGlvbkJ5TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgICAgaWYgKCEhcXVlc3Rpb24gJiYgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gIT09IG9wdGlvbnMubmV3VmFsdWUpIHtcbiAgICAgICAgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsZHluYW1pY1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbC4gVGhpcyBwYW5lbCBpcyB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpZ24gZHluYW1pYyBwYW5lbHNcbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsKCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCBlbGVtZW50cywgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS50aXRsZSA9IG5ld1ZhbHVlO1xuICB9XG4gIGdldCBsb2NUZW1wbGF0ZVRpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LlxuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb247XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlLmRlc2NyaXB0aW9uID0gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RlbXBsYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY0Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpdGVtcygpOiBBcnJheTxJU3VydmV5RGF0YT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0aGlzLnBhbmVsc1tpXS5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGR5bmFtaWMgcGFuZWxzIGNyZWF0ZWQgYmFzZWQgb24gcGFuZWwgdGVtcGxhdGVcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxzKCk6IEFycmF5PFBhbmVsTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyAtMSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSB2YWx1ZSBmcm9tIDAgdG8gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaXNSZW5kZXJNb2RlTGlzdCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgPCAwICYmIHRoaXMucGFuZWxDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA+PSB0aGlzLnBhbmVsQ291bnQpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRJbmRleCh2YWw6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleFZhbHVlICE9PSB2YWwpIHtcbiAgICAgIGlmICh2YWwgPj0gdGhpcy5wYW5lbENvdW50KSB2YWwgPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA9IHZhbDtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGFjdGl2ZSBkeW5hbWljYWwgcGFuZWwgd2hlbiB0aGUgcmVuZGVyTW9kZSBpcyBub3QgXCJsaXN0XCIuIElmIHRoZXJlIGlzIG5vIGR5bWFtaWMgcGFuZWwgKHBhbmVsQ291bnQgPSAwKSBvciByZW5kZXJNb2RlIGVxdWFscyBcImxpc3RcIiBpdCByZXR1cm5zIG51bGwuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXg7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnBhbmVscy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhbmVsc1tpbmRleF07XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZyBvbiByZW1vdmluZyBhIHBhbmVsXG4gICAqIEBzZWUgQ29uZmlybURlbGV0ZVRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGEgcXVlc3Rpb24gbmFtZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBwYW5lbCBhbmQgdGhlIGxpYnJhcnkgc2hvd3MgZHVwbGljYXRpb24gZXJyb3IsIGlmIHRoZXJlIGFyZSBzYW1lIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFuZWxzIG9mIHRoaXMgcXVlc3Rpb24uXG4gICAqIEBzZWUga2V5RHVwbGljYXRpb25FcnJvclxuICAgKi9cbiAgcHVibGljIGdldCBrZXlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBrZXlOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dCBzaG93aW5nIGluIHRoZSBjb25maXJtYXRpb24gZGVsZXRlIGRpYWxvZyBvbiByZW1vdmluZyBhIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkdXBsaWNhdGlvbiB2YWx1ZSBlcnJvciB0ZXh0LiBTZXQgaXQgdG8gc2hvdyB0aGUgdGV4dCBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdC5cbiAgICogQHNlZSBrZXlOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBrZXlEdXBsaWNhdGlvbkVycm9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0tleUR1cGxpY2F0aW9uRXJyb3IoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHByZXZpb3VzIGJ1dHRvbiB0ZXh0LiBQcmV2aW91cyBidXR0b24gc2hvd3MgdGhlIHByZXZpb3VzIHBhbmVsLCBjaGFuZ2UgdGhlIGN1cnJlbnRQYW5lbCwgd2hlbiB0aGUgcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIGN1cnJlbnRQYW5lbFxuICAgKiBAc2VlIGN1cnJlbnRJbmRleFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxQcmV2VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBhZ2VQcmV2VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbFByZXZUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFByZXZUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsUHJldlRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxQcmV2VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IG5leHQgYnV0dG9uIHRleHQuIE5leHQgYnV0dG9uIHNob3dzIHRoZSBuZXh0IHBhbmVsLCBjaGFuZ2UgdGhlIGN1cnJlbnRQYW5lbCwgd2hlbiB0aGUgcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIGN1cnJlbnRQYW5lbFxuICAgKiBAc2VlIGN1cnJlbnRJbmRleFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxOZXh0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxOZXh0VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbE5leHRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbE5leHRUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsTmV4dFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxOZXh0VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCBwYW5lbCBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxBZGRUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxBZGRUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYWRkUGFuZWxcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxBZGRUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsQWRkVGV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsQWRkVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbEFkZFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByZW1vdmUgcGFuZWwgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsUmVtb3ZlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsUmVtb3ZlVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZVBhbmVsXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsUmVtb3ZlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxSZW1vdmVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsUmVtb3ZlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFJlbW92ZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZW5kZXJNb2RlIGVxdWFscyB0byBcInByb2dyZXNzVG9wXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJvZ3Jlc3NUb3BTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc1RvcFwiIHx8IHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVuZGVyTW9kZSBlcXVhbHMgdG8gXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Byb2dyZXNzQm90dG9tU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NCb3R0b21cIiB8fFxuICAgICAgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gMC5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIGN1cnJlblBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJldkJ1dHRvblNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gY3VycmVudEluZGV4IGlzIG1vcmUgdGhhbiBvciBlcXVhbCAwIGFuZCBsZXNzIHRoZW4gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBjdXJyZW5QYW5lbFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNOZXh0QnV0dG9uU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHNob3dSYW5nZUluUHJvZ3Jlc3MgZXF1YWxzIHRvIHRydWUsIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIiBhbmQgcGFuZWxDb3VudCBpcyA+PSAyLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JhbmdlU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zaG93UmFuZ2VJblByb2dyZXNzICYmIHRoaXMuY3VycmVudEluZGV4ID49IDAgJiYgdGhpcy5wYW5lbENvdW50ID4gMVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gaW5jbHVkZUhpZGRlbiA/IFt0aGlzLnRlbXBsYXRlXSA6IHRoaXMudGVtcGxhdGVFbGVtZW50cztcbiAgfVxuICBwcml2YXRlIGlzQWRkaW5nTmV3UGFuZWxzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYWRkaW5nTmV3UGFuZWxzVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBpc05ld1BhbmVsc1ZhbHVlQ2hhbmdlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwcmVwYXJlVmFsdWVGb3JQYW5lbENyZWF0aW5nKCkge1xuICAgIHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMgPSB0cnVlO1xuICAgIHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpIHtcbiAgICB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZTtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzXG4gICAgICA/IHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWVcbiAgICAgIDogc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlQ29yZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMpIHtcbiAgICAgIHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0L3NldCB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgcGFuZWxzLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBhZGRQYW5lbFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxVSVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rlc2lnbk1vZGVcbiAgICAgID8gdGhpcy5sb2FkaW5nUGFuZWxDb3VudFxuICAgICAgOiB0aGlzLnBhbmVscy5sZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA9IHZhbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PSB0aGlzLnBhbmVscy5sZW5ndGggfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICB0aGlzLnByZXBhcmVWYWx1ZUZvclBhbmVsQ3JlYXRpbmcoKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wYW5lbENvdW50OyBpIDwgdmFsOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWwoKTtcbiAgICAgIHRoaXMucGFuZWxzLnB1c2gocGFuZWwpO1xuICAgICAgaWYgKHRoaXMucmVuZGVyTW9kZSA9PSBcImxpc3RcIiAmJiB0aGlzLnBhbmVsc1N0YXRlICE9IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLnBhbmVsc1N0YXRlID09PSBcImV4cGFuZFwiKSB7XG4gICAgICAgICAgcGFuZWwuZXhwYW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFuZWwuY29sbGFwc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsIDwgdGhpcy5wYW5lbENvdW50KSB0aGlzLnBhbmVscy5zcGxpY2UodmFsLCB0aGlzLnBhbmVsQ291bnQgLSB2YWwpO1xuICAgIHRoaXMuc2V0VmFsdWVBZnRlclBhbmVsc0NyZWF0aW5nKCk7XG4gICAgdGhpcy5zZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCk7XG4gICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGFsbG93IHRoZSBlbmQtdXNlciB0byBjb2xsYXBzZS9leHBhbmQgdGhlIHBhbmVscy4gSXQgd29ya3Mgb25seSBpZiB0aGUgcmVuZGVyTW9kZSBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJsaXN0XCIgYW5kIHRlbXBsYXRlVGl0bGUgcHJvcGVydHkgaXMgbm90IGVtcHR5LiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYXZhaWxhYmxlOlxuICAgKiA8YnIvPiBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZXIgY2FuJ3QgY29sbHBhc2UvZXhwYW5kIHBhbmVsc1xuICAgKiA8YnIvPiBleHBhbmRlZCAtIFVzZXIgY2FuIGNvbGxwYXNlL2V4cGFuZCBwYW5lbHMgYW5kIGFsbCBwYW5lbHMgYXJlIGV4cGFuZGVkIGJ5IGRlZmF1bHRcbiAgICogPGJyLz4gY29sbGFwc2VkIC0gVXNlciBjYW4gY29sbHBhc2UvZXhwYW5kIHBhbmVscyBhbmQgYWxsIHBhbmVscyBhcmUgY29sbGFwc2VkIGJ5IGRlZmF1bHRcbiAgICogPGJyLz4gZmlyc3RFeHBhbmRlZCAtIFVzZXIgY2FuIGNvbGxwYXNlL2V4cGFuZCBwYW5lbHMuIFRoZSBmaXJzdCBwYW5lbCBpcyBleHBhbmRlZCBhbmQgb3RoZXJzIGFyZSBjb2xsYXBzZWRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbHNTdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYW5lbHNTdGF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsc1N0YXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzU3RhdGVcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIHNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCkge1xuICAgIHRoaXMudGVtcGxhdGUuc2V0U3VydmV5SW1wbChcbiAgICAgIHRoaXMuaXNEZXNpZ25Nb2RlXG4gICAgICAgID8gdGhpcy5zdXJ2ZXlJbXBsXG4gICAgICAgIDogbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljVGVtcGxhdGVTdXJ2ZXlJbXBsKHRoaXMpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHNldFBhbmVsc1N1cnZleUltcGwoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaV07XG4gICAgICBpZiAocGFuZWwgPT0gdGhpcy50ZW1wbGF0ZSkgY29udGludWU7XG4gICAgICBwYW5lbC5zZXRTdXJ2ZXlJbXBsKDxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+cGFuZWwuZGF0YSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxzU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMucmVuZGVyTW9kZSAhPSBcImxpc3RcIikgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdGF0ZSA9IHRoaXMucGFuZWxzU3RhdGU7XG4gICAgICBpZiAoc3RhdGUgPT09IFwiZmlyc3RFeHBhbmRlZFwiKSB7XG4gICAgICAgIHN0YXRlID0gaSA9PT0gMCA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCI7XG4gICAgICB9XG4gICAgICB0aGlzLnBhbmVsc1tpXS5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSkgdmFsdWUgPSBbXTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSB2YWx1ZS5sZW5ndGg7IGkgPCB0aGlzLnBhbmVsQ291bnQ7IGkrKykgdmFsdWUucHVzaCh7fSk7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IHRoaXMucGFuZWxDb3VudCkge1xuICAgICAgdmFsdWUuc3BsaWNlKHRoaXMucGFuZWxDb3VudCwgdmFsdWUubGVuZ3RoIC0gdGhpcy5wYW5lbENvdW50KTtcbiAgICB9XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gdHJ1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGRlbGV0ZSBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluUGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5QYW5lbENvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSB2YWwgPSAwO1xuICAgIGlmICh2YWwgPT0gdGhpcy5taW5QYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluUGFuZWxDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPiB0aGlzLm1heFBhbmVsQ291bnQpIHRoaXMubWF4UGFuZWxDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5wYW5lbENvdW50IDwgdmFsKSB0aGlzLnBhbmVsQ291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGFkZCBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4UGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICBcIm1heFBhbmVsQ291bnRcIixcbiAgICAgIHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgcmV0dXJuO1xuICAgIGlmICh2YWwgPiBzZXR0aW5ncy5wYW5lbE1heGltdW1QYW5lbENvdW50KVxuICAgICAgdmFsID0gc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudDtcbiAgICBpZiAodmFsID09IHRoaXMubWF4UGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFBhbmVsQ291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsIDwgdGhpcy5taW5QYW5lbENvdW50KSB0aGlzLm1pblBhbmVsQ291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucGFuZWxDb3VudCA+IHZhbCkgdGhpcy5wYW5lbENvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBoaWRlIHRoZSAnQWRkIE5ldycgYnV0dG9uXG4gICAqIEBzZWUgYWxsb3dSZW1vdmVQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0FkZFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFBhbmVsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dBZGRQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdSZW1vdmUnIGJ1dHRvblxuICAgKiBAc2VlIGFsbG93QWRkUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dSZW1vdmVQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVQYW5lbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93UmVtb3ZlUGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVQYW5lbFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGUgdGVtcGxhdGUgcXVlc3Rpb25zLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxCYXNlLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNob3cvaGlkZSB0aGUgbnVtYmVycyBpbiB0aXRsZXMgaW4gcXVlc3Rpb25zIGluc2lkZSBhIGR5bmFtaWMgcGFuZWwuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIFwib2ZmXCIuIFlvdSBtYXkgc2V0IGl0IHRvIFwib25QYW5lbFwiIGFuZCB0aGUgZmlyc3QgcXVlc3Rpb24gaW5zaWRlIGEgZHluYW1pYyBwYW5lbCB3aWxsIHN0YXJ0IHdpdGggMSBvciBcIm9uU3VydmV5XCIgdG8gaW5jbHVkZSBuZXN0ZWQgcXVlc3Rpb25zIGluIGR5bWFtaWMgcGFuZWxzIGludG8gZ2xvYmFsIHN1cnZleSBxdWVzdGlvbiBudW1iZXJpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dRdWVzdGlvbk51bWJlcnModmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTaG93cyB0aGUgcmFuZ2UgZnJvbSAxIHRvIHBhbmVsQ291bnQgd2hlbiByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuIFNldCB0byBmYWxzZSB0byBoaWRlIHRoaXMgZWxlbWVudC5cbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UmFuZ2VJblByb2dyZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJsaXN0XCIgYW5kIGFsbCBkeW5hbWljIHBhbmVscyBhcmUgcmVuZGVyZWQgb25lIGJ5IG9uZSBvbiB0aGUgcGFnZS4gWW91IG1heSBjaGFuZ2UgaXQgdG86IFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIiB0byByZW5kZXIgb25seSBvbmUgZHluYW1pYyBwYW5lbCBhdCBvbmNlLiBUaGUgcHJvZ3Jlc3MgYW5kIG5hdmlnYXRpb24gZWxlbWVudHMgY2FuIGJlIHJlbmRyZWQgb24gdG9wLCBib3R0b20gb3IgYm90aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlck1vZGVcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiByZW5kZXJNb2RlIGVxdWFscyB0byBcImxpc3RcIi5cbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVuZGVyTW9kZUxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PSBcImxpc3RcIjtcbiAgfVxuICBwdWJsaWMgc2V0VmlzaWJsZUluZGV4KHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHJldHVybiAwO1xuICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25TdXJ2ZXlcIiA/IHZhbHVlIDogMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY291bnRlciA9IHRoaXMuc2V0UGFuZWxWaXNpYmxlSW5kZXgoXG4gICAgICAgIHRoaXMucGFuZWxzW2ldLFxuICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvZmZcIlxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblN1cnZleVwiKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggKz0gY291bnRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuc2V0VmlzaWJsZUluZGV4KHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9uU3VydmV5XCIgPyB2YWx1ZSA6IC0xKTtcbiAgICByZXR1cm4gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25TdXJ2ZXlcIiA/IDEgOiBzdGFydEluZGV4IC0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbFZpc2libGVJbmRleChcbiAgICBwYW5lbDogUGFuZWxNb2RlbCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNob3dJbmRleDogYm9vbGVhblxuICApOiBudW1iZXIge1xuICAgIGlmICghc2hvd0luZGV4KSB7XG4gICAgICBwYW5lbC5zZXRWaXNpYmxlSW5kZXgoLTEpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBwYW5lbC5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGFuIGVuZCB1c2VyIG1heSBhZGQgYSBuZXcgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGxlc3MgdGhhbiBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkFkZFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd0FkZFBhbmVsICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnBhbmVsQ291bnQgPCB0aGlzLm1heFBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBlbmQgdXNlciBtYXkgcmVtb3ZlIGEgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGlzIG1vcmUgdGhhbiBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd1JlbW92ZVBhbmVsICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnBhbmVsQ291bnQgPiB0aGlzLm1pblBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZWJ1aWxkUGFuZWxzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5wcmVwYXJlVmFsdWVGb3JQYW5lbENyZWF0aW5nKCk7XG4gICAgdmFyIHBhbmVscyA9IFtdO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCB0aGlzLnRlbXBsYXRlKTtcbiAgICAgIHBhbmVscy5wdXNoKHRoaXMudGVtcGxhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB7XG4gICAgICAgIHBhbmVscy5wdXNoKHRoaXMuY3JlYXRlTmV3UGFuZWwoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGFuZWxzLnNwbGljZSgwLCB0aGlzLnBhbmVscy5sZW5ndGgsIC4uLnBhbmVscyk7XG4gICAgdGhpcy5zZXRWYWx1ZUFmdGVyUGFuZWxzQ3JlYXRpbmcoKTtcbiAgICB0aGlzLnNldFBhbmVsc1N0YXRlKCk7XG4gICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIElmIGl0IGlzIG5vdCBlbXB0eSwgdGhlbiB0aGlzIHZhbHVlIGlzIHNldCB0byBldmVyeSBuZXcgcGFuZWwsIGluY2x1ZGluZyBwYW5lbHMgY3JlYXRlZCBpbml0aWFsbHksIHVubGVzcyB0aGUgZGVmYXVsdFZhbHVlIGlzIG5vdCBlbXB0eVxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRQYW5lbFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRQYW5lbFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFBhbmVsVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0UGFuZWxWYWx1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBjb3B5IHRoZSB2YWx1ZSBpbnRvIG5ldyBhZGRlZCBwYW5lbCBmcm9tIHRoZSBsYXN0IHBhbmVsLiBJZiBkZWZhdWx0UGFuZWxWYWx1ZSBpcyBzZXQgYW5kIHRoaXMgcHJvcGVydHkgZXF1YWxzIHRvIHRydWUsXG4gICAqIHRoZW4gdGhlIHZhbHVlIGZvciBuZXcgYWRkZWQgcGFuZWwgaXMgbWVyZ2luZy5cbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0UGFuZWxWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBpc0RlZmF1bHRWYWx1ZUVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSkgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHN1cGVyLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpIHx8IHRoaXMucGFuZWxDb3VudCA9PSAwKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVsQ291bnQ7IGkrKykge1xuICAgICAgbmV3VmFsdWUucHVzaCh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNSb3dFbXB0eSh2YWxbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgaXNSb3dFbXB0eSh2YWw6IGFueSkge1xuICAgIGZvciAodmFyIHByb3AgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsLmhhc093blByb3BlcnR5KHByb3ApKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBkeW5hbWljIHBhbmVsIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBQYW5lbC4gSXQgY2hlY2tzIGlmIGNhbkFkZFBhbmVsIHJldHVybnMgdHJ1ZSBhbmQgdGhlbiBjYWxscyBhZGRQYW5lbCBtZXRob2QuXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgY2FuQWRkUGFuZWxcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbFVJKCk6IFBhbmVsTW9kZWwge1xuICAgIGlmICghdGhpcy5jYW5BZGRQYW5lbCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG5ld1BhbmVsID0gdGhpcy5hZGRQYW5lbCgpO1xuICAgIGlmICh0aGlzLnJlbmRlck1vZGUgPT09IFwibGlzdFwiICYmIHRoaXMucGFuZWxzU3RhdGUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICBuZXdQYW5lbC5leHBhbmQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZHluYW1pYyBwYW5lbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgUGFuZWwuXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdGhpcy5wYW5lbENvdW50Kys7XG4gICAgaWYgKCF0aGlzLmlzUmVuZGVyTW9kZUxpc3QpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB9XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB2YXIgaGFzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhbmV3VmFsdWUgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiZcbiAgICAgICAgbmV3VmFsdWUubGVuZ3RoID09IHRoaXMucGFuZWxDb3VudFxuICAgICAgKSB7XG4gICAgICAgIGhhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb3B5VmFsdWUobmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0sIHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwgJiZcbiAgICAgICEhbmV3VmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmXG4gICAgICBuZXdWYWx1ZS5sZW5ndGggPiAxICYmXG4gICAgICBuZXdWYWx1ZS5sZW5ndGggPT0gdGhpcy5wYW5lbENvdW50XG4gICAgKSB7XG4gICAgICBoYXNNb2RpZmllZCA9IHRydWU7XG4gICAgICB0aGlzLmNvcHlWYWx1ZShcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0sXG4gICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDJdXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaGFzTW9kaWZpZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxBZGRlZCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHNbdGhpcy5wYW5lbENvdW50IC0gMV07XG4gIH1cbiAgcHJpdmF0ZSBjb3B5VmFsdWUoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgIGZvciAodmFyIGtleSBpbiBkZXN0KSB7XG4gICAgICBzcmNba2V5XSA9IGRlc3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgcmVtb3ZlUGFuZWwgZnVuY3Rpb24uIERvIG5vdGhpbmcgaXMgY2FuUmVtb3ZlUGFuZWwgcmV0dXJucyBmYWxzZS4gSWYgY29uZmlybURlbGV0ZSBzZXQgdG8gdHJ1ZSwgaXQgc2hvd3MgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgZmlyc3QuXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHBhbmVsIG9yIHBhbmVsIGluZGV4XG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxcbiAgICogQHNlZSBjb25maXJtRGVsZXRlXG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVRleHRcbiAgICogQHNlZSBjYW5SZW1vdmVQYW5lbFxuICAgKlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhbmVsVUkodmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5jYW5SZW1vdmVQYW5lbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25maXJtRGVsZXRlIHx8IGNvbmZpcm0odGhpcy5jb25maXJtRGVsZXRlVGV4dCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlUGFuZWwodmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR29lcyB0byB0aGUgbmV4dCBwYW5lbCBpbiB0aGUgUGFuZWxEeW5hbWljXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ29Ub05leHRQYW5lbCgpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJNb2RlICE9PSBcImxpc3RcIiAmJiB0aGlzLmN1cnJlbnRQYW5lbC5oYXNFcnJvcnMoKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gIH1cbiAgLyoqXG4gICAqIEdvZXMgdG8gdGhlIHByZXZpb3VzIHBhbmVsIGluIHRoZSBQYW5lbER5bmFtaWNcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnb1RvUHJldlBhbmVsKCkge1xuICAgIHRoaXMuY3VycmVudEluZGV4LS07XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkeW5hbWljIHBhbmVsIGZyb20gdGhlIHBhbmVscyBhcnJheS5cbiAgICogQHBhcmFtIHZhbHVlIGEgcGFuZWwgb3IgcGFuZWwgaW5kZXhcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhbmVsKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldFBhbmVsSW5kZXgodmFsdWUpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5wYW5lbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGluZGV4ID49IHZhbHVlLmxlbmd0aCkgcmV0dXJuO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxSZW1vdmVkKHRoaXMsIGluZGV4KTtcbiAgfVxuICBwcml2YXRlIGdldFBhbmVsSW5kZXgodmFsOiBhbnkpOiBudW1iZXIge1xuICAgIGlmIChIZWxwZXJzLmlzTnVtYmVyKHZhbCkpIHJldHVybiB2YWw7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYW5lbHNbaV0gPT09IHZhbCB8fCBpdGVtc1tpXSA9PT0gdmFsKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFuZWxzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0uY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbiB7XG4gICAgaWYgKGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW2luZGV4XS5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICAgIHBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIHZhbHVlcyA9ICEhdmFsICYmIGluZGV4IDwgdmFsLmxlbmd0aCA/IHZhbFtpbmRleF0gOiBudWxsO1xuICAgIGlmICghdmFsdWVzKSByZXR1cm47XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGtleSkgJiZcbiAgICAgICAgIXRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoa2V5LCBpbmRleClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgdmFsdWVzW2tleV07XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHZhbFtpbmRleF0gPSB2YWx1ZXM7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhbmVsSW5kZXg6IG51bWJlclxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgISF0aGlzLnZhbHVlTmFtZVxuICAgICAgPyA8UXVlc3Rpb24+KFxuICAgICAgICAgIHRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgICAgICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYW5lbEluZGV4XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk5hbWVzKG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdmFyIHByZWZpeCA9IHRoaXMubmFtZSArIFwiWzBdLlwiO1xuICAgIHZhciBwYW5lbE5hbWVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uYWRkQ29uZGl0aW9uTmFtZXMocGFuZWxOYW1lcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgbmFtZXMucHVzaChwcmVmaXggKyBwYW5lbE5hbWVzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0XG4gICAgICA/IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zLmluZGV4T2YoY29udGV4dCkgPiAtMVxuICAgICAgOiBmYWxzZTtcbiAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMubmFtZSArIFwiWzBdLlwiO1xuICAgIHZhciBwcmVmaXhUZXh0ID0gdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiWzBdLlwiO1xuICAgIHZhciBwYW5lbE9ianMgPSBuZXcgQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4oKTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy50ZW1wbGF0ZS5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KHBhbmVsT2JqcywgY29udGV4dCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxPYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcmVmaXhOYW1lICsgcGFuZWxPYmpzW2ldLm5hbWUsXG4gICAgICAgIHRleHQ6IHByZWZpeFRleHQgKyBwYW5lbE9ianNbaV0udGV4dCxcbiAgICAgICAgcXVlc3Rpb246IHBhbmVsT2Jqc1tpXS5xdWVzdGlvblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVsT2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFuZWxPYmpzW2ldLnF1ZXN0aW9uID09IGNvbnRleHQpIGNvbnRpbnVlO1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IFwicGFuZWwuXCIgKyBwYW5lbE9ianNbaV0ubmFtZSxcbiAgICAgICAgICB0ZXh0OiBcInBhbmVsLlwiICsgcGFuZWxPYmpzW2ldLnRleHQsXG4gICAgICAgICAgcXVlc3Rpb246IHBhbmVsT2Jqc1tpXS5xdWVzdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24ob3BlcmF0b3IsIHBhdGgpO1xuICAgIHZhciBxdWVzdGlvbk5hbWUgPSBwYXRoO1xuICAgIHZhciBwb3MgPSBwYXRoLmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChwb3MgPiAtMSkge1xuICAgICAgcXVlc3Rpb25OYW1lID0gcGF0aC5zdWJzdHIoMCwgcG9zKTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihwb3MgKyAxKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZS5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbk5hbWUpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yLCBwYXRoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgdmFyIHJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIHRoaXMudGVtcGxhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB0aGlzLnRlbXBsYXRlLm9uU3VydmV5TG9hZCgpO1xuICAgIGlmICh0aGlzLmxvYWRpbmdQYW5lbENvdW50ID4gMCkge1xuICAgICAgdGhpcy5wYW5lbENvdW50ID0gdGhpcy5sb2FkaW5nUGFuZWxDb3VudDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQYW5lbHNTdXJ2ZXlJbXBsKCk7XG4gICAgdGhpcy5zZXRQYW5lbHNTdGF0ZSgpO1xuICAgIHRoaXMuYXNzaWduT25Qcm9wZXJ0eUNoYW5nZWRUb1RlbXBsYXRlKCk7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gIH1cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0ub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICBzdXBlci5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUGFuZWxzQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSByZVJ1bkNvbmRpdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMucnVuQ29uZGl0aW9uKFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuUGFuZWxzQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgdmFyIGNhY2hlZFZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIGNhY2hlZFZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbFZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzLnBhbmVsc1tpXS5kYXRhKTtcbiAgICAgIC8vU2hvdWxkIGJlIHVuaXF1ZSBmb3IgZXZlcnkgcGFuZWwgZHVlIGFzeW5jIGV4cHJlc3Npb24gc3VwcG9ydFxuICAgICAgdmFyIG5ld1ZhbHVlcyA9IEhlbHBlcnMuY3JlYXRlQ29weShjYWNoZWRWYWx1ZXMpO1xuICAgICAgbmV3VmFsdWVzW1xuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICBdID0gcGFuZWxWYWx1ZXM7XG4gICAgICBuZXdWYWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lLnRvTG93ZXJDYXNlKCldID0gaTtcbiAgICAgIHRoaXMucGFuZWxzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICAgIHRoaXMucGFuZWxzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKFxuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYXNLZXlzRHVwbGljYXRlZChmaXJlQ2FsbGJhY2s6IGJvb2xlYW4sIHJlYzogYW55ID0gbnVsbCkge1xuICAgIHZhciBrZXlWYWx1ZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICB2YXIgcmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQodGhpcy5wYW5lbHNbaV0sIGtleVZhbHVlcywgcmVjLCBmaXJlQ2FsbGJhY2spIHx8XG4gICAgICAgIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhbmVsc0NvbnRhaW5zRXJyb3JzKCkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uO1xuICAgIHZhciBwYXJlbnQgPSA8UGFuZWw+cXVlc3Rpb24ucGFyZW50O1xuICAgIHdoaWxlICghIXBhcmVudCkge1xuICAgICAgcGFyZW50LnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gICAgICBwYXJlbnQgPSA8UGFuZWw+cGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb250YWluc0Vycm9ycygpO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbikge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgICByZXMgPSB0aGlzLmhhc0tleXNEdXBsaWNhdGVkKGZpcmVDYWxsYmFjaywgcmVjKSB8fCByZXM7XG4gICAgICB0aGlzLnVwZGF0ZVBhbmVsc0NvbnRhaW5zRXJyb3JzKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXJyb3NJblBhbmVscyA9IHRoaXMuaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJblBhbmVscztcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGFuZWxzW2ldLmNvbnRhaW5zRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmlzaWJsZVF1ZXN0aW9ucyA9IDxBcnJheTxhbnk+PltdO1xuICAgICAgcGFuZWxzW2ldLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNpYmxlUXVlc3Rpb25zLCB0cnVlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmlzaWJsZVF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoIXZpc2libGVRdWVzdGlvbnNbal0uaXNBbnN3ZXJlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBxdWVzdGlvbnNbal0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBlci5nZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocXVlc3Rpb25zW2pdLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYW5lbHNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHF1ZXN0aW9uc1tqXS5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpO1xuICAgIGlmICghdmFsdWVzIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlcykpIHJldHVybiB2YWx1ZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGggJiYgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbCA9IHZhbHVlc1tpXTtcbiAgICAgIGlmICghdmFsKSBjb250aW51ZTtcbiAgICAgIHZhbHVlc1tpXSA9IHRoaXMuZ2V0UGFuZWxEaXNwbGF5VmFsdWUoaSwgdmFsLCBrZXlzQXNUZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFuZWxEaXNwbGF5VmFsdWUoXG4gICAgcGFuZWxJbmRleDogbnVtYmVyLFxuICAgIHZhbDogYW55LFxuICAgIGtleXNBc1RleHQ6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIHZhbDtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsc1twYW5lbEluZGV4XTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGtleSk7XG4gICAgICBpZiAoIXF1ZXN0aW9uKSB7XG4gICAgICAgIHF1ZXN0aW9uID0gdGhpcy5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShrZXksIHBhbmVsSW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgdmFsW2tleV0gPSBxdWVzdGlvbi5nZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvckluUGFuZWxzKGZpcmVDYWxsYmFjazogYm9vbGVhbiwgcmVjOiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIHZhciBrZXlWYWx1ZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zZXRPbkNvbXBsZXRlQXN5bmNJblBhbmVsKHBhbmVsc1tpXSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcG5sRXJyb3IgPSBwYW5lbHNbaV0uaGFzRXJyb3JzKFxuICAgICAgICBmaXJlQ2FsbGJhY2ssXG4gICAgICAgICEhcmVjICYmIHJlYy5mb2N1c2VPbkZpcnN0RXJyb3IsXG4gICAgICAgIHJlY1xuICAgICAgKTtcbiAgICAgIHBubEVycm9yID0gdGhpcy5pc1ZhbHVlRHVwbGljYXRlZChwYW5lbHNbaV0sIGtleVZhbHVlcywgcmVjKSB8fCBwbmxFcnJvcjtcbiAgICAgIGlmICghdGhpcy5pc1JlbmRlck1vZGVMaXN0ICYmIHBubEVycm9yICYmICFyZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpO1xuICAgICAgfVxuICAgICAgcmVzID0gcG5sRXJyb3IgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgc2V0T25Db21wbGV0ZUFzeW5jSW5QYW5lbChwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyA9IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5yYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkKFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsLFxuICAgIGtleVZhbHVlczogQXJyYXk8YW55PixcbiAgICByZWM6IGFueSxcbiAgICBmaXJlQ2FsbGJhY2s/OiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5rZXlOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPnBhbmVsLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodGhpcy5rZXlOYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8IHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb24gJiZcbiAgICAgIHF1ZXN0aW9uICE9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uXG4gICAgKSB7XG4gICAgICBxdWVzdGlvbi5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCByZWMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09IGtleVZhbHVlc1tpXSkge1xuICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihcbiAgICAgICAgICBuZXcgS2V5RHVwbGljYXRpb25FcnJvcih0aGlzLmtleUR1cGxpY2F0aW9uRXJyb3IsIHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIXJlYyAmJiAhcmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAga2V5VmFsdWVzLnB1c2godmFsdWUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVBbmRTZXR1cE5ld1BhbmVsT2JqZWN0KCk7XG4gICAgdmFyIGpzb24gPSB0aGlzLnRlbXBsYXRlLnRvSlNPTigpO1xuICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgcGFuZWwpO1xuICAgIHBhbmVsLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgcGFuZWwudXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xuICAgIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0odGhpcywgcGFuZWwpO1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHBhbmVsLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5nZXRUZW1wbGF0ZVF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIH07XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIHByaXZhdGUgZ2V0VGVtcGxhdGVRdWVzdGlvblRpdGxlTG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVUaXRsZUxvY2F0aW9uICE9IFwiZGVmYXVsdFwiXG4gICAgICA/IHRoaXMudGVtcGxhdGVUaXRsZUxvY2F0aW9uXG4gICAgICA6IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbENvdW50QmFzZWRPblZhbHVlKCkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkpIHJldHVybjtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICB2YXIgbmV3UGFuZWxDb3VudCA9IHZhbCAmJiBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwubGVuZ3RoIDogMDtcbiAgICBpZiAobmV3UGFuZWxDb3VudCA9PSAwICYmIHRoaXMubG9hZGluZ1BhbmVsQ291bnQgPiAwKSB7XG4gICAgICBuZXdQYW5lbENvdW50ID0gdGhpcy5sb2FkaW5nUGFuZWxDb3VudDtcbiAgICB9XG4gICAgdGhpcy5wYW5lbENvdW50ID0gbmV3UGFuZWxDb3VudDtcbiAgfVxuICBwdWJsaWMgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgZmFsc2UpO1xuICAgIHRoaXMuc2V0UGFuZWxDb3VudEJhc2VkT25WYWx1ZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxVcGRhdGVWYWx1ZUZyb21TdXJ2ZXkodGhpcy5wYW5lbHNbaV0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsU3VydmV5VmFsdWVDaGFuZ2VkKHRoaXMucGFuZWxzW2ldKTtcbiAgICB9XG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVCYXNlZE9uUGFuZWxDb3VudCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBhbmVsVXBkYXRlVmFsdWVGcm9tU3VydmV5KHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRQYW5lbEl0ZW1EYXRhKHBhbmVsLmRhdGEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHEudXBkYXRlVmFsdWVGcm9tU3VydmV5KHZhbHVlc1txLmdldFZhbHVlTmFtZSgpXSk7XG4gICAgICBxLnVwZGF0ZUNvbW1lbnRGcm9tU3VydmV5KFxuICAgICAgICB2YWx1ZXNbcS5nZXRWYWx1ZU5hbWUoKSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXhdXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBhbmVsU3VydmV5VmFsdWVDaGFuZ2VkKHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRQYW5lbEl0ZW1EYXRhKHBhbmVsLmRhdGEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHEub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodmFsdWVzW3EuZ2V0VmFsdWVOYW1lKCldKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMuc2V0VGVtcGxhdGVQYW5lbFN1cnZleUltcGwoKTtcbiAgICAgIHRoaXMucmVidWlsZFBhbmVscygpO1xuICAgIH1cbiAgfVxuICAvL0lRdWVzdGlvblBhbmVsRHluYW1pY0RhdGFcbiAgZ2V0SXRlbUluZGV4KGl0ZW06IElTdXJ2ZXlEYXRhKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICB9XG4gIGdldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEpOiBhbnkge1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgdmFyIGluZGV4ID0gaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICB2YXIgcVZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoaW5kZXggPCAwICYmIEFycmF5LmlzQXJyYXkocVZhbHVlKSAmJiBxVmFsdWUubGVuZ3RoID4gaXRlbXMubGVuZ3RoKSB7XG4gICAgICBpbmRleCA9IGl0ZW1zLmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHt9O1xuICAgIGlmICghcVZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHFWYWx1ZSkgfHwgcVZhbHVlLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiBxVmFsdWVbaW5kZXhdO1xuICB9XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEsIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBpdGVtcy5sZW5ndGg7XG4gICAgdmFyIHFWYWx1ZSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgaWYgKCFxVmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocVZhbHVlKSkge1xuICAgICAgcVZhbHVlID0gW107XG4gICAgfVxuICAgIGlmIChxVmFsdWUubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICBmb3IgKHZhciBpID0gcVZhbHVlLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgIHFWYWx1ZS5wdXNoKHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFxVmFsdWVbaW5kZXhdKSBxVmFsdWVbaW5kZXhdID0ge307XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSB7XG4gICAgICBxVmFsdWVbaW5kZXhdW25hbWVdID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcVZhbHVlW2luZGV4XVtuYW1lXTtcbiAgICB9XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnBhbmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uID0gdGhpcy5wYW5lbHNbaW5kZXhdLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBxVmFsdWU7XG4gICAgdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb24gPSBudWxsO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgICAgICBwYW5lbDogKDxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+aXRlbSkucGFuZWwsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGl0ZW1JbmRleDogaW5kZXgsXG4gICAgICAgIGl0ZW1WYWx1ZTogcVZhbHVlW2luZGV4XSxcbiAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbiAgZ2V0Um9vdERhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSB0aGlzLnBhbmVscy5tYXAoXG4gICAgICAgIChwYW5lbDogUGFuZWxNb2RlbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHZhciBwYW5lbERhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgICBuYW1lOiBwYW5lbC5uYW1lIHx8IGluZGV4LFxuICAgICAgICAgICAgdGl0bGU6IHBhbmVsLnRpdGxlIHx8IFwiUGFuZWxcIixcbiAgICAgICAgICAgIHZhbHVlOiBwYW5lbC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlOiBwYW5lbC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcGFuZWwucXVlc3Rpb25zXG4gICAgICAgICAgICAgIC5tYXAoKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gcXVlc3Rpb24uZ2V0UGxhaW5EYXRhKG9wdGlvbnMpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+ICEhZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaChjYWxjdWxhdGlvbiA9PiB7XG4gICAgICAgICAgICBwYW5lbERhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSAoPGFueT5wYW5lbClbXG4gICAgICAgICAgICAgIGNhbGN1bGF0aW9uLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcGFuZWxEYXRhSXRlbTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG5cbiAgcHVibGljIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmFuZ2VNYXggPSB0aGlzLnBhbmVsQ291bnQ7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dFwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuY3VycmVudEluZGV4ICsgMSwgcmFuZ2VNYXgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRWxlbWVudHNcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgaXNMaWdodFNlcmlhbGl6YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ0ZW1wbGF0ZVRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlVGl0bGVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidGVtcGxhdGVEZXNjcmlwdGlvbjp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGVtcGxhdGVEZXNjcmlwdGlvblwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiYWxsb3dBZGRQYW5lbDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwiYWxsb3dSZW1vdmVQYW5lbDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhbmVsQ291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgICAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcIm1pblBhbmVsQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhQYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudFxuICAgIH0sXG4gICAgXCJkZWZhdWx0UGFuZWxWYWx1ZTpwYW5lbHZhbHVlXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInBhbmVsc1N0YXRlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJjb2xsYXBzZWRcIiwgXCJleHBhbmRlZFwiLCBcImZpcnN0RXhwYW5kZWRcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJrZXlOYW1lXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb25maXJtRGVsZXRlOmJvb2xlYW5cIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb25maXJtRGVsZXRlVGV4dFwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxBZGRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYW5lbEFkZFRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJwYW5lbFJlbW92ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsUmVtb3ZlVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUHJldlRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsUHJldlRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJwYW5lbE5leHRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYW5lbE5leHRUZXh0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIixcbiAgICAgIGRlZmF1bHQ6IFwib2ZmXCIsXG4gICAgICBjaG9pY2VzOiBbXCJvZmZcIiwgXCJvblBhbmVsXCIsIFwib25TdXJ2ZXlcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaG93UmFuZ2VJblByb2dyZXNzOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVuZGVyTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJsaXN0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJsaXN0XCIsIFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiLCBcInByb2dyZXNzVG9wQm90dG9tXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXVxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHJhZGlvZ3JvdXAgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmFkaW9ncm91cFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2hvdyBcImNsZWFyIGJ1dHRvblwiIGZsYWcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NsZWFyQnV0dG9uXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dDbGVhckJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q2xlYXJCdXR0b25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhblNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93Q2xlYXJCdXR0b24gJiYgIXRoaXMuaXNSZWFkT25seTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNsZWFyQnV0dG9uQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQ2FwdGlvblwiKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJhZGlvZ3JvdXBcIixcbiAgW3sgbmFtZTogXCJzaG93Q2xlYXJCdXR0b246Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYWRpb2dyb3VwXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX3JhZGlvZ3JvdXAudHMiLCJpbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHJhdGluZyBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmF0aW5nTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByaXZhdGUgcmF0ZXM6IEFycmF5PEl0ZW1WYWx1ZT47XG5cbiAgcmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5yYXRlcyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJhdGVzXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicmF0ZXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uKHNlbmRlcjogYW55LCBvcHRpb25zOiBhbnkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZU1pblwiIHx8XG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVNYXhcIiB8fFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlU3RlcFwiXG4gICAgICApIHtcbiAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBsb2NNaW5SYXRlRGVzY3JpcHRpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHZhciBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGxvY01pblJhdGVEZXNjcmlwdGlvblZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0ICsgXCIgXCIgOiB0ZXh0O1xuICAgIH07XG4gICAgbG9jTWF4UmF0ZURlc2NyaXB0aW9uVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IFwiIFwiICsgdGV4dCA6IHRleHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJhdGUgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uIElmIGl0IGlzIGVtcHR5IHRoZSBhcnJheSBpcyBnZW5lcmF0ZWQgYnkgdXNpbmcgcmF0ZU1pbiwgcmF0ZU1heCBhbmQgcmF0ZVN0ZXAgcHJvcGVydGllcy5cbiAgICogQHNlZSByYXRlTWluXG4gICAqIEBzZWUgcmF0ZU1heFxuICAgKiBAc2VlIHJhdGVTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmF0ZXM7XG4gIH1cbiAgcHVibGljIHNldCByYXRlVmFsdWVzKHZhbDogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBnZW5lcmF0ZSByYXRlIHZhbHVlcyBpZiByYXRlVmFsdWVzIGFycmF5IGlzIGVtcHR5LiBJdCBpcyB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIHJhdGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS5cbiAgICogQHNlZSByYXRlVmFsdWVzXG4gICAqIEBzZWUgcmF0ZU1heFxuICAgKiBAc2VlIHJhdGVTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVNaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1pblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVNaW4odmFsOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdmFsID4gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlU3RlcClcbiAgICAgIHZhbCA9IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZVN0ZXA7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1pblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgcmF0ZSB2YWx1ZXMgaWYgcmF0ZVZhbHVlcyBhcnJheSBpcyBlbXB0eS4gSXQgaXMgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIHJhdGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS5cbiAgICogQHNlZSByYXRlVmFsdWVzXG4gICAqIEBzZWUgcmF0ZU1pblxuICAgKiBAc2VlIHJhdGVTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVNYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1heFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVNYXgodmFsOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdmFsIDwgdGhpcy5yYXRlTWluICsgdGhpcy5yYXRlU3RlcClcbiAgICAgIHZhbCA9IHRoaXMucmF0ZU1pbiArIHRoaXMucmF0ZVN0ZXA7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1heFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgcmF0ZSB2YWx1ZXMgaWYgcmF0ZVZhbHVlcyBhcnJheSBpcyBlbXB0eS4gSXQgaXMgdGhlIHN0ZXAgdmFsdWUuIFRoZSBudW1iZXIgb2YgcmF0ZSB2YWx1ZXMgYXJlIChyYXRlTWF4IC0gcmF0ZU1pbikgLyByYXRlU3RlcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS5cbiAgICogQHNlZSByYXRlVmFsdWVzXG4gICAqIEBzZWUgcmF0ZU1pblxuICAgKiBAc2VlIHJhdGVNYXhcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZVN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVN0ZXBcIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlU3RlcCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgdmFsID0gMTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdmFsID4gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlTWluKVxuICAgICAgdmFsID0gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlTWluO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHJlcyA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICAgIHRoaXMudmlzaWJsZVJhdGVWYWx1ZXMsXG4gICAgICB2YWx1ZVxuICAgICk7XG4gICAgcmV0dXJuICEhcmVzID8gcmVzIDogdmFsdWU7XG4gIH1cbiAgZ2V0IHZpc2libGVSYXRlVmFsdWVzKCk6IEl0ZW1WYWx1ZVtdIHtcbiAgICBpZiAodGhpcy5yYXRlVmFsdWVzLmxlbmd0aCA+IDApIHJldHVybiB0aGlzLnJhdGVWYWx1ZXM7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMucmF0ZU1pbjtcbiAgICB3aGlsZSAoXG4gICAgICB2YWx1ZSA8PSB0aGlzLnJhdGVNYXggJiZcbiAgICAgIHJlcy5sZW5ndGggPCBzZXR0aW5ncy5yYXRpbmdNYXhpbXVtUmF0ZVZhbHVlQ291bnRcbiAgICApIHtcbiAgICAgIHJlcy5wdXNoKG5ldyBJdGVtVmFsdWUodmFsdWUpKTtcbiAgICAgIHZhbHVlICs9IHRoaXMucmF0ZVN0ZXA7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyYXRpbmdcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIG1pbmltdW0gKGZpcnN0KSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5SYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtaW5SYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5SYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pblJhdGVEZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNaW5SYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWluUmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWF4aW11bSAobGFzdCkgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4UmF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UmF0ZURlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhSYXRlRGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTWF4UmF0ZURlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm1heFJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJyYXRpbmdcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNDb21tZW50OmJvb2xlYW5cIiwgbGF5b3V0OiBcInJvd1wiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb21tZW50VGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIsXG4gICAgICBsYXlvdXQ6IFwicm93XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmF0ZVZhbHVlczppdGVtdmFsdWVbXVwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwicmF0ZU1pbjpudW1iZXJcIiwgZGVmYXVsdDogMSB9LFxuICAgIHsgbmFtZTogXCJyYXRlTWF4Om51bWJlclwiLCBkZWZhdWx0OiA1IH0sXG4gICAgeyBuYW1lOiBcInJhdGVTdGVwOm51bWJlclwiLCBkZWZhdWx0OiAxLCBtaW5WYWx1ZTogMSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwibWluaW51bVJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY01pblJhdGVEZXNjcmlwdGlvblwiXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcIm1heGltdW1SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNYXhSYXRlRGVzY3JpcHRpb25cIlxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZ01vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhdGluZ1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZ01vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUN1c3RvbVdpZGdldCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByaXZhdGUgX2FmdGVyUmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQpIHtcbiAgICAgIGxldCBlbCA9IHRoaXMucmVmc1tcIndpZGdldFwiXTtcbiAgICAgIGlmICghIWVsKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcih0aGlzLnF1ZXN0aW9uQmFzZSwgZWwpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXREYXRhLmlzTmVlZFJlbmRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZSkge1xuICAgICAgdGhpcy5fYWZ0ZXJSZW5kZXIoKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogYW55LCBwcmV2U3RhdGU6IGFueSkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgdmFyIGlzRGVmYXVsdFJlbmRlciA9XG4gICAgICAhIXRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldCAmJlxuICAgICAgdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0LmlzRGVmYXVsdFJlbmRlcjtcbiAgICBpZiAodGhpcy5xdWVzdGlvbkJhc2UgJiYgIWlzRGVmYXVsdFJlbmRlcikge1xuICAgICAgdGhpcy5fYWZ0ZXJSZW5kZXIoKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0KSB7XG4gICAgICBsZXQgZWwgPSB0aGlzLnJlZnNbXCJ3aWRnZXRcIl07XG4gICAgICBpZiAoISFlbCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQud2lsbFVubW91bnQodGhpcy5xdWVzdGlvbkJhc2UsIGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb25CYXNlIHx8ICF0aGlzLmNyZWF0b3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucXVlc3Rpb25CYXNlLnZpc2libGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjdXN0b21XaWRnZXQgPSB0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQ7XG5cbiAgICBpZiAoY3VzdG9tV2lkZ2V0LmlzRGVmYXVsdFJlbmRlcikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiByZWY9XCJ3aWRnZXRcIj5cbiAgICAgICAgICB7dGhpcy5jcmVhdG9yLmNyZWF0ZVF1ZXN0aW9uRWxlbWVudCh0aGlzLnF1ZXN0aW9uQmFzZSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2lkZ2V0ID0gbnVsbDtcbiAgICBpZiAoY3VzdG9tV2lkZ2V0LndpZGdldEpzb24ucmVuZGVyKSB7XG4gICAgICB3aWRnZXQgPSBjdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5yZW5kZXIodGhpcy5xdWVzdGlvbkJhc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSkge1xuICAgICAgICBsZXQgaHRtbFZhbHVlID0geyBfX2h0bWw6IGN1c3RvbVdpZGdldC5odG1sVGVtcGxhdGUgfTtcbiAgICAgICAgcmV0dXJuIDxkaXYgcmVmPVwid2lkZ2V0XCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWxWYWx1ZX0gLz47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiA8ZGl2IHJlZj1cIndpZGdldFwiPnt3aWRnZXR9PC9kaXY+O1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvY3VzdG9tLXdpZGdldC50c3giLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciwgRXhwcmVzc2lvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IE9wZXJhbmRNYWtlciB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGFsbCB0cmlnZ2Vycy5cbiAqIEEgdHJpZ2dlciBjYWxscyBhIG1ldGhvZCB3aGVuIHRoZSBleHByZXNzaW9uIGNoYW5nZSB0aGUgcmVzdWx0OiBmcm9tIGZhbHNlIHRvIHRydWUgb3IgZnJvbSB0cnVlIHRvIGZhbHNlLlxuICogUGxlYXNlIG5vdGUsIGl0IHJ1bnMgb25seSBvbmUgY2hhbmdpbmcgdGhlIGV4cHJlc3Npb24gcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgVHJpZ2dlciBleHRlbmRzIEJhc2Uge1xuICBzdGF0aWMgb3BlcmF0b3JzVmFsdWU6IEhhc2hUYWJsZTxGdW5jdGlvbj4gPSBudWxsO1xuICBzdGF0aWMgZ2V0IG9wZXJhdG9ycygpIHtcbiAgICBpZiAoVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZSAhPSBudWxsKSByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcbiAgICBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlID0ge1xuICAgICAgZW1wdHk6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlO1xuICAgICAgfSxcbiAgICAgIG5vdGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG4gICAgICB9LFxuICAgICAgZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBub3RlcXVhbDogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlW1wiaW5kZXhPZlwiXSAmJiB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID4gLTE7XG4gICAgICB9LFxuICAgICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICF2YWx1ZSB8fCAhdmFsdWVbXCJpbmRleE9mXCJdIHx8IHZhbHVlLmluZGV4T2YoZXhwZWN0ZWRWYWx1ZSkgPT0gLTFcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBncmVhdGVyOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID4gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBsZXNzOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA+PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIGxlc3NvcmVxdWFsOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDw9IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIHVzZWROYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSBoYXNGdW5jdGlvbjogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVzZWROYW1lcyA9IFtdO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJvcGVyYXRvclwiLCBcInZhbHVlXCIsIFwibmFtZVwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9sZFByb3BlcnRpZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiZXhwcmVzc2lvblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25FeHByZXNzaW9uQ2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidHJpZ2dlcmJhc2VcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRUeXBlKCkucmVwbGFjZShcInRyaWdnZXJcIiwgXCJcIik7XG4gICAgdmFyIGV4cCA9ICEhdGhpcy5leHByZXNzaW9uID8gdGhpcy5leHByZXNzaW9uIDogdGhpcy5idWlsZEV4cHJlc3Npb24oKTtcbiAgICBpZiAoZXhwKSB7XG4gICAgICByZXMgKz0gXCIsIFwiICsgZXhwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwib3BlcmF0b3JcIiwgXCJlcXVhbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghVHJpZ2dlci5vcGVyYXRvcnNbdmFsdWVdKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwib3BlcmF0b3JcIiwgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgbnVsbCk7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiLCB2YWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBjaGVja0V4cHJlc3Npb24oXG4gICAga2V5czogYW55LFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsXG4gICkge1xuICAgIGlmICghdGhpcy5pc0NoZWNrUmVxdWlyZWQoa2V5cykpIHJldHVybjtcbiAgICBpZiAoISF0aGlzLmNvbmRpdGlvblJ1bm5lcikge1xuICAgICAgdGhpcy5wZXJmb3JtKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjaGVjayh2YWx1ZTogYW55KSB7XG4gICAgdmFyIHRyaWdnZXJSZXN1bHQgPSBUcmlnZ2VyLm9wZXJhdG9yc1t0aGlzLm9wZXJhdG9yXSh2YWx1ZSwgdGhpcy52YWx1ZSk7XG4gICAgaWYgKHRyaWdnZXJSZXN1bHQpIHtcbiAgICAgIHRoaXMub25TdWNjZXNzKHt9LCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkZhaWx1cmUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwZXJmb3JtKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIub25SdW5Db21wbGV0ZSA9IChyZXM6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlclJlc3VsdChyZXMsIHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHRyaWdnZXJSZXN1bHQoXG4gICAgcmVzOiBib29sZWFuLFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy5vblN1Y2Nlc3ModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkZhaWx1cmUoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge31cbiAgcHJvdGVjdGVkIG9uRmFpbHVyZSgpIHt9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLm9sZFByb3BlcnRpZXNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBvbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uRXhwcmVzc2lvbkNoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIG9uRXhwcmVzc2lvbkNoYW5nZWQoKSB7XG4gICAgdGhpcy51c2VkTmFtZXMgPSBbXTtcbiAgICB0aGlzLmhhc0Z1bmN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBudWxsO1xuICB9XG4gIHB1YmxpYyBidWlsZEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMubmFtZSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpICYmIHRoaXMuaXNSZXF1aXJlVmFsdWUpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICBcIntcIiArXG4gICAgICB0aGlzLm5hbWUgK1xuICAgICAgXCJ9IFwiICtcbiAgICAgIHRoaXMub3BlcmF0b3IgK1xuICAgICAgXCIgXCIgK1xuICAgICAgT3BlcmFuZE1ha2VyLnRvT3BlcmFuZFN0cmluZyh0aGlzLnZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBpc0NoZWNrUmVxdWlyZWQoa2V5czogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFrZXlzKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idWlsZFVzZWROYW1lcygpO1xuICAgIGlmICh0aGlzLmhhc0Z1bmN0aW9uID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudXNlZE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnVzZWROYW1lc1tpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFVzZWROYW1lcygpIHtcbiAgICBpZiAoISF0aGlzLmNvbmRpdGlvblJ1bm5lcikgcmV0dXJuO1xuICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgIGlmICghZXhwcmVzc2lvbikge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuYnVpbGRFeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcihleHByZXNzaW9uKTtcbiAgICB0aGlzLmhhc0Z1bmN0aW9uID0gdGhpcy5jb25kaXRpb25SdW5uZXIuaGFzRnVuY3Rpb24oKTtcbiAgICB0aGlzLnVzZWROYW1lcyA9IHRoaXMuY29uZGl0aW9uUnVubmVyLmdldFZhcmlhYmxlcygpO1xuICAgIHZhciBwcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnVzZWROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51c2VkTmFtZXNbaV0gPSBwcm9jZXNzVmFsdWUuZ2V0Rmlyc3ROYW1lKHRoaXMudXNlZE5hbWVzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNSZXF1aXJlVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3IgIT09IFwiZW1wdHlcIiAmJiB0aGlzLm9wZXJhdG9yICE9IFwibm90ZW1wdHlcIjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlUcmlnZ2VyT3duZXIge1xuICBnZXRPYmplY3RzKHBhZ2VzOiBzdHJpbmdbXSwgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IGFueVtdO1xuICBzZXRDb21wbGV0ZWQoKTogYW55O1xuICBzZXRUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc1ZhcmlhYmxlOiBib29sZWFuKTogYW55O1xuICBjb3B5VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgZnJvbU5hbWU6IHN0cmluZyk6IGFueTtcbiAgZm9jdXNRdWVzdGlvbihuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEl0IGV4dGVuZHMgdGhlIFRyaWdnZXIgYmFzZSBjbGFzcyBhbmQgYWRkIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIFN1cnZleUpTIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyIGV4dGVuZHMgVHJpZ2dlciB7XG4gIHByb3RlY3RlZCBvd25lcjogSVN1cnZleVRyaWdnZXJPd25lciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIHNldE93bmVyKG93bmVyOiBJU3VydmV5VHJpZ2dlck93bmVyKSB7XG4gICAgdGhpcy5vd25lciA9IG93bmVyO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgaXQgbWFrZXMgcXVlc3Rpb25zL3BhZ2VzIHZpc2libGUuXG4gKiBPaHRlcndpc2UgaXQgbWFrZXMgdGhlbSBpbnZpc2libGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgcGFnZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBxdWVzdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ2aXNpYmxldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbVN1Y2Nlc3MpO1xuICB9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7XG4gICAgdGhpcy5vblRyaWdnZXIodGhpcy5vbkl0ZW1GYWlsdXJlKTtcbiAgfVxuICBwcml2YXRlIG9uVHJpZ2dlcihmdW5jOiBGdW5jdGlvbikge1xuICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHZhciBvYmplY3RzID0gdGhpcy5vd25lci5nZXRPYmplY3RzKHRoaXMucGFnZXMsIHRoaXMucXVlc3Rpb25zKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZ1bmMob2JqZWN0c1tpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1TdWNjZXNzKGl0ZW06IGFueSkge1xuICAgIGl0ZW0udmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbUZhaWx1cmUoaXRlbTogYW55KSB7XG4gICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIGl0IGNvbXBsZXRlcyB0aGUgc3VydmV5LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvbXBsZXRlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wbGV0ZXRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMub3duZXIpIHRoaXMub3duZXIuc2V0Q29tcGxldGVkKCk7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZSB2YWx1ZSBmcm9tIHByb3BlcnR5ICoqc2V0VmFsdWUqKiB3aWxsIGJlIHNldCB0byAqKnNldFRvTmFtZSoqXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgcHVibGljIHNldFRvTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc2V0VmFsdWU6IGFueTtcbiAgcHVibGljIGlzVmFyaWFibGU6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzZXR2YWx1ZXRyaWdnZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLnNldFZhbHVlLCB0aGlzLmlzVmFyaWFibGUpO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgc3VydmV5IGdvIHRvIHF1ZXN0aW9uICoqZ290b05hbWUqKiBhbmQgZm9jdXMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2tpcCBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgZ290b05hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNraXB0cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5nb3RvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuZm9jdXNRdWVzdGlvbih0aGlzLmdvdG9OYW1lKTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlICoqcnVuRXhwcmVzc2lvbioqIHdpbGwgYmUgcnVuLiBJZiAqKnNldFRvTmFtZSoqIHByb3BlcnR5IGlzIG5vdCBlbXB0eSB0aGVuIHRoZSByZXN1bHQgb2YgKipydW5FeHByZXNzaW9uKiogd2lsbCBiZSBzZXQgdG8gaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbiBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgc2V0VG9OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBydW5FeHByZXNzaW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJydW5leHByZXNzaW9udHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMub3duZXIgfHwgIXRoaXMucnVuRXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHZhciBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb25SdW5uZXIodGhpcy5ydW5FeHByZXNzaW9uKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5jYW5SdW4pIHtcbiAgICAgIGV4cHJlc3Npb24ub25SdW5Db21wbGV0ZSA9IHJlcyA9PiB7XG4gICAgICAgIHRoaXMub25Db21wbGV0ZVJ1bkV4cHJlc3Npb24ocmVzKTtcbiAgICAgIH07XG4gICAgICBleHByZXNzaW9uLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG9uQ29tcGxldGVSdW5FeHByZXNzaW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuc2V0VG9OYW1lIHx8IG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgdmFsdWUgZnJvbSBxdWVzdGlvbiAqKmZyb21OYW1lKiogd2lsbCBiZSBzZXQgaW50byAqKnNldFRvTmFtZSoqLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvcHlWYWx1ZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgc2V0VG9OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBmcm9tTmFtZTogYW55O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29weXZhbHVldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMuc2V0VG9OYW1lIHx8ICF0aGlzLm93bmVyKSByZXR1cm47XG4gICAgdGhpcy5vd25lci5jb3B5VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLmZyb21OYW1lKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFwidHJpZ2dlclwiLCBbXG4gIHsgbmFtZTogXCJvcGVyYXRvclwiLCBkZWZhdWx0OiBcImVxdWFsXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJ2YWx1ZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBcImV4cHJlc3Npb246Y29uZGl0aW9uXCJcbl0pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwibmFtZVwiLCB2aXNpYmxlOiBmYWxzZSB9XSxcbiAgbnVsbCxcbiAgXCJ0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInZpc2libGV0cmlnZ2VyXCIsXG4gIFtcInBhZ2VzOnBhZ2VzXCIsIFwicXVlc3Rpb25zOnF1ZXN0aW9uc1wiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29tcGxldGV0cmlnZ2VyXCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJDb21wbGV0ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2V0dmFsdWV0cmlnZ2VyXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiIXNldFRvTmFtZTpxdWVzdGlvblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCIhc2V0VmFsdWU6dHJpZ2dlcnZhbHVlXCIsXG4gICAgICBkZXBlbmRzT246IFwic2V0VG9OYW1lXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiAhIW9ialtcInNldFRvTmFtZVwiXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJpc1ZhcmlhYmxlOmJvb2xlYW5cIiwgdmlzaWJsZTogZmFsc2UgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJTZXRWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29weXZhbHVldHJpZ2dlclwiLFxuICBbeyBuYW1lOiBcIiFzZXRUb05hbWU6cXVlc3Rpb25cIiB9LCB7IG5hbWU6IFwiIWZyb21OYW1lOnF1ZXN0aW9uXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvcHlWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2tpcHRyaWdnZXJcIixcbiAgW3sgbmFtZTogXCIhZ290b05hbWU6cXVlc3Rpb25cIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyU2tpcCgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicnVuZXhwcmVzc2lvbnRyaWdnZXJcIixcbiAgW3sgbmFtZTogXCJzZXRUb05hbWU6cXVlc3Rpb25cIiB9LCBcInJ1bkV4cHJlc3Npb246ZXhwcmVzc2lvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbigpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmlnZ2VyLnRzIiwiZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKGE6IGFueSwgYjogYW55KSB7XG4gIHZhciBpLCBkaWZmO1xuICB2YXIgcmVnRXhTdHJpcDAgPSAvKFxcLjArKSskLztcbiAgdmFyIHNlZ21lbnRzQSA9IGEucmVwbGFjZShyZWdFeFN0cmlwMCwgXCJcIikuc3BsaXQoXCIuXCIpO1xuICB2YXIgc2VnbWVudHNCID0gYi5yZXBsYWNlKHJlZ0V4U3RyaXAwLCBcIlwiKS5zcGxpdChcIi5cIik7XG4gIHZhciBsID0gTWF0aC5taW4oc2VnbWVudHNBLmxlbmd0aCwgc2VnbWVudHNCLmxlbmd0aCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGRpZmYgPSBwYXJzZUludChzZWdtZW50c0FbaV0sIDEwKSAtIHBhcnNlSW50KHNlZ21lbnRzQltpXSwgMTApO1xuICAgIGlmIChkaWZmKSB7XG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlZ21lbnRzQS5sZW5ndGggLSBzZWdtZW50c0IubGVuZ3RoO1xufVxuZnVuY3Rpb24gY29uZmlybUFjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpcm0obWVzc2FnZSk7XG59XG5mdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cub3JpZW50YXRpb24gIT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCB7IGNvbXBhcmVWZXJzaW9ucywgY29uZmlybUFjdGlvbiwgaXNNb2JpbGUgfTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlscy91dGlscy50cyIsIi8vIG1vZGVsXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvbW9kZWxcIjtcblxuLy8gbG9jYWxpemF0aW9uXG5pbXBvcnQgXCIuL2NodW5rcy9sb2NhbGl6YXRpb25cIjtcblxuLy8gaGVscGVyc1xuZXhwb3J0ICogZnJvbSBcIi4vY2h1bmtzL2hlbHBlcnNcIjtcblxuLy8gY3NzIHN0YW5kYXJkXG5leHBvcnQgeyBkZWZhdWx0U3RhbmRhcmRDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xuLy8gY3NzIGJvb3RzdHJhcFxuZXhwb3J0IHsgZGVmYXVsdEJvb3RzdHJhcENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcFwiO1xuLy8gY3NzIGJvb3RzdHJhcCArIG1hdGVyaWFsXG5leHBvcnQge1xuICBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3Ncbn0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwbWF0ZXJpYWxcIjtcbmV4cG9ydCB7IG1vZGVybkNzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc21vZGVyblwiO1xuXG4vLyByZWFjdFxuZXhwb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5XCI7XG5leHBvcnQgeyBSZWFjdFN1cnZleU1vZGVsLCBSZWFjdFdpbmRvd01vZGVsIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0c3VydmV5bW9kZWxcIjtcbmV4cG9ydCB7XG4gIFJlYWN0U3VydmV5TW9kZWwgYXMgTW9kZWwsXG4gIFJlYWN0V2luZG93TW9kZWwgYXMgV2luZG93TW9kZWxcbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0c3VydmV5bW9kZWxcIjtcbmV4cG9ydCB7IFN1cnZleU5hdmlnYXRpb25CYXNlIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvbkJhc2VcIjtcbmV4cG9ydCB7IFN1cnZleVRpbWVyUGFuZWwgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3R0aW1lcnBhbmVsXCI7XG5leHBvcnQgeyBTdXJ2ZXlOYXZpZ2F0aW9uIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvblwiO1xuZXhwb3J0IHsgU3VydmV5UGFnZSB9IGZyb20gXCIuLi9yZWFjdC9wYWdlXCI7XG5leHBvcnQgeyBTdXJ2ZXlSb3cgfSBmcm9tIFwiLi4vcmVhY3Qvcm93XCI7XG5leHBvcnQgeyBTdXJ2ZXlQYW5lbCB9IGZyb20gXCIuLi9yZWFjdC9wYW5lbFwiO1xuZXhwb3J0IHsgU3VydmV5Rmxvd1BhbmVsIH0gZnJvbSBcIi4uL3JlYWN0L2Zsb3ctcGFuZWxcIjtcbmV4cG9ydCB7XG4gIFN1cnZleVF1ZXN0aW9uLFxuICBTdXJ2ZXlFbGVtZW50RXJyb3JzLFxuICBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGxcbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25cIjtcbmV4cG9ydCB7XG4gIFN1cnZleUVsZW1lbnRCYXNlLFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlXG59IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuZXhwb3J0IHtcbiAgU3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSxcbiAgU3VydmV5UXVlc3Rpb25Db21tZW50XG59IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuZXhwb3J0IHtcbiAgU3VydmV5UXVlc3Rpb25DaGVja2JveCxcbiAgU3VydmV5UXVlc3Rpb25DaGVja2JveEl0ZW1cbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25jaGVja2JveFwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25Ecm9wZG93biB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZHJvcGRvd25cIjtcbmV4cG9ydCB7XG4gIFN1cnZleVF1ZXN0aW9uTWF0cml4LFxuICBTdXJ2ZXlRdWVzdGlvbk1hdHJpeFJvd1xufSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeFwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25IdG1sIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25odG1sXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkZpbGUgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGVcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0IH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHRcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uUmFkaW9ncm91cCB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ucmFkaW9ncm91cFwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25UZXh0IH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0XCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkJvb2xlYW4gfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmJvb2xlYW5cIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uRW1wdHkgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmVtcHR5XCI7XG5leHBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duQ2VsbFxufSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGRyb3Bkb3duYmFzZVwiO1xuZXhwb3J0IHtcbiAgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93blxufSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGRyb3Bkb3duXCI7XG5leHBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNcbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkeW5hbWljXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvblBhbmVsRHluYW1pYyB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ucGFuZWxkeW5hbWljXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9ncmVzcyB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleVByb2dyZXNzXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvblJhdGluZyB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ucmF0aW5nXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmV4cHJlc3Npb25cIjtcbmV4cG9ydCB7IFN1cnZleVdpbmRvdyB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleVdpbmRvd1wiO1xuZXhwb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmV4cG9ydCB7IFJlYWN0RWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi4vcmVhY3QvZWxlbWVudC1mYWN0b3J5XCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkltYWdlUGlja2VyIH0gZnJvbSBcIi4uL3JlYWN0L2ltYWdlcGlja2VyXCI7XG5cbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBTdXJ2ZXlRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL3JlYWN0L3JlYWN0cXVlc3Rpb25kYXRlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9yZWFjdC50cyJdLCJzb3VyY2VSb290IjoiIn0=