/*!
* surveyjs - Survey JavaScript library v1.0.63
* Copyright (c) 2015-2018 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("knockout"));
else if(typeof define === 'function' && define.amd)
define("Survey", ["knockout"], factory);
else if(typeof exports === 'object')
exports["Survey"] = factory(require("knockout"));
else
root["Survey"] = factory(root["ko"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_7__) {
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 = 138);
/******/ })
/************************************************************************/
/******/ ([
/* 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; });
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;
};
/***/ }),
/* 1 */
/***/ (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__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", 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__, "k", 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__, "j", function() { return JsonRequiredPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return JsonObject; });
var JsonObjectProperty = /** @class */ (function () {
function JsonObjectProperty(name, isRequired) {
if (isRequired === void 0) { isRequired = false; }
this.name = name;
this.typeValue = null;
this.choicesValue = null;
this.isRequiredValue = false;
this.readOnlyValue = null;
this.visibleValue = null;
this.isLocalizableValue = null;
this.choicesfunc = null;
this.isSerializable = true;
this.isDynamicChoices = false;
this.className = null;
this.alternativeName = null;
this.classNamePart = null;
this.baseClassName = null;
this.defaultValueValue = null;
this.serializationProperty = null;
this.onGetValue = null;
this.onSetValue = 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)
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].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", {
get: function () {
return this.getChoices(null);
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.getChoices = function (obj) {
if (this.choicesValue != null)
return this.choicesValue;
if (this.choicesfunc != null)
return this.choicesfunc(obj);
return null;
};
JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {
this.choicesValue = value;
this.choicesfunc = valueFunc;
};
Object.defineProperty(JsonObjectProperty.prototype, "readOnly", {
get: function () {
return this.readOnlyValue != null ? this.readOnlyValue : false;
},
set: function (val) {
this.readOnlyValue = val;
},
enumerable: true,
configurable: 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.mergeValue = function (prop, valueName) {
if (this[valueName] == null && prop[valueName] != null) {
this[valueName] = prop[valueName];
}
};
JsonObjectProperty.mergableValues = [
"typeValue",
"choicesValue",
"readOnlyValue",
"visibleValue",
"isSerializable",
"isDynamicChoices",
"isLocalizableValue",
"className",
"alternativeName",
"classNamePart",
"baseClassName",
"defaultValue",
"serializationProperty",
"onGetValue",
"onSetValue"
];
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) {
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 (parentName) {
parentName = parentName.toLowerCase();
CustomPropertiesCollection.addClass(name, 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);
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.isDynamicChoices)) {
prop.isDynamicChoices = propInfo.isDynamicChoices;
}
if (propInfo.visible === false) {
prop.visible = false;
}
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.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;
}
}
return prop;
};
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 = {};
}
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.overrideClassCreatore = 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) {
properties = new Array();
this.fillProperties(metaClass.name, properties);
this.classProperties[metaClass.name] = properties;
}
return properties;
};
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) {
className = className.toLowerCase();
return this.findPropertyCore(this.getProperties(className), propertyName);
};
JsonMetadata.prototype.findProperties = function (className, propertyNames) {
className = className.toLowerCase();
var result = [];
var properties = this.getProperties(className);
for (var i = 0; i < propertyNames.length; i++) {
var prop = this.findPropertyCore(properties, propertyNames[i]);
if (prop) {
result.push(prop);
}
}
return result;
};
JsonMetadata.prototype.findPropertyCore = function (properties, propertyName) {
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == propertyName)
return properties[i];
}
return null;
};
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) {
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;
var childClasses = this.getChildrenClasses(metaDataClass.name);
for (var i = 0; i < childClasses.length; i++) {
this.classProperties[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) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.parentName) {
this.fillProperties(metaDataClass.parentName, list);
}
for (var i = 0; i < metaDataClass.properties.length; i++) {
this.addPropertyCore(metaDataClass.properties[i], list, list.length);
}
};
JsonMetadata.prototype.addPropertyCore = function (property, list, endIndex) {
var index = -1;
for (var i = 0; i < endIndex; i++) {
if (list[i].name == property.name) {
index = i;
break;
}
}
if (index < 0) {
list.push(property);
}
else {
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_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_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_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_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_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();
}
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) {
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)
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.toObject(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) {
var requiredProperties = JsonObject.metaData.getRequiredProperties(className);
if (requiredProperties) {
for (var i = 0; i < requiredProperties.length; i++) {
if (!value[requiredProperties[i]]) {
error = new JsonRequiredPropertyError(requiredProperties[i], className);
break;
}
}
}
}
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.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.toObject(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;
}());
/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_english__ = __webpack_require__(37);
/* 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";
/***/ }),
/* 3 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __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.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.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;
}());
/***/ }),
/* 4 */
/***/ (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__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Base; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", 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);
}
/**
* 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
*/
Base.prototype.toJSON = function () {
return new __WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */]().toJsonObject(this);
};
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) && defaultValue != null)
return defaultValue;
return res;
};
Base.prototype.getPropertyValueCore = function (propertiesHash, name) {
if (this.getPropertyValueCoreHandler)
return this.getPropertyValueCoreHandler(propertiesHash, name);
else
return propertiesHash[name];
};
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.propertyValueChanged = function (name, oldValue, newValue) {
if (this.isLoadingFromJson)
return;
this.onPropertyChanged.fire(this, {
name: name,
oldValue: oldValue,
newValue: newValue
});
if (!this.onPropChangeFunctions)
return;
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
if (this.onPropChangeFunctions[i].name == name)
this.onPropChangeFunctions[i].func(newValue);
}
};
/**
* 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.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);
self.propertyValueChanged(name, newArray, newArray);
self.notifyArrayChanged(newArray);
return result;
};
newArray.pop = function () {
var result = Object.getPrototypeOf(newArray).pop.call(newArray);
if (onRemove)
onRemove(result);
self.propertyValueChanged(name, newArray, newArray);
self.notifyArrayChanged(newArray);
return result;
};
newArray.splice = function (start, deleteCount) {
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, [newArray,
start,
deleteCount].concat(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);
}
}
self.propertyValueChanged(name, newArray, newArray);
self.notifyArrayChanged(newArray);
return result;
var _a;
};
return newArray;
};
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);
}
}
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) {
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isTwoValueEquals(x, y);
};
Base.commentPrefix = "-Comment";
return Base;
}());
var SurveyError = /** @class */ (function () {
function SurveyError(text, locOwner) {
if (text === void 0) { text = null; }
if (locOwner === void 0) { locOwner = null; }
this.text = text;
this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](locOwner, true);
this.locText.text = this.getText();
}
Object.defineProperty(SurveyError.prototype, "locText", {
get: function () {
return this.locTextValue;
},
enumerable: true,
configurable: true
});
SurveyError.prototype.getText = function () {
var res = this.text;
if (!res)
res = this.getDefaultText();
return res;
};
SurveyError.prototype.getDefaultText = function () {
return "";
};
return SurveyError;
}());
var SurveyElement = /** @class */ (function (_super) {
__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");
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, "isLoadingFromJson", {
get: function () {
if (this.survey)
return this.survey.isLoadingFromJson;
return this.isLoadingFromJsonValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "name", {
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
});
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, "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.setPage = function (parent, val) {
var oldPage = this.getPage(parent);
if (oldPage === val)
return;
if (parent)
parent.removeElement(this);
if (val) {
val.addElement(this, -1);
}
};
SurveyElement.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;
}
};
SurveyElement.prototype.copyCssClasses = function (dest, source) {
if (!source)
return;
if (typeof source === "string" || source instanceof String) {
dest["root"] = source;
}
else {
SurveyElement.copyObject(dest, source);
}
};
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.callbacks == null)
return;
var index = this.callbacks.indexOf(func, 0);
if (index != undefined) {
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;
}());
/***/ }),
/* 5 */
/***/ (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 === "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 ((x && !y) || (!x && y))
return false;
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 (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.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;
});
};
}
/***/ }),
/* 6 */
/***/ (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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__kobase__ = __webpack_require__(19);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionImplementor; });
var QuestionImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionImplementor, _super);
function QuestionImplementor(question) {
var _this = _super.call(this, question) || this;
_this.question = question;
var self = _this;
question.surveyLoadCallback = function () {
self.onSurveyLoad();
};
_this.koTemplateName = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
return self.getTemplateName();
});
_this.koElementType = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("survey-question");
_this.question["koElementType"] = _this.koElementType;
_this.question["koTemplateName"] = _this.koTemplateName;
_this.question["updateQuestion"] = function () {
self.updateQuestion();
};
_this.question["koCss"] = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
return self.question.cssClasses;
});
_this.question["koRootClass"] = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
var result = self.question.cssClasses.mainRoot;
if (self.question.getTitleLocation() === "left") {
result += " sv_qstn_left";
}
if (self.question.errors.length > 0) {
result += " " + self.question.cssClasses.hasError;
}
return result;
});
question.commentChangedCallback = function () {
self.onCommentChanged();
};
question.registerFunctionOnPropertyValueChanged("visibleIndex", function () {
self.onVisibleIndexChanged();
});
_this.koDummy = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
_this.koComment = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.comment);
_this.koComment.subscribe(function (newValue) {
self.updateComment(newValue);
});
_this.question["koComment"] = _this.koComment;
_this.question["koQuestionAfterRender"] = function (el, con) {
self.koQuestionAfterRender(el, con);
};
return _this;
}
QuestionImplementor.prototype.updateQuestion = function () {
this.updateKoDummy();
};
QuestionImplementor.prototype.onCommentChanged = function () {
var val = this.question.comment;
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(val, this.question.value))
return;
this.koComment(val);
};
QuestionImplementor.prototype.onVisibleIndexChanged = function () {
this.updateKoDummy();
};
QuestionImplementor.prototype.onSurveyLoad = function () { };
QuestionImplementor.prototype.getQuestionTemplate = function () {
return this.question.getTemplate();
};
QuestionImplementor.prototype.getTemplateName = function () {
if (this.question.customWidget &&
!this.question.customWidget.widgetJson.isDefaultRender)
return "survey-widget-" + this.question.customWidget.name;
return "survey-question-" + this.getQuestionTemplate();
};
QuestionImplementor.prototype.updateComment = function (newValue) {
this.question.comment = newValue;
};
QuestionImplementor.prototype.getNo = function () {
return this.question.visibleIndex > -1
? this.question.visibleIndex + 1 + ". "
: "";
};
QuestionImplementor.prototype.updateKoDummy = function () {
this.koDummy(this.koDummy() + 1);
this.question.locTitle.onChanged();
};
QuestionImplementor.prototype.koQuestionAfterRender = function (elements, con) {
var el = __WEBPACK_IMPORTED_MODULE_2__base__["c" /* SurveyElement */].GetFirstNonTextElement(elements);
var tEl = elements[0];
if (tEl.nodeName === "#text")
tEl.data = "";
tEl = elements[elements.length - 1];
if (tEl.nodeName === "#text")
tEl.data = "";
if (el && this.question.customWidget)
this.question.customWidget.afterRender(this.question, el);
};
return QuestionImplementor;
}(__WEBPACK_IMPORTED_MODULE_4__kobase__["a" /* ImplementorBase */]));
/***/ }),
/* 7 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_7__;
/***/ }),
/* 8 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__validator__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__textPreProcessor__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__conditions__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__defaultCss_cssstandard__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__questionCustomWidgets__ = __webpack_require__(25);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Question; });
/**
* A base class for all questions.
*/
var Question = /** @class */ (function (_super) {
__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.isvalueChangedCallbackFiring = false;
_this.isValueChangedInSurvey = false;
_this.isSettingValueInData = false;
//ILocalizableOwner
_this.locOwner = null;
_this.id = Question.getQuestionId();
_this.onCreating();
var self = _this;
_this.createNewArray("validators", function (validator) {
validator.locOwner = self;
});
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onRenderedHtmlCallback = function (text) {
return self.fullTitle;
};
_this.createLocalizableString("description", _this, true);
_this.createLocalizableString("commentText", _this, true);
_this.createLocalizableString("requiredErrorText", _this);
_this.registerFunctionOnPropertyValueChanged("width", function () {
if (!!self.parent) {
self.parent.elementWidthChanged(self);
}
});
_this.registerFunctionOnPropertiesValueChanged(["indent", "rightIndent"], function () {
self.onIndentChanged();
});
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'.
*/
get: function () {
return this.getPropertyValue("valueName", "");
},
set: function (val) {
var oldValueName = this.getValueName();
this.setPropertyValue("valueName", this.getCorrectedName(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);
};
Question.prototype.onNameChanged = function (oldValue) {
if (!this.survey)
return;
this.survey.questionRenamed(this, oldValue, this.valueName ? this.valueName : oldValue);
};
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
});
Object.defineProperty(Question.prototype, "isPanel", {
/**
* Always returns false.
*/
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Question.prototype.getPanel = function () {
return null;
};
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);
},
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
});
Question.prototype.propertyValueChanged = function (name, oldValue, newValue) {
if (name === "name") {
this.onNameValueChanged(oldValue, newValue);
}
_super.prototype.propertyValueChanged.call(this, name, oldValue, newValue);
};
Question.prototype.onNameValueChanged = function (oldValue, newValue) {
if (!newValue)
return;
if (newValue.indexOf(".") > -1) {
if (!this.valueName || this.isCorrectedNameEqualsValueName(oldValue))
this.valueName = newValue;
}
else {
if (!!this.valueName && this.isCorrectedNameEqualsValueName(oldValue)) {
this.valueName = "";
}
}
};
Question.prototype.getCorrectedName = function (name) {
if (!name || typeof name !== "string")
return name;
while (name.indexOf(".") > -1)
name = name.replace(".", " ");
return name.trim();
};
Question.prototype.isCorrectedNameEqualsValueName = function (name) {
if (!name || name.indexOf(".") < 0 || !this.valueName)
return false;
return this.getCorrectedName(name) == this.valueName;
};
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";
};
Question.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
if (this.survey && this.survey.isDesignMode) {
this.onVisibleChanged();
}
if (this.data && !this.isLoadingFromJson) {
this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
this.locStrsChanged();
}
};
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);
},
enumerable: true,
configurable: true
});
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("questionTitleLocation", "default");
},
set: function (value) {
var isVisibilityChanged = this.titleLocation == "hidden" || value == "hidden";
this.setPropertyValue("questionTitleLocation", 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 () {
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, "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_3__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
});
Object.defineProperty(Question.prototype, "locTitleHtml", {
get: function () {
var res = this.locTitle.textOrHtml;
return res ? res : this.name;
},
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_9__questionCustomWidgets__["a" /* CustomWidgetCollection */].Instance.getCustomWidget(this);
};
Object.defineProperty(Question.prototype, "processedTitle", {
/**
* Returns the rendred question title.
*/
get: function () {
var res = this.locTitle.textOrHtml;
return res ? res : this.name;
//return this.getProcessedHtml(this.locTitleHtml);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "fullTitle", {
/**
* Returns the title after processing the question template.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
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 () {
var titleTemplate = this.getQuestionTitleTemplate();
if (titleTemplate) {
if (!this.textPreProcessor) {
var self = this;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_6__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
}
return this.textPreProcessor.process(titleTemplate, this.useDisplayValuesInTitle);
}
var requireText = this.requiredText;
if (requireText)
requireText += " ";
var no = this.no;
if (no)
no += ". ";
return no + requireText + this.processedTitle;
};
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 surveyCss = this.css;
var classes = { error: {} };
this.copyCssClasses(classes, surveyCss.question);
this.copyCssClasses(classes.error, surveyCss.error);
this.updateCssClasses(classes, surveyCss);
if (this.survey) {
this.survey.updateQuestionCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
Question.prototype.getRootCss = function (classes) {
return classes.question.root;
};
Question.prototype.updateCssClasses = function (res, surveyCss) {
if (this.isRequired) {
if (surveyCss.question.required) {
res.root += " " + surveyCss.question.required;
}
if (surveyCss.question.titleRequired) {
res.title += " " + surveyCss.question.titleRequired;
}
}
var objCss = surveyCss[this.getType()];
if (objCss === undefined || objCss === null)
return;
if (typeof objCss === "string" || objCss instanceof String) {
res.root = objCss;
}
else {
for (var key in objCss) {
res[key] = objCss[key];
}
}
};
Object.defineProperty(Question.prototype, "css", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_8__defaultCss_cssstandard__["b" /* surveyCss */].getCss();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "width", {
/**
* Use it to set the specific width to the question.
*/
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_2__base__["c" /* SurveyElement */].ScrollElementToTop(this.id);
var id = !onError
? this.getFirstInputElementId()
: this.getFirstErrorInputElementId();
if (__WEBPACK_IMPORTED_MODULE_2__base__["c" /* 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, "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, "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, "readOnly", {
/**
* Set it to true to make a question readonly.
* @see enableIf
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("readOnly", false);
},
set: function (val) {
if (this.readOnly == val)
return;
this.setPropertyValue("readOnly", val);
},
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);
},
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 (!this.areInvisibleElementsShowing) {
this.runVisibleIfCondition(values, properties);
}
this.runEnableIfCondition(values, properties);
};
Question.prototype.runVisibleIfCondition = function (values, properties) {
if (!this.visibleIf)
return;
if (!this.conditionRunner)
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_7__conditions__["a" /* ConditionRunner */](this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.visible = this.conditionRunner.run(values, properties);
};
Question.prototype.runEnableIfCondition = function (values, properties) {
if (!this.enableIf)
return;
if (!this.conditionEnabelRunner)
this.conditionEnabelRunner = new __WEBPACK_IMPORTED_MODULE_7__conditions__["a" /* ConditionRunner */](this.enableIf);
this.conditionEnabelRunner.expression = this.enableIf;
this.readOnly = !this.conditionEnabelRunner.run(values, properties);
};
Object.defineProperty(Question.prototype, "no", {
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.onSurveyValueChanged(this.value);
this.updateValueWithDefaults();
};
Object.defineProperty(Question.prototype, "value", {
/**
* Get/Set the question value.
* @see SurveyMode.setValue
* @see SurveyMode.getValue
*/
get: function () {
return this.valueFromData(this.getValueCore());
},
set: function (newValue) {
this.setNewValue(newValue);
if (this.isvalueChangedCallbackFiring)
return;
this.isvalueChangedCallbackFiring = true;
this.fireCallback(this.valueChangedCallback);
this.isvalueChangedCallbackFiring = false;
},
enumerable: true,
configurable: true
});
Question.prototype.clearValue = function () {
this.value = null;
this.comment = null;
};
Question.prototype.canClearValueAsInvisible = function () {
if (this.isVisible && this.isParentVisible)
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.getPropertyValue("displayValue", "");
},
enumerable: true,
configurable: true
});
Question.prototype.updateDisplayValue = function () {
if (this.isLoadingFromJson)
return;
this.setPropertyValue("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.
*/
Question.prototype.getDisplayValue = function (keysAsText) {
if (this.customWidget) {
var res = this.customWidget.getDisplayValue(this);
if (res)
return res;
}
return this.getDisplayValueCore(keysAsText);
};
Question.prototype.getDisplayValueCore = function (keyAsText) {
return this.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
});
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
});
Question.prototype.isAnswerCorrect = function () {
if (this.isValueEmpty(this.value) || this.isValueEmpty(this.correctAnswer))
return false;
return this.isTwoValueEquals(this.value, this.correctAnswer);
};
Question.prototype.updateValueWithDefaults = function () {
if (this.isLoadingFromJson ||
(!this.isDesignMode && this.isDefaultValueEmpty()))
return;
if (!this.isDesignMode && !this.isEmpty())
return;
this.setDefaultValue();
};
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.trim();
if (this.comment == newValue)
return;
this.setComment(newValue);
this.fireCallback(this.commentChangedCallback);
},
enumerable: true,
configurable: true
});
Question.prototype.getComment = function () {
return this.data != null
? this.data.getComment(this.getValueName())
: 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, "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.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_1__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) {
if (fireCallback === void 0) { fireCallback = true; }
var errors = this.checkForErrors();
if (fireCallback) {
this.errors = errors;
}
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);
};
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_4__error__["c" /* AnswerRequiredError */](this.requiredErrorText));
}
};
Question.prototype.hasRequiredError = function () {
return this.isRequired && this.isEmpty();
};
Question.prototype.runValidators = function () {
return new __WEBPACK_IMPORTED_MODULE_5__validator__["a" /* ValidatorRunner */]().run(this);
};
Question.prototype.setNewValue = function (newValue) {
this.setNewValueInData(newValue);
this.onValueChanged();
};
Question.prototype.setNewValueInData = function (newValue) {
if (!this.isValueChangedInSurvey) {
newValue = this.valueToData(newValue);
this.setValueCore(newValue);
}
};
Question.prototype.getValueCore = function () {
return this.data != null
? this.data.getValue(this.getValueName())
: this.questionValue;
};
Question.prototype.setValueCore = function (newValue) {
if (this.data != null) {
this.isSettingValueInData = true;
this.data.setValue(this.getValueName(), newValue);
this.isSettingValueInData = false;
}
else {
this.questionValue = newValue;
}
};
Question.prototype.valueFromData = function (val) {
return val;
};
Question.prototype.valueToData = function (val) {
return val;
};
Question.prototype.onValueChanged = function () { };
Question.prototype.setNewComment = function (newValue) {
if (this.data != null) {
this.data.setComment(this.getValueName(), newValue);
}
else
this.questionComment = newValue;
};
//IQuestion
Question.prototype.onSurveyValueChanged = function (newValue) {
if (this.isLoadingFromJson)
return;
this.isValueChangedInSurvey = true;
this.value = this.valueFromData(newValue);
if (!this.isSettingValueInData) {
this.fireCallback(this.commentChangedCallback);
}
this.isValueChangedInSurvey = false;
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 () { };
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;
};
//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_2__base__["c" /* SurveyElement */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addClass("question", [
"!name",
{ name: "visible:boolean", default: true },
{ name: "useDisplayValuesInTitle:boolean", default: true },
"visibleIf:condition",
{ name: "width" },
{ name: "startWithNewLine:boolean", default: true },
{ 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 };
})
: [];
}
},
{ name: "title:text", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" },
{ name: "commentText", serializationProperty: "locCommentText" },
"valueName",
"enableIf:condition",
"defaultValue:value",
"correctAnswer:value",
"isRequired:boolean",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText"
},
"readOnly:boolean",
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
},
{
name: "titleLocation",
default: "default",
choices: ["default", "top", "bottom", "left", "hidden"]
}
]);
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addAlterNativeClassName("question", "questionbase");
/***/ }),
/* 9 */
/***/ (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__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* 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__, "a", function() { return CustomError; });
var AnswerRequiredError = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](AnswerRequiredError, _super);
function AnswerRequiredError(text, locOwner) {
if (text === void 0) { text = null; }
if (locOwner === void 0) { locOwner = null; }
var _this = _super.call(this, text, locOwner) || this;
_this.text = text;
return _this;
}
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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](OneAnswerRequiredError, _super);
function OneAnswerRequiredError(text, locOwner) {
if (text === void 0) { text = null; }
if (locOwner === void 0) { locOwner = null; }
var _this = _super.call(this, text, locOwner) || this;
_this.text = text;
return _this;
}
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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](RequreNumericError, _super);
function RequreNumericError(text, locOwner) {
if (text === void 0) { text = null; }
if (locOwner === void 0) { locOwner = null; }
var _this = _super.call(this, text, locOwner) || this;
_this.text = text;
return _this;
}
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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExceedSizeError, _super);
function ExceedSizeError(maxSize, locOwner) {
if (locOwner === void 0) { locOwner = null; }
var _this = _super.call(this, null, locOwner) || this;
_this.maxSize = maxSize;
_this.locText.text = _this.getText();
return _this;
}
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 CustomError = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](CustomError, _super);
function CustomError(text, locOwner) {
if (locOwner === void 0) { locOwner = null; }
var _this = _super.call(this, text, locOwner) || this;
_this.text = text;
return _this;
}
return CustomError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
/***/ }),
/* 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__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__conditionsParser__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__functionsfactory__ = __webpack_require__(36);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return Operand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return FunctionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return ExpressionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return ConditionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Condition; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ConditionNode; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return ExpressionRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConditionRunner; });
var Operand = /** @class */ (function () {
function Operand(origionalValue) {
this.origionalValue = origionalValue;
}
Operand.prototype.getValue = function (processValue) {
if (Array.isArray(this.origionalValue)) {
var res_1 = [];
for (var i = 0; i < this.origionalValue.length; i++) {
var val_1 = new Operand(this.origionalValue[i]);
res_1.push(val_1.getValue(processValue));
}
return res_1;
}
var res = this.getSimpleValue(this.origionalValue);
if (res.isSimple)
return res.value;
var val = this.removeQuotesAndEscapes(this.origionalValue);
if (processValue) {
var name = this.getValueName(val);
if (name) {
if (!processValue.hasValue(name))
return null;
val = processValue.getValue(name);
return this.getSimpleValue(val).value;
}
}
return val;
};
Object.defineProperty(Operand.prototype, "isBoolean", {
get: function () {
return this.isBooleanValue(this.origionalValue);
},
enumerable: true,
configurable: true
});
Operand.prototype.fillVariables = function (vars) {
var name = this.getValueName(this.origionalValue);
if (!!name) {
vars.push(name);
}
};
Operand.prototype.toString = function () {
var val = this.origionalValue;
if (val && (!this.isNumeric(val) && !this.isBooleanValue(val)))
val = "'" + val + "'";
return val;
};
Operand.prototype.removeQuotesAndEscapes = function (val) {
if (val.length > 0 && (val[0] == "'" || val[0] == '"'))
val = val.substr(1);
var len = val.length;
if (len > 0 && (val[len - 1] == "'" || val[len - 1] == '"'))
val = val.substr(0, len - 1);
if (val) {
val = val.replace("\\'", "'");
val = val.replace('\\"', '"');
}
return val;
};
Operand.prototype.getValueName = function (val) {
if (val.length < 3 || val[0] != "{" || val[val.length - 1] != "}")
return null;
return val.substr(1, val.length - 2);
};
Operand.prototype.isBooleanValue = function (value) {
return (value &&
(value.toLowerCase() === "true" || value.toLowerCase() === "false"));
};
Operand.prototype.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;
var val = Number(value);
if (isNaN(val))
return false;
return isFinite(val);
};
Operand.prototype.getSimpleValue = function (val) {
var res = { isSimple: false, value: val };
if (val === undefined || val === "undefined") {
res.value = null;
res.isSimple = true;
return res;
}
if (!val || typeof val != "string") {
res.isSimple = true;
return res;
}
if (this.isNumeric(val)) {
res.isSimple = true;
if (val.indexOf("0x") == 0) {
res.value = parseInt(val);
}
else {
res.value = parseFloat(val);
}
return res;
}
if (this.isBooleanValue(val)) {
res.value = val.toLowerCase() == "true";
res.isSimple = true;
return res;
}
return res;
};
return Operand;
}());
var FunctionOperand = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](FunctionOperand, _super);
function FunctionOperand(origionalValue) {
var _this = _super.call(this, origionalValue) || this;
_this.origionalValue = origionalValue;
_this.parameters = new Array();
return _this;
}
FunctionOperand.prototype.getValue = function (processValue) {
var paramValues = [];
for (var i = 0; i < this.parameters.length; i++) {
paramValues.push(this.parameters[i].getValue(processValue));
}
return __WEBPACK_IMPORTED_MODULE_3__functionsfactory__["a" /* FunctionFactory */].Instance.run(this.origionalValue, paramValues, processValue.properties);
};
FunctionOperand.prototype.fillVariables = function (vars) {
for (var i = 0; i < this.parameters.length; i++) {
this.parameters[i].fillVariables(vars);
}
};
FunctionOperand.prototype.toString = function () {
var res = this.origionalValue + "(";
for (var i = 0; i < this.parameters.length; i++) {
if (i > 0)
res += ", ";
res += this.parameters[i].toString();
}
return res;
};
return FunctionOperand;
}(Operand));
var ExpressionOperand = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExpressionOperand, _super);
function ExpressionOperand() {
return _super.call(this, null) || this;
}
ExpressionOperand.prototype.getValue = function (processValue) {
if (!this.left)
return null;
if (!this.right)
return this.left.getValue(processValue);
var l = this.left.getValue(processValue);
var r = this.right.getValue(processValue);
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(l))
l = 0;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(r))
r = 0;
if (this.operator == "+") {
return l + r;
}
if (this.operator == "-") {
return l - r;
}
if (this.operator == "*") {
return l * r;
}
if (this.operator == "^") {
return Math.pow(l, r);
}
if (this.operator == "/") {
if (!r)
return null;
return l / r;
}
if (this.operator == "%") {
if (!r)
return null;
return l % r;
}
return null;
};
ExpressionOperand.prototype.fillVariables = function (vars) {
if (!!this.left)
this.left.fillVariables(vars);
if (!!this.right)
this.right.fillVariables(vars);
};
ExpressionOperand.prototype.toString = function () {
var res = this.left ? this.left.toString() : "";
res += " " + this.operator + " ";
if (this.right)
res += this.right.toString();
return res;
};
return ExpressionOperand;
}(Operand));
var ConditionOperand = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ConditionOperand, _super);
function ConditionOperand(root) {
if (root === void 0) { root = null; }
var _this = _super.call(this, null) || this;
if (root)
_this.root = root;
return _this;
}
ConditionOperand.prototype.getValue = function (processValue) {
if (!this.root)
return false;
this.processValue = processValue;
return this.runNode(this.root);
};
ConditionOperand.prototype.fillVariables = function (vars) {
if (!!this.root) {
this.root.fillVariables(vars);
}
};
ConditionOperand.prototype.toString = function () {
return this.root ? this.root.toString() : "";
};
ConditionOperand.prototype.runNode = function (node) {
var onFirstFail = node.connective == "and";
for (var i = 0; i < node.children.length; i++) {
var res = this.runNodeCondition(node.children[i]);
if (!res && onFirstFail)
return node.isNot;
if (res && !onFirstFail)
return !node.isNot;
}
return !node.isNot ? onFirstFail : !onFirstFail;
};
ConditionOperand.prototype.runNodeCondition = function (value) {
if (value["children"])
return this.runNode(value);
if (value["left"])
return this.runCondition(value);
return false;
};
ConditionOperand.prototype.runCondition = function (condition) {
return condition.performExplicit(condition.left, condition.right, this.processValue);
};
return ConditionOperand;
}(Operand));
var Condition = /** @class */ (function () {
function Condition() {
this.opValue = "equal";
this.leftValue = null;
this.rightValue = null;
}
Object.defineProperty(Condition, "operators", {
get: function () {
if (Condition.operatorsValue != null)
return Condition.operatorsValue;
Condition.operatorsValue = {
empty: function (left, right) {
if (left == null)
return true;
return !left;
},
notempty: function (left, right) {
if (left == null)
return false;
return !!left;
},
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 Condition.operatorsValue.containsCore(left, right, true);
},
notcontains: function (left, right) {
if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
return Condition.operatorsValue.containsCore(left, right, false);
},
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 (left[i] == right)
break;
}
if (i == left.length)
return !isContains;
}
return isContains;
},
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;
}
};
return Condition.operatorsValue;
},
enumerable: true,
configurable: true
});
Condition.getOperator = function (opName) {
return Condition.operators[opName];
};
Condition.setOperator = function (opName, func) {
Condition.operators[opName] = func;
};
Condition.isCorrectOperator = function (opName) {
if (!opName)
return false;
opName = opName.toLowerCase();
return Condition.operators[opName] != undefined;
};
Condition.isNoRightOperation = function (op) {
return op == "empty" || op == "notempty";
};
Object.defineProperty(Condition.prototype, "left", {
get: function () {
return this.leftValue;
},
set: function (val) {
this.leftValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Condition.prototype, "right", {
get: function () {
return this.rightValue;
},
set: function (val) {
this.rightValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Condition.prototype, "operator", {
get: function () {
return this.opValue;
},
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (!Condition.operators[value])
return;
this.opValue = value;
},
enumerable: true,
configurable: true
});
Condition.prototype.perform = function (left, right, processValue) {
if (left === void 0) { left = null; }
if (right === void 0) { right = null; }
if (processValue === void 0) { processValue = null; }
if (!left)
left = this.left;
if (!right)
right = this.right;
return this.performExplicit(left, right, processValue);
};
Condition.prototype.performExplicit = function (left, right, processValue) {
var leftValue = left ? left.getValue(processValue) : null;
if (!right && (leftValue === true || leftValue === false))
return leftValue;
var rightValue = right ? right.getValue(processValue) : null;
return Condition.operators[this.operator](leftValue, rightValue);
};
Condition.prototype.fillVariables = function (vars) {
if (this.left)
this.left.fillVariables(vars);
if (this.right)
this.right.fillVariables(vars);
};
Condition.prototype.toString = function () {
if (!this.right || !this.operator)
return "";
var left = this.left.toString();
var res = left + " " + this.operationToString();
if (Condition.isNoRightOperation(this.operator))
return res;
var right = this.right.toString();
return res + " " + right;
};
Condition.prototype.operationToString = function () {
var op = this.operator;
if (op == "equal")
return "=";
if (op == "notequal")
return "!=";
if (op == "greater")
return ">";
if (op == "less")
return "<";
if (op == "greaterorequal")
return ">=";
if (op == "lessorequal")
return "<=";
return op;
};
Condition.operatorsValue = null;
return Condition;
}());
var ConditionNode = /** @class */ (function () {
function ConditionNode() {
this.connectiveValue = "and";
this.isNot = false;
this.children = [];
}
Object.defineProperty(ConditionNode.prototype, "connective", {
get: function () {
return this.connectiveValue;
},
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (value == "&" || value == "&&")
value = "and";
if (value == "|" || value == "||")
value = "or";
if (value != "and" && value != "or")
return;
this.connectiveValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConditionNode.prototype, "isEmpty", {
get: function () {
return this.children.length == 0;
},
enumerable: true,
configurable: true
});
ConditionNode.prototype.clear = function () {
this.children = [];
this.connective = "and";
};
ConditionNode.prototype.getVariables = function () {
var vars = [];
this.fillVariables(vars);
return vars;
};
ConditionNode.prototype.fillVariables = function (vars) {
for (var i = 0; i < this.children.length; i++) {
this.children[i].fillVariables(vars);
}
};
ConditionNode.prototype.toString = function () {
if (this.isEmpty)
return "";
var res = "";
for (var i = 0; i < this.children.length; i++) {
var child = this.children[i];
var nodeText = child.toString();
if (child.children && child.children.length > 0) {
nodeText = "(" + nodeText + ")";
}
if (nodeText) {
if (res)
res += " " + this.connective + " ";
res += nodeText;
}
}
return res;
};
return ConditionNode;
}());
var ExpressionRunner = /** @class */ (function () {
function ExpressionRunner(expression) {
this.expression = expression;
this.processValue = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]();
}
Object.defineProperty(ExpressionRunner.prototype, "expression", {
get: function () {
return this.expressionValue;
},
set: function (value) {
if (this.expression == value)
return;
this.expressionValue = value;
this.operand = new __WEBPACK_IMPORTED_MODULE_2__conditionsParser__["a" /* ConditionsParser */]().parseExpression(this.expressionValue);
},
enumerable: true,
configurable: true
});
ExpressionRunner.prototype.canRun = function () {
return !!this.operand;
};
ExpressionRunner.prototype.run = function (values, properties) {
if (properties === void 0) { properties = null; }
if (!this.operand)
return null;
this.processValue.values = values;
this.processValue.properties = properties;
return this.operand.getValue(this.processValue);
};
return ExpressionRunner;
}());
var ConditionRunner = /** @class */ (function () {
function ConditionRunner(expression) {
this.root = new ConditionNode();
this.expression = expression;
}
Object.defineProperty(ConditionRunner.prototype, "expression", {
get: function () {
return this.expressionValue;
},
set: function (value) {
if (this.expression == value)
return;
this.expressionValue = value;
new __WEBPACK_IMPORTED_MODULE_2__conditionsParser__["a" /* ConditionsParser */]().parse(this.expressionValue, this.root);
},
enumerable: true,
configurable: true
});
ConditionRunner.prototype.getVariables = function () {
return !!this.root ? this.root.getVariables() : [];
};
ConditionRunner.prototype.run = function (values, properties) {
if (properties === void 0) { properties = null; }
var condition = new ConditionOperand(this.root);
var processValue = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]();
processValue.values = values;
processValue.properties = properties;
return condition.getValue(processValue);
};
return ConditionRunner;
}());
/***/ }),
/* 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__localizablestring__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(4);
/* 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_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;
}
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 items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
var result = (_a = Array.prototype.splice).call.apply(_a, [this,
start,
deleteCount].concat(items));
if (!items)
items = [];
for (var i = 0; i < items.length; i++) {
items[i].locOwner = locOwner;
}
return result;
var _a;
};
};
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__["b" /* JsonObject */].metaData.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) {
return ItemValue.runConditionsForItemsCore(items, filteredItems, runner, values, properties, true);
};
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) {
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 = !!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;
};
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(ItemValue.Separator);
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.text;
},
set: function (newText) {
this.locText.text = newText;
},
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__["b" /* JsonObject */].metaData.getProperties(this.getType());
if (!properties || properties.length == 0) {
properties = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.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.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__["a" /* 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__["a" /* 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
});
ItemValue.Separator = "|";
return ItemValue;
}(__WEBPACK_IMPORTED_MODULE_5__base__["a" /* Base */]));
__WEBPACK_IMPORTED_MODULE_5__base__["a" /* Base */].createItemValue = function (dest) {
var item = null;
if (typeof dest.getType === "function") {
item = new ItemValue(null, undefined, dest.getType());
}
else {
item = new ItemValue(null);
}
item.setData(dest);
return item;
};
__WEBPACK_IMPORTED_MODULE_5__base__["a" /* Base */].itemValueLocStrChanged = function (arr) {
ItemValue.locStrsChanged(arr);
};
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObjectProperty */].getItemValuesDefaultValue = function (val) {
var res = new Array();
ItemValue.setData(res, val || []);
return res;
};
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.addClass("itemvalue", [
"value",
{
name: "text",
serializationProperty: "locText"
},
{ name: "visibleIf:condition", visible: false },
{ name: "enableIf:condition", visible: false }
], function (value) { return new ItemValue(value); });
/***/ }),
/* 12 */
/***/ (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",
header: "sv_header",
body: "sv_body",
footer: "sv_nav",
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",
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",
title: "sv_q_title",
description: "sv_q_description",
comment: "",
required: "",
titleRequired: "",
hasError: "",
indent: 20,
footer: "sv_q_footer"
},
panel: { title: "sv_p_title", description: "sv_p_description", container: "sv_p_container" },
error: { root: "sv_q_erbox", icon: "", item: "" },
boolean: {
root: "sv_qcbc sv_qbln",
item: "sv_q_checkbox",
label: "",
materialDecorator: "checkbox-material"
},
checkbox: {
root: "sv_qcbc sv_qcbx",
item: "sv_q_checkbox",
label: "sv_q_checkbox_label",
itemControl: "sv_q_checkbox_control_item",
controlLabel: "sv_q_checkbox_control_label",
materialDecorator: "checkbox-material",
other: "sv_q_other sv_q_checkbox_other"
},
comment: "",
dropdown: {
root: "",
control: "sv_q_dropdown_control",
selectWrapper: "sv_select_wrapper",
other: "sv_q_dd_other"
},
matrix: {
root: "sv_q_matrix",
label: "sv_q_m_label",
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: ""
},
paneldynamic: {
root: "sv_panel_dynamic",
title: "sv_p_title",
button: "",
buttonPrev: "",
buttonNext: "",
buttonAdd: "",
buttonRemove: ""
},
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",
label: "sv_q_radiogroup_label",
itemControl: "sv_q_radiogroup_control_item",
controlLabel: "",
materialDecorator: "circle",
other: "sv_q_other sv_q_radiogroup_other",
clearButton: "sv_q_radiogroup_clear"
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
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: "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"
},
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"
},
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;
/***/ }),
/* 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__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionSelectBaseImplementor; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionCheckboxBaseImplementor; });
var QuestionSelectBaseImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionSelectBaseImplementor, _super);
function QuestionSelectBaseImplementor(question) {
var _this = _super.call(this, question) || this;
_this.onCreated();
return _this;
}
QuestionSelectBaseImplementor.prototype.onCreated = function () { };
Object.defineProperty(QuestionSelectBaseImplementor.prototype, "isOtherSelected", {
get: function () {
return this.question.isOtherSelected;
},
enumerable: true,
configurable: true
});
return QuestionSelectBaseImplementor;
}(__WEBPACK_IMPORTED_MODULE_1__koquestion__["a" /* QuestionImplementor */]));
var QuestionCheckboxBaseImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckboxBaseImplementor, _super);
function QuestionCheckboxBaseImplementor(question) {
var _this = _super.call(this, question) || this;
_this.question["koAfterRender"] = _this.koAfterRender;
return _this;
}
QuestionCheckboxBaseImplementor.prototype.koAfterRender = function (el, con) {
var tEl = el[0];
if (tEl.nodeName == "#text")
tEl.data = "";
tEl = el[el.length - 1];
if (tEl.nodeName == "#text")
tEl.data = "";
};
return QuestionCheckboxBaseImplementor;
}(QuestionSelectBaseImplementor));
/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(5);
/* 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) {
if (!text)
return text;
var 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.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)
return res;
if (text &&
text.lastIndexOf(".length") > -1 &&
text.lastIndexOf(".length") === text.length - ".length".length) {
res.value = 0;
res.hasValue = true;
}
var isFirst = true;
while (text && text.length > 0) {
var isArray = !isFirst && text[0] == "[";
if (!isArray) {
if (!isFirst)
text = text.substr(1);
var curName = this.getFirstName(text);
if (!curName)
return res;
curValue = this.getObjectValue(curValue, curName);
if (__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(curValue))
return res;
text = text.substr(curName.length);
}
else {
if (!Array.isArray(curValue))
return res;
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 res;
curValue = curValue[index];
}
isFirst = false;
}
res.value = curValue;
res.hasValue = true;
return res;
};
ProcessValue.prototype.getObjectValue = function (obj, name) {
if (obj.hasOwnProperty(name))
return obj[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) {
if (key.toLowerCase() == name)
return obj[key];
}
}
return null;
};
ProcessValue.prototype.getIntValue = function (str) {
if (str == "0" || ((str | 0) > 0 && str % 1 == 0))
return Number(str);
return -1;
};
return ProcessValue;
}());
/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(2);
/* 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.calculatedText = null;
this.onGetTextCallback = null;
this.onCreating();
}
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.calculatedText = this.calText();
if (this.renderedText !== this.calculatedText) {
this.onChanged();
}
};
Object.defineProperty(LocalizableString.prototype, "text", {
get: function () {
this.renderedText =
this.calculatedText !== null ? this.calculatedText : this.calText();
this.calculatedText = null;
return this.renderedText;
},
set: function (value) {
this.setLocaleText(this.locale, value);
},
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 = LocalizableString.defaultLocale;
var res = this.values[loc];
if (!res && loc == LocalizableString.defaultLocale) {
res = this.values[__WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].defaultLocale];
}
if (!res && loc !== LocalizableString.defaultLocale) {
res = this.values[LocalizableString.defaultLocale];
}
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 Object.keys(this.values).length == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "textOrHtml", {
get: function () {
return this.hasHtml ? this.getHtmlValue() : this.text;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "renderedHtml", {
get: function () {
var res = this.textOrHtml;
return this.onRenderedHtmlCallback ? this.onRenderedHtmlCallback(res) : res;
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.getLocaleText = function (loc) {
if (!loc)
loc = LocalizableString.defaultLocale;
var res = this.values[loc];
return res ? res : "";
};
LocalizableString.prototype.setLocaleText = function (loc, value) {
if (value == this.getLocaleText(loc))
return;
if (value &&
loc &&
loc != LocalizableString.defaultLocale &&
!this.values[loc] &&
value == this.getLocaleText(LocalizableString.defaultLocale))
return;
if (!loc)
loc = LocalizableString.defaultLocale;
delete this.htmlValues[loc];
if (!value) {
if (this.values[loc])
delete this.values[loc];
}
else {
if (typeof value === "string") {
if (loc != LocalizableString.defaultLocale &&
value == this.getLocaleText(LocalizableString.defaultLocale)) {
this.setLocaleText(loc, null);
}
else {
this.values[loc] = value;
if (loc == LocalizableString.defaultLocale) {
this.deleteValuesEqualsToDefault(value);
}
}
}
}
this.strChanged();
};
LocalizableString.prototype.hasNonDefaultText = function () {
var keys = Object.keys(this.values);
if (keys.length == 0)
return false;
return keys.length > 1 || keys[0] != LocalizableString.defaultLocale;
};
LocalizableString.prototype.getJson = function () {
var keys = Object.keys(this.values);
if (keys.length == 0)
return null;
if (keys.length == 1 && keys[0] == LocalizableString.defaultLocale)
return this.values[keys[0]];
return this.values;
};
LocalizableString.prototype.setJson = function (value) {
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 (!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 text = this.text;
if (!text)
return false;
var loc = this.locale;
if (!loc)
loc = LocalizableString.defaultLocale;
this.htmlValues[loc] = this.owner.getMarkdownHtml(text);
return this.htmlValues[loc] ? true : false;
};
LocalizableString.prototype.getHtmlValue = function () {
var loc = this.locale;
if (!loc)
loc = LocalizableString.defaultLocale;
return this.htmlValues[loc];
};
LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) {
var keys = Object.keys(this.values);
for (var i = 0; i < keys.length; i++) {
if (keys[i] == LocalizableString.defaultLocale)
continue;
if (this.values[keys[i]] == defaultValue)
delete this.values[keys[i]];
}
};
LocalizableString.defaultLocale = "default";
return LocalizableString;
}());
/***/ }),
/* 16 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(10);
/* 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_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.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.getResultCallback = function (items) {
self.onLoadChoicesFromUrl(items);
};
_this.choicesByUrl.updateResultCallback = function (items, serverResult) {
if (self.survey) {
return self.survey.updateChoicesFromServer(self, items, serverResult);
}
return items;
};
return _this;
}
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.getStoreOthersAsComment()
? this.getHasOther(this.value)
: this.getHasOther(this.cachedValue);
},
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 () {
if (!this.hasOther ||
!this.getStoreOthersAsComment() ||
!this.hasUnknownValue(this.defaultValue, true)) {
_super.prototype.setDefaultValue.call(this);
}
else {
this.setDefaultValueWithOthers();
}
};
QuestionSelectBase.prototype.setDefaultValueWithOthers = function () {
this.value = this.otherItem.value;
this.comment = this.defaultValue;
};
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__["a" /* 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__["a" /* 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.valueToDataCore(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.getStoreOthersAsComment())
return _super.prototype.getComment.call(this);
return this.commentValue;
};
QuestionSelectBase.prototype.setComment = function (newValue) {
if (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.setNewValueInData(this.cachedValue);
}
this.isSettingComment = false;
}
}
};
QuestionSelectBase.prototype.setNewValue = function (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) {
if (this.getStoreOthersAsComment())
return _super.prototype.valueFromData.call(this, val);
this.cachedValue = this.valueFromDataCore(val);
return this.cachedValue;
};
QuestionSelectBase.prototype.valueToData = function (val) {
if (this.getStoreOthersAsComment())
return _super.prototype.valueToData.call(this, val);
this.cachedValue = val;
return this.valueToDataCore(val);
};
QuestionSelectBase.prototype.valueFromDataCore = function (val) {
if (!this.hasUnknownValue(val, true))
return val;
this.comment = val;
return this.otherItem.value;
};
QuestionSelectBase.prototype.valueToDataCore = 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, "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 SurveyModel.storeOthersAsComment
*/
get: function () {
return this.getPropertyValue("storeOthersAsComment", true);
},
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.
*/
get: function () {
return this.getPropertyValue("choicesOrder", "none");
},
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, "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);
}
};
/**
* 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) {
if (this.isEmpty())
return "";
return this.getChoicesDisplayValue(this.visibleChoices, this.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.choices;
},
enumerable: true,
configurable: true
});
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__["a" /* CustomError */](this.otherErrorText, this));
};
QuestionSelectBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.runChoicesByUrl();
};
QuestionSelectBase.prototype.getStoreOthersAsComment = function () {
return ((this.storeOthersAsComment &&
(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.choicesByUrl.run(processor);
};
QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) {
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;
}
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.onVisibleChoicesChanged();
if (newChoices) {
var newValue = this.updateCachedValueForUrlRequests(cachedValues);
if (newValue) {
this.value = newValue.value;
}
}
};
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) {
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]);
if (updatedValue && !this.isValueEmpty(updatedValue.value)) {
res.push(updatedValue.value);
}
}
return { value: res };
}
var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value;
return { value: value };
};
QuestionSelectBase.prototype.onVisibleChoicesChanged = function () {
if (this.isLoadingFromJson)
return;
this.updateVisibleChoices();
this.updateVisibilityBasedOnChoices();
};
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.text < b.text)
return -1 * mult;
if (a.text > b.text)
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.survey &&
this.survey.questionCountByValueName(this.getValueName()) > 1)
return;
this.clearIncorrectValuesCore();
};
QuestionSelectBase.prototype.clearDisabledValues = function () {
if (!this.survey || !this.survey.clearValueOnDisableItems)
return;
this.clearDisabledValuesCore();
};
QuestionSelectBase.prototype.clearIncorrectValuesCore = function () {
var val = this.value;
if (this.hasUnknownValue(val, true)) {
this.clearValue();
}
};
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 = "";
}
};
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_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", 1);
},
set: function (value) {
if (value < 0 || value > 5)
return;
this.setPropertyValue("colCount", value);
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
return QuestionCheckboxBase;
}(QuestionSelectBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addClass("selectbase", [
"hasComment:boolean",
"hasOther:boolean",
{
name: "choices:itemvalue[]"
},
{
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:boolean", default: true }
], null, "question");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addClass("checkboxbase", [{ name: "colCount:number", default: 1, choices: [0, 1, 2, 3, 4, 5] }], null, "selectbase");
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__martixBase__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return matrixDropdownColumnTypes; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return MatrixDropdownColumn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return MatrixDropdownCell; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownRowModelBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", 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"
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
if (!cellQuestion.optionsCaption)
cellQuestion.optionsCaption = question.optionsCaption;
}
},
checkbox: {
properties: ["choices", "choicesOrder", "choicesByUrl", "otherText"],
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"],
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"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { }
}
};
var MatrixDropdownColumn = /** @class */ (function (_super) {
__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.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();
};
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", "default");
},
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, "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.getFullTitle(this.locTitle.textOrHtml);
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.getFullTitle = function (str) {
if (!str)
str = this.name;
if (this.isRequired) {
var requireText = this.colOwner ? this.colOwner.getRequiredText() : "";
if (requireText)
requireText += " ";
str = requireText + str;
}
return str;
};
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, "validators", {
get: function () {
return this.templateQuestion.validators;
},
set: function (val) {
this.templateQuestion.validators = 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, "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 = this.calcCellQuestionType();
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 "dropdown";
};
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.locTitle.onGetTextCallback = function (text) {
return self.getFullTitle(text);
};
this.templateQuestion.onPropertyChanged.add(function () {
self.doColumnPropertiesChanged();
});
};
MatrixDropdownColumn.prototype.createNewQuestion = function (cellType) {
var question = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.createClass(cellType);
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();
new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */]().toObject(json, question);
}
};
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__["b" /* JsonObject */].metaData.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__["a" /* Base */]));
var MatrixDropdownCell = /** @class */ (function () {
function MatrixDropdownCell(column, row, data) {
var _this = this;
this.column = column;
this.row = row;
this.data = data;
this.questionValue = data.createQuestion(this.row, this.column);
this.questionValue.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) {
_this.questionValue[propertyName] = column[propertyName];
}
});
this.questionValue.updateCustomWidget();
}
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);
};
return MatrixDropdownCell;
}());
var MatrixDropdownRowModelBase = /** @class */ (function () {
function MatrixDropdownRowModelBase(data, value) {
this.rowValues = {};
this.isSettingValue = false;
this.cells = [];
this.data = data;
this.value = value;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__["a" /* TextPreProcessor */]();
var self = this;
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
for (var i = 0; i < this.data.columns.length; i++) {
if (this.getDataValueCore(this.rowValues, this.data.columns[i].name) ===
undefined) {
this.setDataValueCore(this.rowValues, this.data.columns[i].name, null);
}
}
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 valueName in this.rowValues) {
result[valueName] = this.getDataValueCore(this.rowValues, valueName);
}
return result;
},
set: function (value) {
this.isSettingValue = true;
for (var valueName in this.rowValues) {
this.deleteDataValueCore(this.rowValues, valueName);
}
if (value != null) {
for (var key in value) {
this.setDataValueCore(this.rowValues, key, value[key]);
}
}
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onSurveyValueChanged(this.getValue(this.cells[i].column.name));
}
this.isSettingValue = false;
},
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() };
};
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.setDataValueCore = function (valuesHash, key, value) {
var survey = this.getSurvey();
if (!!survey) {
survey.setDataValueCore(valuesHash, key, value);
}
else {
valuesHash[key] = value;
}
};
MatrixDropdownRowModelBase.prototype.deleteDataValueCore = function (valuesHash, key) {
var survey = this.getSurvey();
if (!!survey) {
survey.deleteDataValueCore(valuesHash, key);
}
else {
delete valuesHash[key];
}
};
MatrixDropdownRowModelBase.prototype.getValue = function (name) {
return this.getDataValueCore(this.rowValues, name);
};
MatrixDropdownRowModelBase.prototype.setValue = function (name, newValue) {
if (this.isSettingValue)
return;
if (newValue === "")
newValue = null;
if (newValue != null) {
this.setDataValueCore(this.rowValues, name, newValue);
}
else {
this.deleteDataValueCore(this.rowValues, name);
}
this.data.onRowChanged(this, name, this.value);
this.onAnyValueChanged(MatrixDropdownRowModelBase.RowVariableName);
};
MatrixDropdownRowModelBase.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_4__base__["a" /* Base */].commentPrefix);
return result ? result : "";
};
MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_4__base__["a" /* Base */].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.clearIncorrectValues = function () {
var val = this.value;
var newVal = {};
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 {
this.setValue(key, null);
}
}
};
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.runCondition = function (values, properties) {
values[MatrixDropdownRowModelBase.RowVariableName] = this.value;
values[MatrixDropdownRowModelBase.IndexVariableName] = this.rowIndex;
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].runCondition(values, properties);
}
};
MatrixDropdownRowModelBase.prototype.buildCells = function () {
var columns = this.data.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (column.isVisible) {
this.cells.push(this.createCell(column));
}
}
};
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.IndexVariableName = "rowIndex";
MatrixDropdownRowModelBase.idCounter = 1;
return MatrixDropdownRowModelBase;
}());
/**
* A base class for matrix dropdown and matrix dynamic questions.
*/
var QuestionMatrixDropdownModelBase = /** @class */ (function (_super) {
__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.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.fireCallback(self.columnsChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged(["columnLayout", "addRowLocation"], function () {
self.fireCallback(self.columnLayoutChangedCallback);
});
_this.registerFunctionOnPropertyValueChanged("cellType", function () {
self.generatedVisibleRows = null;
self.fireCallback(self.columnsChangedCallback);
});
return _this;
}
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", "horizontal");
},
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
});
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.columns[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", "dropdown");
},
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) {
if (!this.generatedVisibleRows)
return;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
for (var j = 0; j < row.cells.length; j++) {
if (row.cells[j].column !== column)
continue;
column.updateCellQuestion(row.cells[j].question, row);
break;
}
}
};
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();
}
};
QuestionMatrixDropdownModelBase.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runCellsCondition(values, properties);
};
QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values, properties) {
if (!this.generatedVisibleRows)
return;
var newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
newValues["row"] = {};
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].runCondition(newValues, properties);
}
};
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();
}
};
/**
* 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.columnsValue.push(column);
return column;
};
QuestionMatrixDropdownModelBase.prototype.getVisibleRows = function () {
var _this = this;
if (this.isLoadingFromJson)
return;
if (!this.generatedVisibleRows) {
this.generatedVisibleRows = this.generateRows();
this.generatedVisibleRows.forEach(function (row) { return _this.onMatrixRowCreated(row); });
if (this.data) {
var properties = { survey: this.survey };
this.runCellsCondition(this.data.getAllValues(), properties);
}
}
return this.generatedVisibleRows;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "showHeader", {
/**
* Set this property to false, to hide table header. The default value is true.
*/
get: function () {
return this.getPropertyValue("showHeader", true);
},
set: function (val) {
this.setPropertyValue("showHeader", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.updateColumnsIndexes(this.columns);
this.generatedVisibleRows = null;
};
/**
* 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(this.value);
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);
this.onValueChanged();
};
QuestionMatrixDropdownModelBase.prototype.generateRows = function () {
return null;
};
QuestionMatrixDropdownModelBase.prototype.createNewValue = function (curValue) {
return !curValue ? {} : curValue;
};
QuestionMatrixDropdownModelBase.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
var result = questionValue[row.rowName] ? questionValue[row.rowName] : null;
if (!result && create) {
result = {};
questionValue[row.rowName] = result;
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.getRowDisplayValue = function (row, rowValue) {
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
if (rowValue[column.name]) {
rowValue[column.name] = row.cells[i].question.displayValue;
}
}
return rowValue;
};
QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) { };
QuestionMatrixDropdownModelBase.prototype.onValueChanged = function () {
if (this.isRowChanging)
return;
this.onBeforeValueChanged(this.value);
if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.createNewValue(this.value);
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.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.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var errosInColumns = this.hasErrorInColumns(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInColumns;
};
QuestionMatrixDropdownModelBase.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
var rows = this.generatedVisibleRows;
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) {
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;
res =
(question && question.visible && 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;
};
//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) {
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);
}
this.isDoingonAnyValueChanged = false;
};
QuestionMatrixDropdownModelBase.prototype.isObject = function (value) {
return value !== null && typeof value === "object";
};
QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = 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
};
this.survey.matrixCellValueChanged(this, options);
};
QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) {
if (!this.survey)
return;
var self = this;
var options = {
row: row,
columnName: columnName,
rowValue: rowValue,
value: rowValue[columnName]
};
return this.survey.matrixCellValidate(this, options);
};
QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue) {
var oldValue = this.createNewValue(this.value);
if (this.isMatrixValueEmpty(oldValue))
oldValue = null;
var newValue = this.createNewValue(this.value);
var rowValue = this.getRowValueCore(row, newValue, true);
if (!rowValue)
rowValue = {};
for (var key in rowValue)
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);
}
if (this.isTwoValueEquals(oldValue, newValue))
return;
this.isRowChanging = true;
this.setNewValue(newValue);
this.isRowChanging = false;
if (columnName) {
this.onCellValueChanged(row, columnName, rowValue);
}
};
QuestionMatrixDropdownModelBase.prototype.getRowIndex = function (row) {
return this.visibleRows.indexOf(row);
};
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__["b" /* JsonObject */].metaData.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",
"visibleIf:condition",
"enableIf:condition",
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
}
], function () {
return new MatrixDropdownColumn("");
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.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",
{ name: "showHeader:boolean", default: true }
], function () {
return new QuestionMatrixDropdownModelBase("");
}, "matrixbase");
/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* 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() {
this.hasAllValuesOnLastRunValue = false;
}
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 (!textValue.value) {
this.hasAllValuesOnLastRunValue = false;
}
var replacedValue = !!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;
}());
/***/ }),
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_knockout__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ImplementorBase; });
var ImplementorBase = /** @class */ (function () {
function ImplementorBase(element) {
this.element = element;
element.iteratePropertiesHash(function (hash, key) {
ImplementorBase.doIterateProperties(hash, key);
});
element.getPropertyValueCoreHandler = function (hash, key) {
if (hash[key] === undefined) {
hash[key] = __WEBPACK_IMPORTED_MODULE_0_knockout__["observable"]();
}
return __WEBPACK_IMPORTED_MODULE_0_knockout__["unwrap"](hash[key]);
};
element.setPropertyValueCoreHandler = function (hash, key, val) {
return hash[key] !== undefined
? hash[key](val)
: (hash[key] = __WEBPACK_IMPORTED_MODULE_0_knockout__["observable"](val));
};
}
ImplementorBase.doIterateProperties = function (hash, key) {
var val = hash[key];
if (Array.isArray(val)) {
hash[key] = __WEBPACK_IMPORTED_MODULE_0_knockout__["observableArray"](val);
val["onArrayChanged"] = function () { return hash[key].notifySubscribers(); };
}
else {
hash[key] = __WEBPACK_IMPORTED_MODULE_0_knockout__["observable"](val);
}
};
return ImplementorBase;
}());
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__kopage__ = __webpack_require__(23);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__templateText__ = __webpack_require__(32);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__questionCustomWidgets__ = __webpack_require__(25);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localizablestring__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__kobase__ = __webpack_require__(19);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Survey; });
__WEBPACK_IMPORTED_MODULE_7__questionCustomWidgets__["a" /* CustomWidgetCollection */].Instance.onCustomWidgetAdded.add(function (customWidget) {
if (customWidget.widgetJson.isDefaultRender)
return;
if (!customWidget.htmlTemplate)
customWidget.htmlTemplate =
"
'htmlTemplate' attribute is missed.
";
new __WEBPACK_IMPORTED_MODULE_6__templateText__["a" /* SurveyTemplateText */]().replaceText(customWidget.htmlTemplate, "widget", customWidget.name);
});
var Survey = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Survey, _super);
function Survey(jsonObj, renderedElement, css) {
if (jsonObj === void 0) { jsonObj = null; }
if (renderedElement === void 0) { renderedElement = null; }
if (css === void 0) { css = null; }
var _this = _super.call(this, jsonObj) || this;
//TODO remove it, since there is onAfterRenderSurvey
_this.onRendered = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* Event */]();
_this.isFirstRender = true;
_this.mouseDownPage = null;
_this.koIsNavigationButtonsShowing = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](true);
new __WEBPACK_IMPORTED_MODULE_10__kobase__["a" /* ImplementorBase */](_this);
if (typeof __WEBPACK_IMPORTED_MODULE_1_knockout__ === "undefined")
throw new Error("knockoutjs library is not loaded.");
var self = _this;
// this.iterateDataValuesHash((hash: any, key: string) => {
// var val = hash[key];
// if (!ko.isWriteableObservable(val)) {
// hash[key] = ko.observable(val);
// }
// });
if (css) {
_this.css = css;
}
if (renderedElement) {
_this.renderedElement = renderedElement;
}
_this.registerFunctionOnPropertyValueChanged("timeSpent", function () {
self.onTimeSpentChanged();
});
_this.render(renderedElement);
return _this;
}
Object.defineProperty(Survey, "cssType", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__["b" /* surveyCss */].currentType;
},
set: function (value) {
__WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__["b" /* surveyCss */].currentType = value;
},
enumerable: true,
configurable: true
});
Survey.prototype.getDataValueCore = function (valuesHash, key) {
if (valuesHash[key] === undefined) {
valuesHash[key] = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]();
}
return __WEBPACK_IMPORTED_MODULE_1_knockout__["unwrap"](valuesHash[key]);
};
Survey.prototype.setDataValueCore = function (valuesHash, key, value) {
if (__WEBPACK_IMPORTED_MODULE_1_knockout__["isWriteableObservable"](valuesHash[key])) {
valuesHash[key](value);
}
else {
valuesHash[key] = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](value);
// if (Array.isArray(value)) {
// valuesHash[key] = ko.observableArray(value);
// (value)["onArrayChanged"] = () =>
// valuesHash[key].notifySubscribers();
// } else {
// valuesHash[key] = ko.observable(value);
// }
}
};
Survey.prototype.deleteDataValueCore = function (valuesHash, key) {
if (__WEBPACK_IMPORTED_MODULE_1_knockout__["isWriteableObservable"](valuesHash[key])) {
valuesHash[key](undefined);
}
else {
delete valuesHash[key];
}
};
Survey.prototype.nextPageUIClick = function () {
if (!!this.mouseDownPage && this.mouseDownPage !== this.currentPage)
return;
this.mouseDownPage = null;
this.nextPage();
};
Survey.prototype.nextPageMouseDown = function () {
this.mouseDownPage = this.currentPage;
var el = document.activeElement;
if (!!el && !!el.blur)
el.blur();
};
Object.defineProperty(Survey.prototype, "cssNavigationComplete", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.complete);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Survey.prototype, "cssNavigationPrev", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.prev);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Survey.prototype, "cssNavigationStart", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.start);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Survey.prototype, "cssNavigationNext", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.next);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Survey.prototype, "completedCss", {
get: function () {
var css = __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__["b" /* surveyCss */].getCss();
return css.body + " " + css.completedPage;
},
enumerable: true,
configurable: true
});
Survey.prototype.getNavigationCss = function (main, btn) {
var res = "";
if (main)
res = main;
if (btn)
res += " " + btn;
return res;
};
Object.defineProperty(Survey.prototype, "css", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__["b" /* surveyCss */].getCss();
},
set: function (value) {
this.mergeValues(value, this.css);
},
enumerable: true,
configurable: true
});
Survey.prototype.render = function (element) {
if (element === void 0) { element = null; }
this.updateKoCurrentPage();
this.updateCustomWidgets(this.currentPage);
var self = this;
if (element && typeof element == "string") {
element = document.getElementById(element);
}
if (element) {
this.renderedElement = element;
}
element = this.renderedElement;
if (!element)
return;
element.innerHTML = this.getHtmlTemplate();
self.startTimerFromUI();
self.applyBinding();
};
Survey.prototype.clear = function (clearData, gotoFirstPage) {
if (clearData === void 0) { clearData = true; }
if (gotoFirstPage === void 0) { gotoFirstPage = true; }
_super.prototype.clear.call(this, clearData, gotoFirstPage);
this.render();
};
Survey.prototype.onLocaleChanged = function () {
this.render();
};
Survey.prototype.koEventAfterRender = function (element, survey) {
survey.onRendered.fire(self, {});
survey.afterRenderSurvey(element);
};
Survey.prototype.loadSurveyFromService = function (surveyId, clientId, renderedElement) {
if (surveyId === void 0) { surveyId = null; }
if (clientId === void 0) { clientId = null; }
if (renderedElement === void 0) { renderedElement = null; }
if (renderedElement) {
this.renderedElement = renderedElement;
}
_super.prototype.loadSurveyFromService.call(this, surveyId, clientId);
};
Survey.prototype.setCompleted = function () {
_super.prototype.setCompleted.call(this);
this.updateKoCurrentPage();
};
Survey.prototype.propertyValueChanged = function (name, oldValue, newValue) {
_super.prototype.propertyValueChanged.call(this, name, oldValue, newValue);
if (this.isLoadingFromJson)
return;
if (name === "showNavigationButtons") {
this.koIsNavigationButtonsShowing(this.isNavigationButtonsShowing);
}
};
Survey.prototype.start = function () {
_super.prototype.start.call(this);
this.updateKoCurrentPage();
};
Survey.prototype.createNewPage = function (name) {
return new __WEBPACK_IMPORTED_MODULE_4__kopage__["b" /* Page */](name);
};
Survey.prototype.getHtmlTemplate = function () {
return __WEBPACK_IMPORTED_MODULE_6__templateText__["b" /* koTemplate */];
};
Survey.prototype.onBeforeCreating = function () {
var _this = this;
var self = this;
this.dummyObservable = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
this.koCurrentPage = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](this.currentPage);
this.koIsNavigationButtonsShowing = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](this.isNavigationButtonsShowing);
__WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
_this.dummyObservable();
_this.koIsNavigationButtonsShowing(_this.isNavigationButtonsShowing);
});
this.koIsFirstPage = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
_this.dummyObservable();
return _this.isFirstPage;
});
this.koIsLastPage = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
_this.dummyObservable();
return _this.isLastPage;
});
this.koProgressText = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
_this.dummyObservable();
return _this.progressText;
});
this.koProgress = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
_this.dummyObservable();
return _this.getProgress();
});
this.koState = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](this.state);
this.koCompletedState = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("");
this.koCompletedStateText = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("");
this.koCompletedStateCss = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("");
this.koTimerInfoText = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](this.timerInfoText);
this.koAfterRenderPage = function (elements, con) {
var el = __WEBPACK_IMPORTED_MODULE_3__base__["c" /* SurveyElement */].GetFirstNonTextElement(elements);
if (el)
self.afterRenderPage(el);
};
};
Survey.prototype.currentPageChanged = function (newValue, oldValue) {
this.updateKoCurrentPage();
_super.prototype.currentPageChanged.call(this, newValue, oldValue);
if (!this.isDesignMode)
this.scrollToTopOnPageChange();
};
Survey.prototype.pageVisibilityChanged = function (page, newValue) {
_super.prototype.pageVisibilityChanged.call(this, page, newValue);
this.updateKoCurrentPage();
};
Survey.prototype.onLoadSurveyFromService = function () {
this.render();
};
Survey.prototype.onLoadingSurveyFromService = function () {
this.render();
};
Survey.prototype.setCompletedState = function (value, text) {
_super.prototype.setCompletedState.call(this, value, text);
this.koCompletedState(this.completedState);
this.koCompletedStateText(this.completedStateText);
this.koCompletedStateCss(this.completedState !== "" ? this.css.saveData[this.completedState] : "");
};
Survey.prototype.onTimeSpentChanged = function () {
this.koTimerInfoText(this.timerInfoText);
};
Survey.prototype.applyBinding = function () {
if (!this.renderedElement)
return;
this.updateKoCurrentPage();
__WEBPACK_IMPORTED_MODULE_1_knockout__["cleanNode"](this.renderedElement);
if (!this.isFirstRender) {
this.updateCurrentPageQuestions();
}
this.isFirstRender = false;
__WEBPACK_IMPORTED_MODULE_1_knockout__["applyBindings"](this, this.renderedElement);
};
Survey.prototype.updateKoCurrentPage = function () {
if (this.isLoadingFromJson)
return;
this.dummyObservable(this.dummyObservable() + 1);
if (this.currentPage !== this.koCurrentPage()) {
this.koCurrentPage(this.currentPage);
}
this.koState(this.state);
};
Survey.prototype.updateCurrentPageQuestions = function () {
var questions = this.currentPage ? this.currentPage.questions : [];
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
if (q.visible)
q["updateQuestion"]();
}
};
return Survey;
}(__WEBPACK_IMPORTED_MODULE_2__survey__["a" /* SurveyModel */]));
__WEBPACK_IMPORTED_MODULE_8__localizablestring__["a" /* LocalizableString */].prototype["onCreating"] = function () {
var self = this;
this.koReRender = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
this.koRenderedHtml = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koReRender();
return self.renderedHtml;
});
};
__WEBPACK_IMPORTED_MODULE_9__itemvalue__["a" /* ItemValue */].prototype["onCreating"] = function () {
new __WEBPACK_IMPORTED_MODULE_10__kobase__["a" /* ImplementorBase */](this);
};
__WEBPACK_IMPORTED_MODULE_8__localizablestring__["a" /* LocalizableString */].prototype["onChanged"] = function () {
this.koReRender(this.koReRender() + 1);
};
__WEBPACK_IMPORTED_MODULE_1_knockout__["components"].register("survey", {
viewModel: {
createViewModel: function (params, componentInfo) {
var survey = __WEBPACK_IMPORTED_MODULE_1_knockout__["unwrap"](params.survey);
survey.render();
return params.survey;
}
},
template: __WEBPACK_IMPORTED_MODULE_6__templateText__["b" /* koTemplate */]
});
__WEBPACK_IMPORTED_MODULE_1_knockout__["bindingHandlers"]["surveyProp"] = {
update: function (element, valueAccessor, allBindingsAccessor) {
var value = __WEBPACK_IMPORTED_MODULE_1_knockout__["utils"].unwrapObservable(valueAccessor()) || {};
for (var propName in value) {
if (typeof propName == "string") {
var propValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["utils"].unwrapObservable(value[propName]);
element[propName] = propValue;
}
}
}
};
__WEBPACK_IMPORTED_MODULE_2__survey__["a" /* SurveyModel */].platform = "knockout";
/***/ }),
/* 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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __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_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
});
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.getVisibleCount();
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 ? q.width : (100 / visCount).toFixed(6) + "%";
q.rightIndent = counter < visCount - 1 ? 1 : 0;
counter++;
}
else {
this.elements[i].renderWidth = "";
}
}
};
QuestionRowModel.prototype.getVisibleCount = function () {
var res = 0;
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].isVisible)
res++;
}
return res;
};
QuestionRowModel.prototype.calcVisible = function () {
return this.getVisibleCount() > 0;
};
return QuestionRowModel;
}(__WEBPACK_IMPORTED_MODULE_2__base__["a" /* Base */]));
/**
* A base class for a Panel and Page objects.
*/
var PanelModelBase = /** @class */ (function (_super) {
__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.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 = { error: {} };
this.copyCssClasses(classes, this.css);
this.copyCssClasses(classes.error, this.css.error);
if (this.survey) {
this.survey.updatePanelCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "css", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__["b" /* surveyCss */].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;
};
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;
data[q.getValueName()] = q["value"];
}
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();
}
};
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 focuseOnFirstError set it to true to focuse on the first question that doesn't pass the validation
*/
PanelModelBase.prototype.hasErrors = function (fireCallback, focuseOnFirstError) {
if (fireCallback === void 0) { fireCallback = true; }
if (focuseOnFirstError === void 0) { focuseOnFirstError = false; }
var rec = {
fireCallback: fireCallback,
focuseOnFirstError: focuseOnFirstError,
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;
}
};
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_6__error__["b" /* OneAnswerRequiredError */](this.requiredErrorText));
if (!rec.firstErrorQuestion) {
rec.firstErrorQuestion = visQuestions[0];
}
};
PanelModelBase.prototype.hasErrorsCore = function (rec) {
for (var i = 0; i < this.elements.length; i++) {
if (!this.elements[i].isVisible)
continue;
if (this.elements[i].isPanel) {
this.elements[i].hasErrorsCore(rec);
}
else {
var question = this.elements[i];
if (question.isReadOnly)
continue;
if (question.hasErrors(rec.fireCallback)) {
if (rec.focuseOnFirstError && rec.firstErrorQuestion == null) {
rec.firstErrorQuestion = question;
}
rec.result = true;
}
}
}
this.hasErrorsInPanels(rec);
};
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;
};
/**
* 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", "default");
},
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";
};
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.buildRows = function () {
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.isLoadingFromJson)
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.isLoadingFromJson)
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
});
Object.defineProperty(PanelModelBase.prototype, "readOnly", {
/**
* Set it to true to make a 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);
},
enumerable: true,
configurable: true
});
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 elememnt into Panel or Page.
* @param element
* @param index element index in the elements array
*/
PanelModelBase.prototype.addElement = function (element, index) {
if (index === void 0) { index = -1; }
if (element == null)
return;
if (index < 0 || index >= this.elements.length) {
this.elements.push(element);
}
else {
this.elements.splice(index, 0, element);
}
};
/**
* Add a question into Panel or Page.
* @param question
* @param index element index in the elements array
*/
PanelModelBase.prototype.addQuestion = function (question, index) {
if (index === void 0) { index = -1; }
this.addElement(question, index);
};
/**
* Add a panel into Panel or Page.
* @param panel
* @param index element index in the elements array
*/
PanelModelBase.prototype.addPanel = function (panel, index) {
if (index === void 0) { index = -1; }
this.addElement(panel, index);
};
/**
* Creates a new question and adds it into the end of the elements list.
* @param questionType the possible values are: "text", "checkbox", "dropdown", "matrix", "html", "matrixdynamic", "matrixdropdown" and so on.
* @param name a question name
*/
PanelModelBase.prototype.addNewQuestion = function (questionType, name) {
if (name === void 0) { name = null; }
var question = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.createQuestion(questionType, name);
this.addQuestion(question);
return question;
};
/**
* Creates a new panel and adds it into the end of the elements list.
* @param name a panel name
*/
PanelModelBase.prototype.addNewPanel = function (name) {
if (name === void 0) { name = null; }
var panel = this.createNewPanel(name);
this.addPanel(panel);
return panel;
};
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) {
if (!this.visibleIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["a" /* ConditionRunner */](this.visibleIf);
this.visible = conditionRunner.run(values, properties);
};
PanelModelBase.prototype.runEnableCondition = function (values, properties) {
if (!this.enableIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["a" /* ConditionRunner */](this.enableIf);
this.readOnly = !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.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.panelCounter = 100;
return PanelModelBase;
}(__WEBPACK_IMPORTED_MODULE_2__base__["c" /* 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_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
});
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", "default");
},
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";
};
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__["b" /* JsonObject */].metaData.addClass("panelbase", [
"name",
{
name: "elements",
alternativeName: "questions",
baseClassName: "question",
visible: false
},
{ name: "visible:boolean", default: true },
"visibleIf:condition",
"enableIf:condition",
"readOnly:boolean",
{
name: "questionTitleLocation",
default: "default",
choices: ["default", "top", "bottom", "left", "hidden"]
},
{ name: "title:text", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" }
], function () {
return new PanelModelBase();
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.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");
/***/ }),
/* 22 */
/***/ (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__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return ValidatorResult; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return SurveyValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ValidatorRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return NumericValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return TextValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return AnswerCountValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return RegexValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return EmailValidator; });
/* unused harmony export 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_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) {
if (name === void 0) { name = null; }
return null;
};
SurveyValidator.prototype.validateAllValues = function (value, values, properties, name) {
if (name === void 0) { name = null; }
return null;
};
SurveyValidator.prototype.getLocale = function () {
return this.locOwner ? this.locOwner.getLocale() : "";
};
SurveyValidator.prototype.getMarkdownHtml = function (text) {
return this.locOwner ? this.locOwner.getMarkdownHtml(text) : null;
};
SurveyValidator.prototype.getProcessedText = function (text) {
return this.locOwner ? this.locOwner.getProcessedText(text) : text;
};
SurveyValidator.prototype.createCustomError = function (name) {
return new __WEBPACK_IMPORTED_MODULE_2__error__["a" /* CustomError */](this.getErrorText(name), this.locOwner);
};
return SurveyValidator;
}(__WEBPACK_IMPORTED_MODULE_1__base__["a" /* Base */]));
var ValidatorRunner = /** @class */ (function () {
function ValidatorRunner() {
}
ValidatorRunner.prototype.run = function (owner) {
var res = [];
for (var i = 0; i < owner.validators.length; i++) {
var validatorResult = null;
var validator = owner.validators[i];
if (!validator.isValidateAllValues) {
validatorResult = validator.validate(owner.validatedValue, owner.getValidatorTitle());
}
else {
validatorResult = validator.validateAllValues(owner.validatedValue, owner.getDataFilteredValues(), owner.getDataFilteredProperties(), owner.getValidatorTitle());
}
if (!!validatorResult && !!validatorResult.error) {
res.push(validatorResult.error);
}
}
return res;
};
return ValidatorRunner;
}());
/**
* Validate numeric values.
*/
var NumericValidator = /** @class */ (function (_super) {
__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) {
if (name === void 0) { name = null; }
if (__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
if (!this.isNumber(value)) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["d" /* RequreNumericError */]());
}
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);
}
};
NumericValidator.prototype.isNumber = function (value) {
return !isNaN(parseFloat(value)) && isFinite(value);
};
return NumericValidator;
}(SurveyValidator));
/**
* Validate text values
*/
var TextValidator = /** @class */ (function (_super) {
__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) {
if (name === void 0) { name = 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_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) {
if (name === void 0) { name = 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_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) {
if (name === void 0) { name = null; }
if (!this.regex || !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_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) {
if (name === void 0) { name = 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExpressionValidator, _super);
function ExpressionValidator() {
var _this = _super.call(this) || this;
_this.conditionRunner = null;
return _this;
}
ExpressionValidator.prototype.getType = function () {
return "expressionvalidator";
};
Object.defineProperty(ExpressionValidator.prototype, "isValidateAllValues", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
ExpressionValidator.prototype.validateAllValues = function (value, values, properties, name) {
if (name === void 0) { name = null; }
if (!this.expression)
return null;
if (!this.conditionRunner) {
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ConditionRunner */](this.expression);
}
this.conditionRunner.expression = this.expression;
var res = this.conditionRunner.run(values, properties);
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);
};
return ExpressionValidator;
}(SurveyValidator));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("surveyvalidator", [
{ name: "text", serializationProperty: "locText" }
]);
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () {
return new NumericValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("textvalidator", ["minLength:number", "maxLength:number", "allowDigits:boolean"], function () {
return new TextValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () {
return new AnswerCountValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("regexvalidator", ["regex"], function () {
return new RegexValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("emailvalidator", [], function () {
return new EmailValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.addClass("expressionvalidator", ["expression:condition"], function () {
return new ExpressionValidator();
}, "surveyvalidator");
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__page__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__kobase__ = __webpack_require__(19);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRow; });
/* unused harmony export PanelImplementorBase */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Panel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Page; });
var QuestionRow = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRow, _super);
function QuestionRow(panel) {
var _this = _super.call(this, panel) || this;
_this.panel = panel;
new __WEBPACK_IMPORTED_MODULE_7__kobase__["a" /* ImplementorBase */](_this);
var self = _this;
_this.koGetType = function (el) {
return self.getElementType(el);
};
_this.koElementAfterRender = function (el, con) {
return self.elementAfterRender(el, con);
};
return _this;
}
QuestionRow.prototype.getElementType = function (el) {
return el.isPanel ? "survey-panel" : "survey-question";
};
QuestionRow.prototype.koAfterRender = function (el, con) {
for (var i = 0; i < el.length; i++) {
var tEl = el[i];
var nName = tEl.nodeName;
if (nName == "#text")
tEl.data = "";
}
};
QuestionRow.prototype.elementAfterRender = function (elements, con) {
if (!this.panel || !this.panel.survey)
return;
var el = __WEBPACK_IMPORTED_MODULE_5__base__["c" /* SurveyElement */].GetFirstNonTextElement(elements);
if (!el)
return;
var element = con;
if (element.isPanel) {
this.panel.survey.afterRenderPanel(con, el);
}
else {
this.panel.survey.afterRenderQuestion(con, el);
}
};
return QuestionRow;
}(__WEBPACK_IMPORTED_MODULE_3__panel__["d" /* QuestionRowModel */]));
var PanelImplementorBase = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](PanelImplementorBase, _super);
function PanelImplementorBase(panel) {
var _this = _super.call(this, panel) || this;
_this.panel = panel;
return _this;
}
return PanelImplementorBase;
}(__WEBPACK_IMPORTED_MODULE_7__kobase__["a" /* ImplementorBase */]));
var Panel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Panel, _super);
function Panel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
new PanelImplementorBase(_this);
_this.onCreating();
var self = _this;
_this.koElementType = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("survey-panel");
_this.koCss = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
return self.cssClasses;
});
_this.koIsCollapsed = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.isCollapsed);
_this.koIsExpanded = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.isExpanded);
_this.stateChangedCallback = function () {
self.onStateChanged();
};
_this.doExpand = function () {
self.changeExpanded();
};
return _this;
}
Panel.prototype.createRow = function () {
return new QuestionRow(this);
};
Panel.prototype.onCreating = function () { };
Panel.prototype.onNumChanged = function (value) {
this.locTitle.onChanged();
};
Panel.prototype.onStateChanged = function () {
this.koIsCollapsed(this.isCollapsed);
this.koIsExpanded(this.isExpanded);
};
Panel.prototype.changeExpanded = function () {
if (!this.isCollapsed && !this.isExpanded)
return;
if (this.isCollapsed) {
this.expand();
}
else {
this.collapse();
}
};
Panel.prototype.getTitleStyle = function () {
var result = this.cssClasses.panel.title;
if (this.koIsCollapsed() || this.koIsExpanded()) {
result += " sv_p_title_expandable";
}
return result;
};
Panel.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.onStateChanged();
};
return Panel;
}(__WEBPACK_IMPORTED_MODULE_3__panel__["c" /* PanelModel */]));
var Page = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Page, _super);
function Page(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
new PanelImplementorBase(_this);
_this.onCreating();
return _this;
}
Page.prototype.createRow = function () {
return new QuestionRow(this);
};
Page.prototype.createNewPanel = function (name) {
return new Panel(name);
};
Page.prototype.onCreating = function () { };
Page.prototype.onNumChanged = function (value) {
this.locTitle.onChanged();
};
return Page;
}(__WEBPACK_IMPORTED_MODULE_2__page__["a" /* PageModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("panel", function () {
return new Panel();
});
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("page", function () {
return new Page();
});
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["b" /* ElementFactory */].Instance.registerElement("panel", function (name) {
return new Panel(name);
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__panel__ = __webpack_require__(21);
/* 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_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;
var self = _this;
_this.locTitle.onRenderedHtmlCallback = 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.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
});
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", "inherit");
},
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", "default");
},
set: function (val) {
this.setPropertyValue("questionsOrder", val);
},
enumerable: true,
configurable: true
});
/**
* Call it to focus the input on the first question
*/
PageModel.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.
*/
PageModel.prototype.focusFirstErrorQuestion = function () {
var q = this.getFirstQuestionToFocus(true);
if (!!q) {
q.focus();
}
};
/**
* Call it to scroll to the page top.
*/
PageModel.prototype.scrollToTop = function () {
__WEBPACK_IMPORTED_MODULE_3__base__["c" /* SurveyElement */].ScrollElementToTop(this.id);
};
Object.defineProperty(PageModel.prototype, "timeSpent", {
/**
* Time in seconds end-user spent on this page
*/
get: function () {
return this.getPropertyValue("timeSpent", 0);
},
set: function (val) {
this.setPropertyValue("timeSpent", val);
},
enumerable: true,
configurable: true
});
/**
* 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;
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.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);
if (!isCancel) {
var targetIndex = this.dragDropGetElementIndex(target, row);
var src = this.dragDropInfo.source;
if (!!src && !!src.parent) {
var srcIndex = src.parent.elements.indexOf(src);
if (!!row && row.panel == src.parent && targetIndex > srcIndex) {
targetIndex--;
}
if (!!row) {
src.parent.removeElement(src);
}
}
this.updateRowsRemoveElementFromRow(target, row);
if (!!row && targetIndex > -1) {
row.panel.addElement(target, targetIndex);
}
}
else {
this.updateRowsRemoveElementFromRow(target, row);
}
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__["b" /* JsonObject */].metaData.addClass("page", [
{
name: "navigationButtonsVisibility",
default: "inherit",
choices: ["inherit", "show", "hide"]
},
{
name: "questionsOrder",
default: "default",
choices: ["default", "initial", "random"]
},
{ name: "maxTimeToFinish:number", default: 0 }
], function () {
return new PageModel();
}, "panelbase");
/***/ }),
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionCustomWidget; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", 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) {
if (this.widgetJson.getDisplayValue)
return this.widgetJson.getDisplayValue(question);
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
});
return QuestionCustomWidget;
}());
var CustomWidgetCollection = /** @class */ (function () {
function CustomWidgetCollection() {
this.widgetsValues = [];
this.widgetsActivatedBy = {};
this.onCustomWidgetAdded = new __WEBPACK_IMPORTED_MODULE_0__base__["b" /* 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;
}());
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdownModel; });
/**
* A Model for a dropdown question
*/
var QuestionDropdownModel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionDropdownModel, _super);
function QuestionDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("optionsCaption", _this);
return _this;
}
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";
};
QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
return QuestionDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["b" /* QuestionSelectBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addClass("dropdown", [{ name: "optionsCaption", serializationProperty: "locOptionsCaption" }], 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;
});
/***/ }),
/* 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__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__validator__ = __webpack_require__(22);
/* 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_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.getType = function () {
return "text";
};
Object.defineProperty(QuestionTextModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () {
return this.getPropertyValue("inputType", "text");
},
set: function (val) {
val = val.toLowerCase();
if (val == "datetime_local")
val = "datetime-local";
this.setPropertyValue("inputType", val.toLowerCase());
if (!this.isLoadingFromJson &&
val === "email" &&
!this.validators.some(function (v) { return v.getType() === "emailvalidator"; })) {
this.validators.push(new __WEBPACK_IMPORTED_MODULE_5__validator__["b" /* EmailValidator */]());
}
},
enumerable: true,
configurable: 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", -1);
},
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", 25);
},
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 this.isNumber(newValue) ? parseFloat(newValue) : "";
}
return newValue;
};
QuestionTextModel.prototype.isNumber = function (value) {
return !isNaN(parseFloat(value)) && isFinite(value);
};
return QuestionTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.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);
});
/***/ }),
/* 28 */
/***/ (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__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__page__ = __webpack_require__(24);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__dxSurveyService__ = __webpack_require__(35);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__stylesmanager__ = __webpack_require__(55);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__surveytimer__ = __webpack_require__(57);
/* 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_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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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.value a new value. You may change it
* @see setValue
* @see onValueChanged
*/
_this.onValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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
*/
_this.onValidateQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* 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__["b" /* 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__["b" /* Event */]();
_this.onProcessHtml = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* Event */]();
/**
* The event is fired on uploading the file in QuestionFile. 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 uploadFile
*/
_this.onUploadFiles = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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 onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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__["b" /* 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.
* @see Question.value
* @see Question.correctAnswer
*/
_this.onIsAnswerCorrect = new __WEBPACK_IMPORTED_MODULE_3__base__["b" /* 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__["b" /* 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.questionTitleTemplateCache = undefined;
_this.conditionVersion = 0;
_this.origionalPages = null;
_this.isEndLoadingFromJson = null;
_this.questionHashes = {
names: {},
namesInsensitive: {},
valueNames: {},
valueNamesInsensitive: {}
};
_this.timerFunc = null;
var self = _this;
_this.createLocalizableString("title", _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_5__textPreProcessor__["a" /* TextPreProcessor */]();
_this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
_this.pagesValue = _this.createNewArray("pages", function (value) {
self.doOnPageAdded(value);
});
_this.triggersValue = _this.createNewArray("triggers", function (value) {
value.setOwner(self);
});
_this.registerFunctionOnPropertyValueChanged("questionTitleTemplate", function () {
self.questionTitleTemplateCache = undefined;
});
_this.registerFunctionOnPropertyValueChanged("firstPageIsStarted", function () {
self.onFirstPageIsStartedChanged();
});
_this.registerFunctionOnPropertyValueChanged("isSinglePage", function () {
self.onIsSinglePageChanged();
});
_this.onBeforeCreating();
if (jsonObj) {
if (typeof jsonObj === "string" || jsonObj instanceof String) {
jsonObj = JSON.parse(jsonObj);
}
if (jsonObj && jsonObj.clientId) {
_this.clientId = jsonObj.clientId;
}
_this.setJsonObject(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_3__base__["a" /* Base */].commentPrefix;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* Base */].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";
};
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
});
Object.defineProperty(SurveyModel.prototype, "triggers", {
/**
* The list of triggers in the survey.
* @see SurveyTrigger
*/
get: function () {
return this.triggersValue;
},
set: function (val) {
this.setPropertyValue("triggers", 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, "showNavigationButtons", {
/**
* Set it to false 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", true);
},
set: function (val) {
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
*/
get: function () {
return this.getPropertyValue("showCompletedPage", true);
},
set: function (val) {
this.setPropertyValue("showCompletedPage", val);
},
enumerable: true,
configurable: true
});
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
});
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, "checkErrorsMode", {
/**
* Change this property from 'onNextPage' to 'onValueChanged' to check erorrs on every question value changing.
* By default, library checks errors on changing current page to the next or on completing the survey.
*/
get: function () {
return this.getPropertyValue("checkErrorsMode", "onNextPage");
},
set: function (val) {
this.setPropertyValue("checkErrorsMode", 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.
* 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", "onComplete");
},
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_8__surveyStrings__["a" /* surveyLocalization */].currentLocale = value;
this.localeValue = __WEBPACK_IMPORTED_MODULE_8__surveyStrings__["a" /* surveyLocalization */].currentLocale;
this.setPropertyValue("locale", this.localeValue);
this.locStrsChanged();
this.onLocaleChanged();
},
enumerable: true,
configurable: true
});
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_8__surveyStrings__["a" /* surveyLocalization */].getString(str);
};
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.
*/
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, "completedHtml", {
/**
* The html that shows on completed ('Thank you') page. Set it to change the default text.
* @see showCompletedPage
* @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, "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) {
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", "on");
},
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", "off");
},
set: function (newValue) {
this.setPropertyValue("showProgressBar", 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", "top");
},
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", "top");
},
set: function (value) {
this.setPropertyValue("questionErrorLocation", value.toLowerCase());
},
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", "edit");
},
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
});
Object.defineProperty(SurveyModel.prototype, "data", {
/**
* An object that stores the survey results/data. You may set it directly as { 'question name': questionValue, ... }
* @see setValue
* @see getValue
*/
get: function () {
var result = {};
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.checkTriggers(this.valuesHash, false);
this.notifyAllQuestionsOnValueChanged();
this.notifyElementsOnAnyValueOrVariableChanged("");
this.runConditions();
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getAllValues = function () {
return this.data;
};
SurveyModel.prototype.getQuestionPlainData = function (question) {
var result = [];
var value = question.value;
var displayValue = question.displayValue;
if (question.getType() === "checkbox") {
displayValue = (displayValue || "")
.split(",")
.map(function (v) { return v.trim(); });
}
var valueKeys = Object.keys(question.value);
var displayValueKeys = Object.keys(question.displayValue);
var isArray = Array.isArray(value);
valueKeys.forEach(function (key, index) {
result.push({
name: key,
title: isArray ? "" : displayValueKeys[index],
value: value[key],
displayValue: displayValue[displayValueKeys[index]],
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false
});
});
return result;
};
/**
* 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) {
var _this = this;
if (options === void 0) { options = { includeEmpty: true }; }
var result = [];
var data = this.data;
this.getAllQuestions().forEach(function (question) {
if (options.includeEmpty || data[question.name] !== undefined) {
var resultItem = {
name: question.name,
title: question.title,
value: question.value,
displayValue: question.displayValue,
isNode: typeof question.value === "object" || Array.isArray(question.value),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
}
};
result.push(resultItem);
if (resultItem.isNode) {
resultItem.data = _this.getQuestionPlainData(question);
}
}
});
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", "initial");
},
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;
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 false;
var page = this.currentPage;
if (!page)
return false;
return (page.navigationButtonsVisibility == "show" ||
(page.navigationButtonsVisibility != "hide" && 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, "isDesignMode", {
/**
* Returns true if the survey in the design mode. It is used by SurveyJS Editor
* @see setDesignMode
*/
get: function () {
return this.getPropertyValue("isDesignMode", false);
},
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.setPropertyValue("isDesignMode", value);
this.onIsSinglePageChanged();
};
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;
if (this.isEditMode && this.isCurrentPageHasErrors)
return false;
if (this.doServerValidation())
return false;
this.doNextPage();
return true;
};
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 () {
if (this.currentPage == null)
return true;
return this.currentPage.hasErrors(true, true);
},
enumerable: true,
configurable: true
});
/**
* 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 () {
if (this.isEditMode && this.isCurrentPageHasErrors)
return false;
if (this.doServerValidation())
return false;
this.doComplete();
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.
*/
get: function () {
return this.getPropertyValue("isSinglePage", false);
},
set: function (val) {
this.setPropertyValue("isSinglePage", 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.onIsSinglePageChanged = function () {
if (!this.isSinglePage || 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();
this.origionalPages = this.pages.slice(0, this.pages.length);
var startIndex = this.firstPageIsStarted ? 1 : 0;
_super.prototype.startLoadingFromJson.call(this);
var singlePage = this.createSinglePage(startIndex);
var deletedLen = this.pages.length - startIndex;
this.pages.splice(startIndex, deletedLen, singlePage);
_super.prototype.endLoadingFromJson.call(this);
singlePage.endLoadingFromJson();
this.doElementsOnLoad();
}
this.updateVisibleIndexes();
};
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__["b" /* JsonObject */].metaData.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);
}
return single;
};
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();
}
};
/**
* 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_9__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.sendResultOnPageNext) {
this.sendResult(this.surveyPostId, this.clientId, true);
}
if (!this.isCompleted) {
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index + 1];
}
};
SurveyModel.prototype.setCompleted = function () {
this.isCompleted = true;
};
Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", {
/**
* Returns the html for completed 'Thank you' page.
* @see completedHtml
*/
get: function () {
if (this.completedHtml) {
return this.processHtml(this.completedHtml);
}
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 "";
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.matrixRowRemoved = function (question, rowIndex, row) {
this.onMatrixRowRemoved.fire(this, {
question: question,
rowIndex: rowIndex,
row: row
});
};
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.matrixCellValidate = function (question, options) {
options.question = question;
this.onMatrixCellValidate.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_9__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_7__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.
*/
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.isVisible && q.hasInput) {
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_4__page__["a" /* PageModel */](name);
};
SurveyModel.prototype.questionOnValueChanging = function (valueName, newValue) {
var options = {
name: valueName,
question: this.getQuestionByValueName(valueName),
value: newValue
};
this.onValueChanging.fire(this, options);
return options.value;
};
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") {
question.hasErrors(true);
}
this.doSurveyValueChanged(question, 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.notifyAllQuestionsOnValueChanged = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
this.doSurveyValueChanged(questions[i], this.getValue(questions[i].getValueName()));
}
};
SurveyModel.prototype.doSurveyValueChanged = function (question, newValue) {
question.onSurveyValueChanged(newValue);
};
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 < 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) {
if (self.surveyShowDataSaving) {
if (success) {
self.setCompletedState("success", "");
}
else {
self.setCompletedState("error", "");
}
}
self.onSendResult.fire(self, { success: success, response: response });
}, 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.setJsonObject(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.setJsonObject = function (jsonObj) {
if (!jsonObj)
return;
this.questionHashesClear();
this.jsonErrors = null;
var jsonConverter = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]();
jsonConverter.toObject(jsonObj, this);
if (jsonConverter.errors.length > 0) {
this.jsonErrors = jsonConverter.errors;
}
};
SurveyModel.prototype.endLoadingFromJson = function () {
this.isEndLoadingFromJson = "processing";
this.isStartedState = this.firstPageIsStarted;
this.onIsSinglePageChanged();
_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_8__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.getQuizQuestions().length;
return;
}
var firstName = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name);
var variable = this.getVariable(name);
if (variable !== undefined) {
textValue.isExists = true;
textValue.value = variable;
return;
}
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)
: question.value;
textValue.value = new __WEBPACK_IMPORTED_MODULE_6__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();
return this.variablesHash[name];
};
/**
* 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, newValue) {
newValue = this.questionOnValueChanging(name, newValue);
if (this.isValueEqual(name, newValue))
return;
if (this.isValueEmpty(newValue)) {
this.deleteDataValueCore(this.valuesHash, name);
}
else {
newValue = this.getUnbindValue(newValue);
this.setDataValueCore(this.valuesHash, name, newValue);
}
var triggerKeys = {};
triggerKeys[name] = newValue;
this.checkTriggers(triggerKeys, false);
this.runConditions();
this.notifyQuestionOnValueChanged(name, newValue);
this.tryGoNextPageAutomatic(name);
};
SurveyModel.prototype.isValueEqual = function (name, newValue) {
if (newValue === "" || newValue === undefined)
newValue = null;
var oldValue = this.getValue(name);
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.currentPage.hasErrors(true, false)) {
if (!this.isLastPage) {
this.nextPage();
}
else {
if (this.goNextPageAutomatic === true) {
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) {
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);
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_9__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_9__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 () {
var questions = this.getQuizQuestions();
var counter = 0;
var options = { question: null, result: false };
for (var i = 0; i < questions.length; i++) {
options.question = questions[i];
options.result = options.question.isAnswerCorrect();
this.onIsAnswerCorrect.fire(this, options);
if (options.result)
counter++;
}
return counter;
};
/**
* Returns the number of incorrected answers on quiz
*/
SurveyModel.prototype.getInCorrectedAnswerCount = function () {
var questions = this.getQuizQuestions();
return questions.length - this.getCorrectedAnswerCount();
};
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);
return options.text;
},
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_11__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_11__surveytimer__["a" /* SurveyTimer */].instance.stop(this.timerFunc);
};
Object.defineProperty(SurveyModel.prototype, "timeSpent", {
/**
* Returns the time in seconds end-user spends on the survey
* @see startTimer
* @see PageModel.timeSpent
*/
get: function () {
return this.getPropertyValue("timeSpent", 0);
},
set: function (val) {
this.setPropertyValue("timeSpent", val);
},
enumerable: true,
configurable: true
});
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 {
this.setValue(name, value);
}
};
SurveyModel.prototype.copyTriggerValue = function (name, fromName) {
if (!name || !fromName)
return;
this.setValue(name, this.getValue(fromName));
};
SurveyModel.stylesManager = new __WEBPACK_IMPORTED_MODULE_10__stylesmanager__["a" /* StylesManager */]();
SurveyModel.platform = "unknown";
return SurveyModel;
}(__WEBPACK_IMPORTED_MODULE_3__base__["a" /* Base */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.addClass("survey", [
{
name: "locale",
choices: function () {
return __WEBPACK_IMPORTED_MODULE_8__surveyStrings__["a" /* surveyLocalization */].getLocales();
},
onGetValue: function (obj) {
return obj.locale == __WEBPACK_IMPORTED_MODULE_8__surveyStrings__["a" /* surveyLocalization */].defaultLocale ? null : obj.locale;
}
},
{ name: "title:text", serializationProperty: "locTitle" },
{ name: "focusFirstQuestionAutomatic:boolean", default: true },
{ name: "completedHtml:html", serializationProperty: "locCompletedHtml" },
{
name: "completedBeforeHtml:html",
serializationProperty: "locCompletedBeforeHtml"
},
{ name: "loadingHtml:html", serializationProperty: "locLoadingHtml" },
{ name: "pages", className: "page", visible: false },
{
name: "questions",
alternativeName: "elements",
baseClassName: "question",
visible: 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: "surveyId", visible: false },
{ name: "surveyPostId", visible: false },
{ name: "surveyShowDataSaving:boolean", visible: false },
"cookieName",
"sendResultOnPageNext:boolean",
{ name: "showNavigationButtons:boolean", default: true },
{ name: "showPrevButton:boolean", default: true },
{ name: "showTitle:boolean", default: true },
{ name: "showPageTitles:boolean", default: true },
{ name: "showCompletedPage:boolean", default: true },
{
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: "questionErrorLocation", default: "top", choices: ["top", "bottom"] },
{
name: "showProgressBar",
default: "off",
choices: ["off", "top", "bottom", "both"]
},
{ name: "mode", default: "edit", choices: ["edit", "display"] },
{ name: "storeOthersAsComment:boolean", default: true },
{ name: "maxTextLength:number", default: 0 },
{ name: "maxOthersLength:number", default: 0 },
"goNextPageAutomatic:boolean",
{
name: "clearInvisibleValues",
default: "onComplete",
choices: ["none", "onComplete", "onHidden"]
},
{
name: "checkErrorsMode",
default: "onNextPage",
choices: ["onNextPage", "onValueChanged"]
},
{ 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 },
{ name: "maxTimeToFinish:number", default: 0 },
{ name: "maxTimeToFinishPage:number", default: 0 },
{
name: "showTimerPanel",
default: "none",
choices: ["none", "top", "bottom"]
},
{
name: "showTimerPanelMode",
default: "all",
choices: ["all", "page", "survey"]
}
]);
/***/ }),
/* 29 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 30 */
/***/ (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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_matrixdropdown__ = __webpack_require__(48);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_matrixdropdownbase__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixBaseImplementor; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDropdown; });
var QuestionMatrixBaseImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixBaseImplementor, _super);
function QuestionMatrixBaseImplementor(question) {
var _this = _super.call(this, question) || this;
var self = _this;
_this.koCellAfterRender = function (el, con) {
return self.cellAfterRender(el, con);
};
_this.koRecalc = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
_this.koRows = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
this.koRecalc();
return this.question.visibleRows;
}, _this);
_this.koVisibleColumns = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
this.koRecalc();
return this.question.visibleColumns;
}, _this);
var self = _this;
_this
.question.visibleRowsChangedCallback = function () {
self.onVisibleRowsChanged();
};
_this.koAddRowClick = function () {
self.addRow();
};
_this.koRemoveRowClick = function (data) {
self.removeRow(data);
};
_this.koIsAddRowOnTop = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.isAddRowTop();
});
_this.koIsAddRowOnBottom = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.isAddRowBottom();
});
_this.koCanRemoveRow = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.canRemoveRow();
});
_this.koIsHorizontalColumnLayout = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.isColumnLayoutHorizontal);
_this.question["koRows"] = _this.koRows;
_this.question["koVisibleColumns"] = _this.koVisibleColumns;
_this.question["koCellAfterRender"] = _this.koCellAfterRender;
_this.question["koAddRowClick"] = _this.koAddRowClick;
_this.question["koRemoveRowClick"] = _this.koRemoveRowClick;
_this.question["koIsAddRowOnTop"] = _this.koIsAddRowOnTop;
_this.question["koIsAddRowOnBottom"] = _this.koIsAddRowOnBottom;
_this.question["koCanRemoveRow"] = _this.koCanRemoveRow;
_this.question["koIsHorizontalColumnLayout"] = _this.koIsHorizontalColumnLayout;
_this.question["hasRowText"] = _this.hasRowText();
_this
.question.columnsChangedCallback = function () {
self.onColumnChanged();
};
_this
.question.updateCellsCallback = function () {
self.onUpdateCells();
};
_this
.question.columnLayoutChangedCallback = function () {
self.onColumnLayoutChanged();
};
return _this;
}
QuestionMatrixBaseImplementor.prototype.getQuestionTemplate = function () {
return "matrixdynamic";
};
QuestionMatrixBaseImplementor.prototype.cellAfterRender = function (elements, con) {
if (!this.question.survey)
return;
var el = __WEBPACK_IMPORTED_MODULE_2__base__["c" /* SurveyElement */].GetFirstNonTextElement(elements);
if (!el)
return;
var cell = con;
if (cell.question.customWidget) {
cell.question.customWidget.afterRender(cell.question, el);
}
var options = {
cell: cell,
cellQuestion: cell.question,
htmlElement: el,
row: cell.row,
column: cell.column
};
this.question.survey.matrixAfterCellRender(this.question, options);
};
QuestionMatrixBaseImplementor.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.onColumnLayoutChanged();
};
QuestionMatrixBaseImplementor.prototype.hasRowText = function () {
return true;
};
QuestionMatrixBaseImplementor.prototype.onColumnLayoutChanged = function () {
this.koIsHorizontalColumnLayout(this.question.isColumnLayoutHorizontal);
this.koRecalc(this.koRecalc() + 1);
};
QuestionMatrixBaseImplementor.prototype.isAddRowTop = function () {
return false;
};
QuestionMatrixBaseImplementor.prototype.isAddRowBottom = function () {
return false;
};
QuestionMatrixBaseImplementor.prototype.canRemoveRow = function () {
return false;
};
QuestionMatrixBaseImplementor.prototype.onColumnChanged = function () {
var rows = this.question.visibleRows;
this.onVisibleRowsChanged();
};
QuestionMatrixBaseImplementor.prototype.onVisibleRowsChanged = function () {
this.koRecalc(this.koRecalc() + 1);
};
QuestionMatrixBaseImplementor.prototype.addRow = function () { };
QuestionMatrixBaseImplementor.prototype.removeRow = function (row) { };
QuestionMatrixBaseImplementor.prototype.onUpdateCells = function () { };
return QuestionMatrixBaseImplementor;
}(__WEBPACK_IMPORTED_MODULE_7__koquestion__["a" /* QuestionImplementor */]));
var QuestionMatrixDropdown = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDropdown, _super);
function QuestionMatrixDropdown(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionMatrixBaseImplementor(_this);
return _this;
}
return QuestionMatrixDropdown;
}(__WEBPACK_IMPORTED_MODULE_3__question_matrixdropdown__["a" /* QuestionMatrixDropdownModel */]));
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("matrixdropdown", function () {
return new QuestionMatrixDropdown("");
});
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdropdown", function (name) {
var q = new QuestionMatrixDropdown(name);
q.choices = [1, 2, 3, 4, 5];
q.rows = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultRows;
__WEBPACK_IMPORTED_MODULE_4__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 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__question_text__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionText; });
var QuestionText = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionText, _super);
function QuestionText(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
return QuestionText;
}(__WEBPACK_IMPORTED_MODULE_1__question_text__["a" /* QuestionTextModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("text", function () {
return new QuestionText("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("text", function (name) {
return new QuestionText(name);
});
/***/ }),
/* 32 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return koTemplate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTemplateText; });
var koTemplate = __webpack_require__(107);
var SurveyTemplateText = /** @class */ (function () {
function SurveyTemplateText() {
}
SurveyTemplateText.prototype.addText = function (newText, id, name) {
id = this.getId(id, name);
this.text =
this.text +
'";
};
SurveyTemplateText.prototype.replaceText = function (replaceText, id, questionType) {
if (questionType === void 0) { questionType = null; }
var posId = this.getId(id, questionType);
var pos = this.text.indexOf(posId);
if (pos < 0) {
this.addText(replaceText, id, questionType);
return;
}
pos = this.text.indexOf(">", pos);
if (pos < 0)
return;
var startPos = pos + 1;
var endString = "";
pos = this.text.indexOf(endString, startPos);
if (pos < 0)
return;
this.text =
this.text.substr(0, startPos) + replaceText + this.text.substr(pos);
};
SurveyTemplateText.prototype.getId = function (id, questionType) {
var result = 'id="survey-' + id;
if (questionType) {
result += "-" + questionType;
}
return result + '"';
};
Object.defineProperty(SurveyTemplateText.prototype, "text", {
get: function () {
return koTemplate;
},
set: function (value) {
koTemplate = value;
},
enumerable: true,
configurable: true
});
return SurveyTemplateText;
}());
/***/ }),
/* 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__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __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_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;
}
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({});
return;
}
if (this.lastObjHash == this.objHash)
return;
this.lastObjHash = this.objHash;
this.error = null;
if (this.useChangedItemsResults())
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, true);
var pPath = textProcessor.processTextEx(this.path, false, true);
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);
}
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__["b" /* JsonObject */].metaData.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, "itemValueType", {
get: function () {
if (!this.owner)
return "itemvalue";
var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.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.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.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 {
this.error = new __WEBPACK_IMPORTED_MODULE_5__error__["a" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("urlGetChoicesError"));
}
if (this.updateResultCallback) {
items = this.updateResultCallback(items, result);
}
ChoicesRestfull.itemsResult[this.objHash] = items;
this.getResultCallback(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_5__error__["a" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */]
.getString("urlRequestError")["format"](status, response));
this.doEmptyResultCallback(response);
};
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 = {};
return ChoicesRestfull;
}(__WEBPACK_IMPORTED_MODULE_1__base__["a" /* Base */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("choicesByUrl", ["url", "path", "valueName", "titleName"], function () {
return new ChoicesRestfull();
});
/***/ }),
/* 34 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__conditions__ = __webpack_require__(10);
/* 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() {
this.ERROR_OperatorExpected = "OPERATOR_EXPECTED";
this.ERROR_RightPartExpected = "RIGHTPART_EXPECTED";
this.ERROR_ExpressionExpected = "EXPRESSION_EXPECTED";
this.ERROR_EndExpected = "END_EXPECTED";
}
ConditionsParser.prototype.parse = function (text, root) {
this.setProperties(text, root);
return this.parseText();
};
ConditionsParser.prototype.createCondition = function (text) {
var root = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
if (!this.parse(text, root)) {
root = null;
}
return root;
};
ConditionsParser.prototype.parseExpression = function (text) {
this.setProperties(text, new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]());
return this.readExpressionOperand();
};
Object.defineProperty(ConditionsParser.prototype, "error", {
get: function () {
return this.errorValue;
},
enumerable: true,
configurable: true
});
ConditionsParser.prototype.createError = function (code) {
if (this.errorValue)
return;
this.errorValue = new ConditionsParserError(this.at, code);
};
ConditionsParser.prototype.setProperties = function (text, root) {
this.text = text;
this.at = 0;
this.length = this.text.length;
this.root = root;
this.root.clear();
this.node = this.root;
this.expressionNodes = [];
this.expressionNodes.push(this.node);
this.errorValue = null;
};
ConditionsParser.prototype.toString = function (root) {
return root.toString();
};
ConditionsParser.prototype.parseText = function () {
var res = this.readConditions();
if (this.at < this.length) {
this.createError(this.ERROR_EndExpected);
}
return res && this.at >= this.length;
};
ConditionsParser.prototype.readConditions = function () {
var res = this.readCondition();
if (!res)
return res;
var connective = this.readConnective();
if (connective) {
this.addConnective(connective);
return this.readConditions();
}
return true;
};
ConditionsParser.prototype.readCondition = function () {
var expRes = this.readExpression();
if (expRes < 0)
return false;
if (expRes == 1)
return true;
var left = this.readExpressionOperand();
if (!left) {
this.createError(this.ERROR_ExpressionExpected);
return false;
}
var op = this.readOperator();
if (!op) {
if (left.isBoolean) {
var c = new __WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */]();
c.left = left;
this.addCondition(c);
return true;
}
this.createError(this.ERROR_OperatorExpected);
return false;
}
var c = new __WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */]();
c.left = left;
c.operator = op;
if (!__WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */].isNoRightOperation(op)) {
var right = this.readExpressionOperand(true);
if (!right) {
this.createError(this.ERROR_RightPartExpected);
return false;
}
c.right = right;
}
this.addCondition(c);
return true;
};
ConditionsParser.prototype.readOperand = function () {
var ar = this.readArray();
if (ar)
return new __WEBPACK_IMPORTED_MODULE_0__conditions__["d" /* Operand */](ar);
var str = this.readString();
if (!str)
return null;
var params = this.readParameters();
if (params) {
var res = new __WEBPACK_IMPORTED_MODULE_0__conditions__["e" /* FunctionOperand */](str);
res.parameters = params;
return res;
}
return new __WEBPACK_IMPORTED_MODULE_0__conditions__["d" /* Operand */](str);
};
ConditionsParser.prototype.readNotOperand = function () {
this.skip();
var savedAt = this.at;
var str = this.readString();
if (!!str && (str.toLowerCase() == "not" || str == "!"))
return true;
this.at = savedAt;
return false;
};
ConditionsParser.prototype.readExpression = function () {
var isNot = this.readNotOperand();
if (this.at >= this.length || this.ch != "(")
return 0;
this.at++;
this.pushExpression();
var res = this.readConditions();
if (res) {
this.skip();
res = this.ch == ")";
this.at++;
this.popExpression(isNot);
return 1;
}
return -1;
};
ConditionsParser.prototype.readExpressionOperand = function (isRightCondition) {
if (isRightCondition === void 0) { isRightCondition = false; }
var expr = this.readExpressionOperandCore(0, isRightCondition);
if (expr == null)
return null;
if (!expr.right)
return expr.left;
return expr;
};
ConditionsParser.prototype.readExpressionOperandCore = function (brackets, isRightCondition) {
if (brackets === void 0) { brackets = 0; }
if (isRightCondition === void 0) { isRightCondition = false; }
var expressions = this.readExpressionOperandsCore(brackets, isRightCondition);
return this.makeExpressionOperandCore(expressions);
};
ConditionsParser.prototype.makeExpressionOperandCore = function (expressions) {
if (expressions.length == 0)
return null;
if (expressions.length == 1)
return expressions[0];
var res = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
res.left = expressions[0].left;
res.operator = expressions[0].operator;
this.buildExpressionBinaryTree(expressions, 1, res);
return res;
};
ConditionsParser.prototype.buildExpressionBinaryTree = function (list, index, parent) {
if (index >= list.length)
return;
var right = list[index].left;
if (index == list.length - 1) {
parent.right = right;
return;
}
var operator = list[index].operator;
var expr = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
if (this.isHighPriorityOperand(parent.operator) &&
!this.isHighPriorityOperand(operator)) {
expr.left = parent.left;
expr.right = right;
expr.operator = parent.operator;
parent.operator = operator;
parent.left = expr;
this.buildExpressionBinaryTree(list, index + 1, parent);
}
else {
expr.left = right;
expr.operator = operator;
parent.right = expr;
this.buildExpressionBinaryTree(list, index + 1, expr);
}
};
ConditionsParser.prototype.readExpressionOperandsCore = function (brackets, isRightCondition) {
var res = new Array();
var operand = null;
var operator = null;
while (this.at <= this.length) {
if (this.isCloseBracket(this.ch)) {
this.at++;
break;
}
this.skip();
if (this.isOpenBracket(this.ch)) {
this.at++;
operand = this.readExpressionOperandCore(brackets + 1);
}
else {
operand = this.readOperand();
}
if (!operand) {
this.nextOnCloseBrackets();
break;
}
operator = this.readOperandOperator();
if (!operator) {
if (!isRightCondition &&
this.nextOnCloseBrackets() &&
brackets == 0 &&
this.expressionNodes.length > 0) {
this.popExpression(false);
var expr = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
expr.left = operand;
res.push(expr);
operand = this.makeExpressionOperandCore(res);
res = [];
operator = this.readOperandOperator();
}
if (!operator)
break;
}
var expr = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
expr.left = operand;
expr.operator = operator;
res.push(expr);
}
if (!!operand) {
var expr = new __WEBPACK_IMPORTED_MODULE_0__conditions__["f" /* ExpressionOperand */]();
expr.left = operand;
res.push(expr);
}
return res;
};
ConditionsParser.prototype.nextOnCloseBrackets = function () {
if (this.isCloseBracket(this.ch)) {
this.at++;
return true;
}
return false;
};
Object.defineProperty(ConditionsParser.prototype, "ch", {
get: function () {
return this.text.charAt(this.at);
},
enumerable: true,
configurable: true
});
ConditionsParser.prototype.skip = function () {
while (this.at < this.length && this.isSpace(this.ch))
this.at++;
};
ConditionsParser.prototype.isSpace = function (c) {
return c == " " || c == "\n" || c == "\t" || c == "\r";
};
ConditionsParser.prototype.isQuotes = function (c) {
return c == "'" || c == '"';
};
ConditionsParser.prototype.isComma = function (c) {
return c == ",";
};
ConditionsParser.prototype.isOperatorChar = function (c) {
return (c == ">" ||
c == "<" ||
c == "=" ||
c == "!" ||
c == "+" ||
c == "-" ||
c == "*" ||
c == "^" ||
c == "/" ||
c == "%");
};
ConditionsParser.prototype.isOpenBracket = function (c) {
return c == "(";
};
ConditionsParser.prototype.isCloseBracket = function (c) {
return c == ")";
};
ConditionsParser.prototype.isBrackets = function (c) {
return this.isOpenBracket(c) || this.isCloseBracket(c);
};
ConditionsParser.prototype.readArray = function () {
this.skip();
if (this.at >= this.length)
return null;
if (this.ch !== "[")
return null;
this.at++;
var res = [];
while (this.at < this.length) {
var str = this.readString();
if (str)
res.push(str);
this.skip();
var c = this.ch;
if (c == ",")
this.at++;
if (c == "]") {
this.at++;
break;
}
}
return res;
};
ConditionsParser.prototype.readString = function () {
this.skip();
if (this.at >= this.length)
return null;
var start = this.at;
var hasQuotes = this.isQuotes(this.ch);
var hasBraces = this.ch == "{";
if (hasQuotes)
this.at++;
var isFirstOpCh = this.isOperatorChar(this.ch);
var isPrevEspape = false;
while (this.at < this.length) {
if (hasBraces) {
var isBrace = this.ch == "}";
this.at++;
if (isBrace)
break;
else
continue;
}
if (!hasQuotes && this.isSpace(this.ch))
break;
if (this.isQuotes(this.ch) && !isPrevEspape) {
if (hasQuotes)
this.at++;
break;
}
if (!hasQuotes) {
if (this.ch != "-" && isFirstOpCh != this.isOperatorChar(this.ch))
break;
if (this.isBrackets(this.ch) || this.isComma(this.ch))
break;
if (this.ch === "]")
break;
}
isPrevEspape = this.ch === "\\";
this.at++;
}
if (this.at <= start)
return null;
var res = this.text.substr(start, this.at - start);
if (res) {
if (res.length > 1 && this.isQuotes(res[0])) {
var len = res.length - 1;
if (this.isQuotes(res[res.length - 1]))
len--;
res = res.substr(1, len);
}
}
return res;
};
ConditionsParser.prototype.readParameter = function () {
var openedBrackets = 0;
var startIndex = this.at;
while (this.at < this.length) {
if (this.isOpenBracket(this.ch))
openedBrackets++;
if (this.isCloseBracket(this.ch))
openedBrackets--;
if (openedBrackets < 0)
break;
if (openedBrackets === 0 && this.ch === ",")
break;
this.at++;
}
var paramStr = this.text.substring(startIndex, this.at);
if (!paramStr)
return null;
var parser = new ConditionsParser();
var node = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
if (parser.parse(paramStr, node)) {
return new __WEBPACK_IMPORTED_MODULE_0__conditions__["g" /* ConditionOperand */](node);
}
return parser.parseExpression(paramStr);
};
ConditionsParser.prototype.readParameters = function () {
if (!this.isOpenBracket(this.ch))
return null;
var params = [];
while (this.at < this.length && !this.isCloseBracket(this.ch)) {
this.at++;
var operand = this.readParameter(); //this.readExpressionOperand();
if (operand) {
params.push(operand);
}
}
this.at++;
return params;
};
ConditionsParser.prototype.isHighPriorityOperand = function (op) {
return op == "*" || op == "^" || op == "/" || op == "%";
};
ConditionsParser.prototype.readOperandOperator = function () {
this.skip();
if (this.ch == "+" ||
this.ch == "-" ||
this.ch == "*" ||
this.ch == "^" ||
this.ch == "/" ||
this.ch == "%") {
var res = this.ch;
this.at++;
return res;
}
return null;
};
ConditionsParser.prototype.readOperator = function () {
this.skip();
var curAt = this.at;
var op = this.readString();
if (!op)
return null;
op = op.toLowerCase();
if (op == ">")
op = "greater";
if (op == "<")
op = "less";
if (op == ">=" || op == "=>")
op = "greaterorequal";
if (op == "<=" || op == "=<")
op = "lessorequal";
if (op == "=" || op == "==")
op = "equal";
if (op == "<>" || op == "!=")
op = "notequal";
if (op == "equals")
op = "equal";
if (op == "notequals")
op = "notequals";
if (op == "contain" || op == "*=")
op = "contains";
if (op == "notcontain")
op = "notcontains";
if (__WEBPACK_IMPORTED_MODULE_0__conditions__["c" /* Condition */].isCorrectOperator(op))
return op;
this.at = curAt;
return null;
};
ConditionsParser.prototype.readConnective = function () {
var con = this.readString();
if (!con)
return null;
con = con.toLowerCase();
if (con == "&" || con == "&&")
con = "and";
if (con == "|" || con == "||")
con = "or";
if (con != "and" && con != "or")
con = null;
return con;
};
ConditionsParser.prototype.pushExpression = function () {
var node = null;
this.expressionNodes.push(node);
this.node = node;
};
ConditionsParser.prototype.makeNodeCondition = function () {
if (!this.node || !this.node.children) {
this.node = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
this.expressionNodes[this.expressionNodes.length - 1] = this.node;
}
};
ConditionsParser.prototype.popExpression = function (isNot) {
var node = this.expressionNodes.pop();
this.node = this.expressionNodes[this.expressionNodes.length - 1];
if (node) {
node.isNot = isNot;
this.makeNodeCondition();
this.node.children.push(node);
}
};
ConditionsParser.prototype.addCondition = function (c) {
this.makeNodeCondition();
this.node.children.push(c);
};
ConditionsParser.prototype.addConnective = function (con) {
this.makeNodeCondition();
if (this.node.children.length < 2) {
this.node.connective = con;
}
else {
if (this.node.connective != con) {
var oldCon = this.node.connective;
var oldChildren = this.node.children;
this.node.clear();
this.node.connective = con;
var oldNode = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
oldNode.connective = oldCon;
oldNode.children = oldChildren;
this.node.children.push(oldNode);
var newNode = new __WEBPACK_IMPORTED_MODULE_0__conditions__["b" /* ConditionNode */]();
this.node.children.push(newNode);
this.node = newNode;
}
}
};
return ConditionsParser;
}());
/***/ }),
/* 35 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* 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 () {
//public static serviceUrl: string = "http://localhost:50488/api/Survey";
function dxSurveyService() {
}
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.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();
};
dxSurveyService.serviceUrl = "https://dxsurveyapi.azurewebsites.net/api/Survey";
return dxSurveyService;
}());
/***/ }),
/* 36 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionFactory; });
var FunctionFactory = /** @class */ (function () {
function FunctionFactory() {
this.functionHash = {};
}
FunctionFactory.prototype.register = function (name, func) {
this.functionHash[name] = func;
};
FunctionFactory.prototype.unregister = function (name) {
delete this.functionHash[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;
}());
function sum(params) {
var res = 0;
for (var i = 0; i < params.length; i++) {
res += params[i];
}
return res;
}
FunctionFactory.Instance.register("sum", sum);
function avg(params) {
var res = 0;
for (var i = 0; i < params.length; i++) {
res += params[i];
}
return params.length > 0 ? res / params.length : 0;
}
FunctionFactory.Instance.register("avg", avg);
function sumInArray(params) {
if (params.length != 2)
return 0;
var arr = params[0];
if (!Array.isArray(arr))
return;
var name = params[1];
if (typeof name !== "string" && !(name instanceof String))
return 0;
var res = 0;
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item && item[name]) {
res += item[name];
}
}
return res;
}
FunctionFactory.Instance.register("sumInArray", sumInArray);
function iif(params) {
if (!params && params.length !== 3)
return "";
return params[0] ? params[1] : params[2];
}
FunctionFactory.Instance.register("iif", iif);
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);
/***/ }),
/* 37 */
/***/ (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}",
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)...",
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",
removeFileCaption: "Remove this file"
};
//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";
/***/ }),
/* 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__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(10);
/* 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_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.filteredRows = null;
_this.filteredColumns = null;
_this.columnsValue = _this.createColumnValues();
_this.rows = _this.createItemValues("rows");
return _this;
}
QuestionMatrixBaseModel.prototype.createColumnValues = function () {
return [];
};
QuestionMatrixBaseModel.prototype.getType = function () {
return "matrixbase";
};
Object.defineProperty(QuestionMatrixBaseModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
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.columnsValue;
},
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) {
this.setPropertyValue("rows", newValue);
this.filterItems();
},
enumerable: true,
configurable: true
});
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.onRowsChanged = function () {
this.fireCallback(this.visibleRowsChangedCallback);
};
QuestionMatrixBaseModel.prototype.runItemsCondition = function (values, properties) {
var hasChanges = this.runConditionsForRows(values, properties);
hasChanges = this.runConditionsForColumns(values, properties) || hasChanges;
if (hasChanges) {
if (!!this.filteredColumns || !!this.filteredRows) {
this.clearIncorrectValues();
}
this.generatedVisibleRows = null;
this.onRowsChanged();
}
return hasChanges;
};
QuestionMatrixBaseModel.prototype.runConditionsForRows = function (values, properties) {
var runner = !!this.rowsVisibleIf
? new __WEBPACK_IMPORTED_MODULE_4__conditions__["a" /* 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__["a" /* ConditionRunner */](this.columnsVisibleIf)
: null;
this.filteredColumns = [];
var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.columns, this.filteredColumns, runner, values, properties);
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);
};
return QuestionMatrixBaseModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("matrixbase", ["columnsVisibleIf:condition", "rowsVisibleIf:condition"], undefined, "question");
/***/ }),
/* 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__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBooleanModel; });
/**
* A Model for a boolean question.
*/
var QuestionBooleanModel = /** @class */ (function (_super) {
__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);
return _this;
}
QuestionBooleanModel.prototype.getType = function () {
return "boolean";
};
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 this.showTitle;
},
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", "indeterminate");
},
set: function (val) {
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, "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, "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__["b" /* JsonObject */].metaData.addClass("boolean", [
{
name: "defaultValue:dropdown",
alternativeName: "booleanDefaultValue",
default: "indeterminate",
choices: ["indeterminate", "false", "true"]
},
{ name: "label:text", serializationProperty: "locLabel" },
"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);
});
/***/ }),
/* 40 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxModel; });
/**
* A Model for a checkbox question
*/
var QuestionCheckboxModel = /** @class */ (function (_super) {
__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.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.value;
if (!val || !Array.isArray(val))
return false;
return val.indexOf(item.value) > -1;
};
QuestionCheckboxModel.prototype.setNewValue = function (newValue) {
if (this.hasNone) {
var value = this.value;
if (!__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(value, newValue)) {
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 = [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);
}
if (this.hasNone) {
items.push(this.noneItem);
}
_super.prototype.addToVisibleChoices.call(this, items);
};
QuestionCheckboxModel.prototype.getDisplayValueCore = function (keysAsText) {
if (this.isEmpty())
return "";
var items = this.visibleChoices;
var values = this.value;
var str = "";
for (var i = 0; i < values.length; i++) {
var valStr = this.getChoicesDisplayValue(items, values[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) {
this.clearValue();
}
return;
}
var newValue = [];
for (var i = 0; i < val.length; i++) {
if ((!clearDisabled && !this.hasUnknownValue(val[i], true)) ||
(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.getValueCore = function () {
return _super.prototype.getValueCore.call(this) || [];
};
QuestionCheckboxModel.prototype.isAnswerCorrect = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isArrayContainsEqual(this.value, this.correctAnswer);
};
QuestionCheckboxModel.prototype.setDefaultValueWithOthers = function () {
this.value = this.valueFromDataCore(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 [val];
return _super.prototype.valueFromData.call(this, val);
};
QuestionCheckboxModel.prototype.valueFromDataCore = function (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.valueToDataCore = 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.getType = function () {
return "checkbox";
};
return QuestionCheckboxModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.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;
});
/***/ }),
/* 41 */
/***/ (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__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCommentModel; });
/**
* A Model for a comment question
*/
var QuestionCommentModel = /** @class */ (function (_super) {
__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;
}
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", -1);
},
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", 4);
},
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", 50);
},
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 === "";
};
return QuestionCommentModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.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);
});
/***/ }),
/* 42 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* 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_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__["b" /* JsonObject */].metaData.addClass("empty", [], function () {
return new QuestionEmptyModel("");
}, "question");
/***/ }),
/* 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__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(10);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpressionModel; });
/**
* A Model for expression question. It is a read-only question. It calculates value based on epxression property.
*/
var QuestionExpressionModel = /** @class */ (function (_super) {
__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_4__conditions__["h" /* 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.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
if (!this.expression || this.expressionIsRunning)
return;
this.expressionIsRunning = true;
if (!this.expressionRunner)
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["h" /* ExpressionRunner */](this.expression);
this.value = this.expressionRunner.run(values, properties);
this.expressionIsRunning = false;
};
Object.defineProperty(QuestionExpressionModel.prototype, "maximumFractionDigits", {
/**
* The maximum number of fraction digits to use. 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. 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) {
var val = this.isValueEmpty(this.value) ? this.defaultValue : this.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" or "percent". 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", "none");
},
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", "USD");
},
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 != "none" &&
!isNaN(parseFloat(val)) &&
isFinite(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_1__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",
"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",
"ZAR",
"ZMW",
"ZWL"
];
}
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.addClass("expression", [
"expression:expression",
{ name: "format", serializationProperty: "locFormat" },
{
name: "displayStyle",
default: "none",
choices: ["none", "decimal", "currency", "percent"]
},
{
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 }
], function () {
return new QuestionExpressionModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) {
return new QuestionExpressionModel(name);
});
/***/ }),
/* 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__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFileModel; });
/**
* A Model for a file question
*/
var QuestionFileModel = /** @class */ (function (_super) {
__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__["b" /* 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", true);
},
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", true);
},
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, "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, "cleanButtonCaption", {
/**
* The clean files value 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 !!fileItem && this.isFileImage(fileItem);
};
QuestionFileModel.prototype.setNewValue = function (newValue) {
var _this = this;
_super.prototype.setNewValue.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__["a" /* CustomError */](__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));
}
});
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;
};
return QuestionFileModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.addClass("file", [
{ name: "showPreview:boolean", default: true },
"allowMultiple:boolean",
"imageHeight",
"imageWidth",
"acceptedTypes",
{ name: "storeDataAsText:boolean", default: true },
{ name: "waitForUpload:boolean", default: false },
"maxSize:number"
], function () {
return new QuestionFileModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) {
return new QuestionFileModel(name);
});
/***/ }),
/* 45 */
/***/ (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__(54);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* 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_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__["b" /* JsonObject */].metaData.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);
});
/***/ }),
/* 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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* 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_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;
};
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
});
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 () {
return _super.prototype.getValueCore.call(this) || (this.multiSelect && []) || undefined;
};
Object.defineProperty(QuestionImagePickerModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () {
return this.getPropertyValue("imageHeight", 150);
},
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", 200);
},
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", "contain");
},
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", "image");
},
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__["b" /* JsonObject */].metaData.addClass("imageitemvalue", ["imageLink"], null, "itemvalue");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.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 },
{ name: "imageWidth:number", default: 200 }
], function () {
return new QuestionImagePickerModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addProperty("imagepicker", {
name: "showLabel:boolean",
default: false
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addProperty("imagepicker", {
name: "colCount:number",
default: 0,
choices: [0, 1, 2, 3, 4, 5]
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.addProperty("imagepicker", {
name: "multiSelect:boolean",
default: false
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.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;
});
/***/ }),
/* 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__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__martixBase__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localizablestring__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__question_dropdown__ = __webpack_require__(26);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return MartrixCells; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", 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(MartrixCells.DefaultRowName, 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(MartrixCells.DefaultRowName, column);
};
MartrixCells.prototype.getCellDisplayLocText = function (row, column) {
var cellText = this.getCellLocText(row, column);
if (cellText && !cellText.isEmpty)
return cellText;
cellText = this.getCellLocText(MartrixCells.DefaultRowName, 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.text : null;
};
MartrixCells.prototype.getDefaultCellText = function (column) {
var loc = this.getCellLocText(MartrixCells.DefaultRowName, column);
return loc ? loc.text : null;
};
MartrixCells.prototype.getCellDisplayText = function (row, column) {
var loc = this.getCellDisplayLocText(row, column);
return loc ? loc.text : 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_7__localizablestring__["a" /* LocalizableString */](this.cellsOwner, true);
};
MartrixCells.DefaultRowName = "default";
return MartrixCells;
}());
/**
* A Model for a simple matrix question.
*/
var QuestionMatrixModel = /** @class */ (function (_super) {
__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_7__localizablestring__["a" /* LocalizableString */](_this);
_this.cellsValue = new MartrixCells(_this);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rows", function () {
if (!self.filterItems()) {
self.onRowsChanged();
}
});
return _this;
}
QuestionMatrixModel.prototype.createColumnValues = function () {
return this.createItemValues("columns");
};
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
});
QuestionMatrixModel.prototype.getRows = function () {
return this.rows;
};
QuestionMatrixModel.prototype.getColumns = function () {
return this.visibleColumns;
};
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(), val[row.value]));
}
if (result.length == 0 && !this.filteredRows) {
result.push(this.createMatrixRow(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](null), this.name, val));
}
this.generatedVisibleRows = result;
return result;
};
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_5__error__["a" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("requiredInAllRowsError"), 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.createMatrixRow = function (item, fullName, value) {
return new MatrixRowModel(item, fullName, this, value);
};
QuestionMatrixModel.prototype.onValueChanged = function () {
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) {
var values = this.value;
if (!values)
return values;
var res = {};
for (var key in values) {
var newKey = keysAsText
? __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, key)
: key;
if (!newKey)
newKey = key;
var newValue = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.columns, values[key]);
if (!newValue)
newValue = values[key];
res[newKey] = newValue;
}
return res;
};
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.text,
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_8__question_dropdown__["a" /* QuestionDropdownModel */](path);
question.choices = this.columns;
var json = new __WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */]().toJsonObject(question);
json["type"] = question.getType();
return json;
};
//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_2__martixBase__["a" /* QuestionMatrixBaseModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("matrix", [
{
name: "columns:itemvalue[]"
},
{
name: "rows:itemvalue[]"
},
{ name: "cells:cells", serializationProperty: "cells" },
"isAllRowRequired:boolean"
], function () {
return new QuestionMatrixModel("");
}, "matrixbase");
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrixModel(name);
q.rows = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultRows;
q.columns = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultColums;
return q;
});
/***/ }),
/* 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__question_matrixdropdownbase__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDropdownModel; });
var MatrixDropdownRowModel = /** @class */ (function (_super) {
__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();
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__["b" /* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDropdownModel, _super);
function QuestionMatrixDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rows", function () {
self.generatedVisibleRows = null;
self.filterItems();
});
return _this;
}
QuestionMatrixDropdownModel.prototype.getType = function () {
return "matrixdropdown";
};
QuestionMatrixDropdownModel.prototype.getDisplayValueCore = function (keysAsText) {
var values = this.value;
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.text + ".";
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.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__["a" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.addClass("matrixdropdown", [
{
name: "rows:itemvalue[]"
},
"rowsVisibleIf:condition"
], 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__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 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_matrixdropdownbase__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDynamicRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDynamicModel; });
var MatrixDynamicRowModel = /** @class */ (function (_super) {
__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();
return _this;
}
Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", {
get: function () {
return this.id;
},
enumerable: true,
configurable: true
});
return MatrixDynamicRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["b" /* 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_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.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 > QuestionMatrixDynamicModel.MaxRowCount)
return;
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.fireCallback(this.visibleRowsChangedCallback);
},
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", QuestionMatrixDynamicModel.MaxRowCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > QuestionMatrixDynamicModel.MaxRowCount)
val = QuestionMatrixDynamicModel.MaxRowCount;
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 canRemoveRow
* @see rowCount
*/
get: function () {
return !this.isReadOnly && this.rowCount < this.maxRowCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canRemoveRow", {
/**
* Returns true, if a row can be removed.
* @see minRowCount
* @see canAddRow
* @see rowCount
*/
get: function () {
return !this.isReadOnly && this.rowCount > this.minRowCount;
},
enumerable: true,
configurable: true
});
/**
* 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;
var prevRowCount = this.rowCount;
this.rowCount = this.rowCount + 1;
var defaultValue = this.getDefaultRowValue(true);
if (!this.isValueEmpty(defaultValue)) {
var newValue = this.createNewValue(this.value);
if (newValue.length == this.rowCount) {
newValue[newValue.length - 1] = defaultValue;
this.value = newValue;
}
}
if (this.data) {
this.runCellsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
}
if (this.survey) {
if (prevRowCount + 1 == this.rowCount) {
this.survey.matrixRowAdded(this);
this.fireCallback(this.visibleRowsChangedCallback);
}
}
};
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 (!this.confirmDelete || confirm(this.confirmDeleteText)) {
this.removeRow(value);
}
};
/**
* Removes a row by it's index.
* @param index a row index, from 0 to rowCount - 1
*/
QuestionMatrixDynamicModel.prototype.removeRow = function (index) {
if (!this.canRemoveRow)
return;
if (index < 0 || index >= this.rowCount)
return;
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);
}
if (this.value) {
var val = this.createNewValue(this.value);
val.splice(index, 1);
val = this.deleteRowValue(val, null);
this.value = val;
}
this.rowCountValue--;
this.fireCallback(this.visibleRowsChangedCallback);
};
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", "default");
},
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) {
var values = this.value;
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;
};
QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["a" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */]
.getString("minRowCountError")["format"](this.minRowCount)));
}
};
QuestionMatrixDynamicModel.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var prevValue = _super.prototype.hasErrors.call(this, fireCallback);
return this.isValueDuplicated() || 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__["a" /* CustomError */](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(this.value);
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) {
var newRowCount = val && Array.isArray(val) ? val.length : 0;
if (newRowCount <= this.rowCount)
return;
this.rowCountValue = newRowCount;
if (this.generatedVisibleRows) {
this.generatedVisibleRows = null;
this.generatedVisibleRows = this.visibleRows;
this.fireCallback(this.visibleRowsChangedCallback);
}
};
QuestionMatrixDynamicModel.prototype.createNewValue = function (curValue) {
var result = curValue;
if (!result || !Array.isArray(result))
result = [];
var r = [];
if (result.length > this.rowCount)
result.splice(this.rowCount - 1);
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 {};
return this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));
};
QuestionMatrixDynamicModel.MaxRowCount = 100;
return QuestionMatrixDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.addClass("matrixdynamic", [
{ name: "rowsVisibleIf:condition", visible: false },
{ name: "rowCount:number", default: 2 },
{ name: "minRowCount:number", default: 0 },
{
name: "maxRowCount:number",
default: QuestionMatrixDynamicModel.MaxRowCount
},
{ 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__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 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__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__validator__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_text__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__error__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__helpers__ = __webpack_require__(5);
/* 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_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.validators = new Array();
_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_4__question_text__["a" /* QuestionTextModel */](name);
};
MultipleTextItemModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
this.editor.locStrsChanged();
};
MultipleTextItemModel.prototype.setData = function (data) {
this.data = data;
if (data) {
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.getPropertyValue("maxLength", -1);
},
set: function (val) {
this.setPropertyValue("maxLength", val);
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getMaxLength = function () {
var survey = this.getSurvey();
return __WEBPACK_IMPORTED_MODULE_8__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, "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_8__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.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__["a" /* Base */]));
/**
* A Model for a multiple text question.
*/
var QuestionMultipleTextModel = /** @class */ (function (_super) {
__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 () {
_super.prototype.onSurveyLoad.call(this);
this.callEditorFunction("onSurveyLoad");
this.fireCallback(this.colCountChangedCallback);
};
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.callEditorFunction = function (funcName) {
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor && item.editor[funcName]) {
item.editor[funcName]();
}
}
};
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_5__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", 1);
},
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", 25);
},
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.runValidators = function () {
var errors = _super.prototype.runValidators.call(this);
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].isEmpty())
continue;
var itemErrors = new __WEBPACK_IMPORTED_MODULE_2__validator__["a" /* ValidatorRunner */]().run(this.items[i]);
for (var j = 0; j < itemErrors.length; j++) {
errors.push(itemErrors[j]);
}
}
return errors;
};
QuestionMultipleTextModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.isRequired && __WEBPACK_IMPORTED_MODULE_8__helpers__["a" /* Helpers */].isValueEmpty(item.value)) {
errors.push(new __WEBPACK_IMPORTED_MODULE_7__error__["c" /* AnswerRequiredError */]());
}
}
};
//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.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.elementWidthChanged = function (el) { };
return QuestionMultipleTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["b" /* JsonObject */].metaData.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: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
}
], function () {
return new MultipleTextItemModel("");
});
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["b" /* JsonObject */].metaData.addClass("multipletext", [
{ name: "!items:textitems", className: "multipletextitem" },
{ name: "itemSize:number", default: 25 },
{ name: "colCount:number", default: 1, choices: [1, 2, 3, 4, 5] }
], function () {
return new QuestionMultipleTextModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleTextModel(name);
q.addItem("text1");
q.addItem("text2");
return q;
});
/***/ }),
/* 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__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__panel__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__error__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionPanelDynamicItem; });
/* 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();
this.panel.updateCustomWidgets();
}
Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", {
get: function () {
return this.panelValue;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicItem.prototype.setSurveyImpl = function () {
this.panel.setSurveyImpl(this);
};
QuestionPanelDynamicItem.prototype.runCondition = function (values, properties) {
this.panel.runCondition(values, properties);
};
QuestionPanelDynamicItem.prototype.getValue = function (name) {
var values = this.data.getPanelItemData(this);
return values[name];
};
QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) {
this.data.setPanelItemData(this, name, newValue);
};
QuestionPanelDynamicItem.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_1__base__["a" /* Base */].commentPrefix);
return result ? result : "";
};
QuestionPanelDynamicItem.prototype.setComment = function (name, newValue) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_1__base__["a" /* Base */].commentPrefix, newValue);
};
QuestionPanelDynamicItem.prototype.onSurveyValueChanged = function () {
var questions = this.panel.questions;
var values = this.data.getPanelItemData(this);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.onSurveyValueChanged(values[q.getValueName()]);
}
};
QuestionPanelDynamicItem.prototype.setVisibleIndex = function (index, showIndex) {
if (!showIndex) {
this.panel.setVisibleIndex(-1);
return 0;
}
return this.panel.setVisibleIndex(index);
};
QuestionPanelDynamicItem.prototype.getAllValues = function () {
return this.data.getPanelItemData(this);
};
QuestionPanelDynamicItem.prototype.getFilteredValues = function () {
var allValues = this.getAllValues();
var values = { panel: allValues };
for (var key in allValues) {
values[key] = allValues[key];
}
return values;
};
QuestionPanelDynamicItem.prototype.getFilteredProperties = function () {
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;
if (textValue.name == QuestionPanelDynamicItem.IndexVariableName) {
textValue.isExists = true;
textValue.value = this.data.getItemIndex(this) + 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);
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.prototype.onAnyValueChanged = function (name) {
this.panel.onAnyValueChanged(name);
this.panel.onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName);
};
QuestionPanelDynamicItem.ItemVariableName = "panel";
QuestionPanelDynamicItem.IndexVariableName = "panelIndex";
return QuestionPanelDynamicItem;
}());
/**
* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamicModel, _super);
function QuestionPanelDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.itemsValue = new Array();
_this.loadingPanelCount = 0;
_this.currentIndexValue = -1;
_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.template.setSurveyImpl(this.surveyImpl);
};
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.items ||
this.items.length == 0)
return;
var property = __WEBPACK_IMPORTED_MODULE_7__jsonobject__["b" /* JsonObject */].metaData.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 () {
return this.itemsValue;
},
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 () {
var res = [];
for (var i = 0; i < this.items.length; i++) {
res.push(this.items[i].panel);
}
return res;
},
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.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 (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;
};
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.items.length;
},
set: function (val) {
if (val < 0)
return;
if (this.isLoadingFromJson || this.isDesignMode) {
this.loadingPanelCount = val;
return;
}
if (val == this.items.length || this.isDesignMode)
return;
for (var i = this.panelCount; i < val; i++) {
var newItem = this.createNewItem();
this.items.push(newItem);
if (this.renderMode == "list" && this.panelsState != "default") {
if (this.panelsState === "expand") {
newItem.panel.expand();
}
else {
newItem.panel.collapse();
}
}
}
if (val < this.panelCount)
this.items.splice(val, this.panelCount - val);
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", "default");
},
set: function (val) {
this.setPropertyValue("panelsState", val);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setPanelsSurveyImpl = function () {
for (var i = 0; i < this.items.length; i++) {
this.items[i].setSurveyImpl();
}
};
QuestionPanelDynamicModel.prototype.setPanelsState = function () {
if (this.isDesignMode || this.renderMode != "list")
return;
for (var i = 0; i < this.items.length; i++) {
var state = this.panelsState;
if (state === "firstExpanded") {
state = i === 0 ? "expanded" : "collapsed";
}
this.items[i].panel.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.value = value;
};
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", QuestionPanelDynamicModel.MaxPanelCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > QuestionPanelDynamicModel.MaxPanelCount)
val = QuestionPanelDynamicModel.MaxPanelCount;
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", true);
},
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", true);
},
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", "default");
},
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", "off");
},
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", "list");
},
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.items.length; i++) {
var counter = this.items[i].setVisibleIndex(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;
};
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 () {
if (this.isLoadingFromJson)
return;
var items = new Array();
if (this.isDesignMode) {
items.push(new QuestionPanelDynamicItem(this, this.template));
}
else {
for (var i = 0; i < this.panelCount; i++) {
items.push(this.createNewItem());
}
}
this.setPanelsState();
this.itemsValue = items;
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.items[this.panelCount - 1].panel;
};
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);
}
};
/**
* 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.items.splice(index, 1);
var value = this.value;
if (!value || !Array.isArray(value) || index >= value.length)
return;
value.splice(index, 1);
QuestionPanelDynamicModel.isPanelRemoving = true;
this.value = value;
QuestionPanelDynamicModel.isPanelRemoving = false;
this.fireCallback(this.panelCountChangedCallback);
if (this.survey)
this.survey.dynamicPanelRemoved(this, index);
};
QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) {
if (!isNaN(parseFloat(val)) && isFinite(val))
return val;
for (var i = 0; i < this.items.length; i++) {
if (this.items[i] === val || this.items[i].panel === 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.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)) {
delete values[key];
isChanged = true;
}
}
if (isChanged) {
val[index] = values;
this.value = val;
}
};
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.onSurveyLoad = function () {
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.items.length; i++) {
this.items[i].panel.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 newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
for (var i = 0; i < this.items.length; i++) {
newValues[QuestionPanelDynamicItem.ItemVariableName] = this.getPanelItemData(this.items[i]);
newValues[QuestionPanelDynamicItem.IndexVariableName] = i;
this.items[i].runCondition(newValues, properties);
}
};
QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onAnyValueChanged(name);
}
};
QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var errosInPanels = this.hasErrorInPanels(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels;
};
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.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.hasErrorInPanels = function (fireCallback) {
var res = false;
var panels = this.panels;
var keyValues = [];
for (var i = 0; i < panels.length; i++) {
var pnlError = panels[i].hasErrors(fireCallback);
pnlError = this.isValueDuplicated(panels[i], keyValues) || pnlError;
if (!this.isRenderModeList && pnlError && !res) {
this.currentIndex = i;
}
res = pnlError || res;
}
return res;
};
QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues) {
if (!this.keyName)
return false;
var question = panel.getQuestionByValueName(this.keyName);
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_9__error__["a" /* CustomError */](this.keyDuplicationError, this));
return true;
}
}
keyValues.push(value);
return false;
};
QuestionPanelDynamicModel.prototype.createNewItem = function () {
return new QuestionPanelDynamicItem(this, this.createNewPanel());
};
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%";
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.onValueChanged = function () {
if (this.isValueChangingInternally)
return;
var val = this.value;
var newPanelCount = val && Array.isArray(val) ? val.length : 0;
if (!QuestionPanelDynamicModel.isPanelRemoving &&
newPanelCount <= this.panelCount)
return;
this.panelCount = newPanelCount;
};
QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onSurveyValueChanged();
}
if (newValue === undefined) {
this.setValueBasedOnPanelCount();
}
};
QuestionPanelDynamicModel.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
if (this.isDesignMode) {
this.template.setSurveyImpl(this.surveyImpl);
this.rebuildPanels();
}
};
//IQuestionPanelDynamicData
QuestionPanelDynamicModel.prototype.getItemIndex = function (item) {
return this.items.indexOf(item);
};
QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) {
var index = this.items.indexOf(item);
var qValue = this.value;
if (index < 0 &&
Array.isArray(qValue) &&
qValue.length > this.items.length) {
index = this.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 index = this.items.indexOf(item);
if (index < 0)
index = this.items.length;
var qValue = 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];
}
this.isValueChangingInternally = true;
this.value = qValue;
this.isValueChangingInternally = false;
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.MaxPanelCount = 100;
QuestionPanelDynamicModel.isPanelRemoving = false;
return QuestionPanelDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_5__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_7__jsonobject__["b" /* JsonObject */].metaData.addClass("paneldynamic", [
{ name: "templateElements", alternativeName: "questions", visible: 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 },
{
name: "maxPanelCount:number",
default: QuestionPanelDynamicModel.MaxPanelCount
},
"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", 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);
});
/***/ }),
/* 52 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroupModel; });
/**
* A Model for a radiogroup question.
*/
var QuestionRadiogroupModel = /** @class */ (function (_super) {
__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, "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, "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__["b" /* JsonObject */].metaData.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;
});
/***/ }),
/* 53 */
/***/ (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__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRatingModel; });
/**
* A Model for a rating question.
*/
var QuestionRatingModel = /** @class */ (function (_super) {
__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", 1);
},
set: function (val) {
if (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", 5);
},
set: function (val) {
if (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", 1);
},
set: function (val) {
if (val <= 0)
val = 1;
if (val > this.rateMax - this.rateMin)
val = this.rateMax - this.rateMin;
this.setPropertyValue("rateStep", val);
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.getDisplayValueCore = function (keysAsText) {
if (this.isEmpty())
return "";
var res = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.visibleRateValues, this.value);
return !!res ? res : this.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 < QuestionRatingModel.MaximumRateValueCount) {
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
});
QuestionRatingModel.MaximumRateValueCount = 20;
return QuestionRatingModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("rating", [
"hasComment:boolean",
{
name: "rateValues:itemvalue[]"
},
{ name: "rateMin:number", default: 1 },
{ name: "rateMax:number", default: 5 },
{ name: "rateStep:number", default: 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);
});
/***/ }),
/* 54 */
/***/ (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__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* 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_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__["b" /* JsonObject */].metaData.addClass("nonvalue", [
{ name: "title", visible: false },
{ name: "description", visible: false },
{ name: "commentText", 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: "validators", visible: false }
], function () {
return new QuestionNonValue("");
}, "question");
/***/ }),
/* 55 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return StylesManager; });
var StylesManager = /** @class */ (function () {
function StylesManager() {
this.sheet = null;
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 (["bootstrap", "bootstrapmaterial"].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";
}
var sheet = StylesManager.findSheet(themeName + themeSelector);
if (!sheet) {
sheet = 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.insertRule(themeSelector + selector + " { " + cssRuleText + " }", 0);
});
}
};
StylesManager.prototype.initializeStyles = function (sheet) {
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_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.sv_q_imagepicker_inline": "display: inline-block;",
".sv_qstn label.sv_q_m_label": "position: absolute; margin: 0;",
".sv_qstn td": "position: relative;",
".sv_q_mt_item_value": "float: left;",
".sv_qstn.sv_qstn_left": "margin-top: 0.75em;",
".sv_qstn .title-left": "float: left; margin-right: 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": "width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .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": "width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .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": "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;"
};
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_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)"
}
};
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"
},
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"
},
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"
},
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"
},
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"
},
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"
},
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"
}
};
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 .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 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;"
};
StylesManager.bootstrapThemeCss = {
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color",
".sv_main .sv_p_description": "padding-left: 1.66em;"
};
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 .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;"
};
return StylesManager;
}());
/***/ }),
/* 56 */
/***/ (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__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(28);
/* 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_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__["a" /* Base */]));
/***/ }),
/* 57 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(4);
/* unused harmony export surveyTimerFunctions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimer; });
var surveyTimerFunctions = {
setInterval: function (func) {
return window.setInterval(func, 1000);
},
clearInterval: function (timerId) {
window.clearInterval(timerId);
}
};
var SurveyTimer = /** @class */ (function () {
function SurveyTimer() {
this.listenerCounter = 0;
this.timerId = -1;
this.onTimer = new __WEBPACK_IMPORTED_MODULE_0__base__["b" /* 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) {
if (func === void 0) { func = null; }
if (func) {
this.onTimer.add(func);
}
if (this.timerId < 0) {
var self = this;
this.timerId = surveyTimerFunctions.setInterval(function () {
self.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.clearInterval(this.timerId);
this.timerId = -1;
}
};
SurveyTimer.prototype.doTimer = function () {
if (this.timerId < 0)
return;
this.onTimer.fire(this, {});
};
SurveyTimer.instanceValue = null;
return SurveyTimer;
}());
/***/ }),
/* 58 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapCss; });
var defaultBootstrapCss = {
root: "sv_main sv_bootstrap_css",
header: "panel-heading card-header",
body: "panel-body card-block mt-4",
footer: "panel-footer card-footer",
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",
page: {
root: "",
title: "",
description: ""
},
pageTitle: "",
pageDescription: "small",
row: "sv_row",
question: {
mainRoot: "sv_qstn",
title: "",
description: "small",
comment: "form-control",
required: "",
titleRequired: "",
hasError: "has-error",
indent: 20
},
panel: {
title: "sv_p_title",
description: "small sv_p_description",
container: "sv_p_container"
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: ""
},
boolean: {
root: "sv_qbln form-inline checkbox",
item: "",
label: "",
materialDecorator: "checkbox-material"
},
checkbox: {
root: "sv_qcbc sv_qcbx form-inline",
item: "checkbox",
itemControl: "",
controlLabel: "",
materialDecorator: "checkbox-material",
other: "sv_q_checkbox_other form-control"
},
comment: "form-control",
dropdown: {
root: "",
control: "form-control",
other: "sv_q_dd_other form-control"
},
matrix: {
root: "table sv_q_matrix",
label: "sv_q_m_label",
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: ""
},
paneldynamic: {
root: "",
button: "button",
buttonPrev: "",
buttonNext: "",
buttonAdd: "",
buttonRemove: ""
},
multipletext: {
root: "table",
itemTitle: "",
itemValue: "sv_q_mt_item_value form-control"
},
radiogroup: {
root: "sv_qcbc form-inline",
item: "radio",
label: "",
itemControl: "",
controlLabel: "",
materialDecorator: "circle",
other: "sv_q_radiogroup_other form-control",
clearButton: "sv_q_radiogroup_clear button"
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
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"
},
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"
},
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;
/***/ }),
/* 59 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapMaterialCss; });
var defaultBootstrapMaterialCss = {
root: "sv_main sv_bootstrapmaterial_css",
header: "panel-heading",
body: "panel-body",
footer: "panel-footer",
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",
page: {
root: "",
title: "",
description: ""
},
pageTitle: "",
pageDescription: "small",
row: "sv_row",
question: {
mainRoot: "sv_qstn form-group",
title: "",
description: "small",
comment: "form-control",
required: "",
titleRequired: "",
hasError: "has-error",
indent: 20
},
panel: {
title: "sv_p_title",
description: "small sv_p_description",
container: "sv_p_container"
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: ""
},
boolean: {
root: "sv_qbln form-inline checkbox",
item: "",
label: "",
materialDecorator: "checkbox-material"
},
checkbox: {
root: "sv_qcbx form-inline",
item: "checkbox",
itemControl: "",
controlLabel: "",
materialDecorator: "checkbox-material",
other: "sv_q_checkbox_other form-control"
},
comment: "form-control",
dropdown: {
root: "",
control: "form-control",
other: "sv_q_dd_other form-control"
},
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"
},
matrixdropdown: { root: "table", itemValue: "form-group" },
matrixdynamic: {
root: "table",
button: "btn btn-primary",
itemValue: "form-group",
buttonAdd: "",
buttonRemove: ""
},
paneldynamic: {
root: "",
button: "btn btn-primary",
buttonPrev: "",
buttonNext: "",
buttonAdd: "",
buttonRemove: ""
},
multipletext: {
root: "table",
itemTitle: "",
row: "form-group",
itemValue: "sv_q_mt_item_value form-control"
},
radiogroup: {
root: "",
item: "radio",
label: "",
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"
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
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"
},
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"
},
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;
/***/ }),
/* 60 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_arabic__ = __webpack_require__(109);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localization_catalan__ = __webpack_require__(110);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__localization_czech__ = __webpack_require__(111);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__localization_danish__ = __webpack_require__(112);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__localization_dutch__ = __webpack_require__(113);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localization_finnish__ = __webpack_require__(114);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localization_french__ = __webpack_require__(115);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localization_georgian__ = __webpack_require__(116);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localization_german__ = __webpack_require__(117);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localization_greek__ = __webpack_require__(118);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localization_hebrew__ = __webpack_require__(119);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localization_hungarian__ = __webpack_require__(120);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__localization_icelandic__ = __webpack_require__(121);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__localization_italian__ = __webpack_require__(122);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__localization_korean__ = __webpack_require__(123);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__localization_latvian__ = __webpack_require__(124);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__localization_lithuanian__ = __webpack_require__(125);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__localization_norwegian__ = __webpack_require__(126);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__localization_persian__ = __webpack_require__(127);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__localization_polish__ = __webpack_require__(128);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__localization_portuguese__ = __webpack_require__(129);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__localization_romanian__ = __webpack_require__(130);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__localization_russian__ = __webpack_require__(131);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__localization_simplified_chinese__ = __webpack_require__(132);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__localization_spanish__ = __webpack_require__(133);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__localization_swedish__ = __webpack_require__(134);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__localization_turkish__ = __webpack_require__(136);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__localization_traditional_chinese__ = __webpack_require__(135);
/***/ }),
/* 61 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss__ = __webpack_require__(29);
/* 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__helpers__ = __webpack_require__(5);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__helpers__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__validator__ = __webpack_require__(22);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(11);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(4);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(9);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_5__error__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_5__error__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_5__error__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_5__error__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_5__error__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localizablestring__ = __webpack_require__(15);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_6__localizablestring__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__ = __webpack_require__(33);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__functionsfactory__ = __webpack_require__(36);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_8__functionsfactory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__conditions__ = __webpack_require__(10);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_9__conditions__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_9__conditions__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_9__conditions__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_9__conditions__["h"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__conditionsParser__ = __webpack_require__(34);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_10__conditionsParser__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__conditionProcessValue__ = __webpack_require__(14);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_11__conditionProcessValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__jsonobject__ = __webpack_require__(1);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["i"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["j"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["k"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__ = __webpack_require__(17);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__ = __webpack_require__(48);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__ = __webpack_require__(49);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__question_matrix__ = __webpack_require__(47);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__question_multipletext__ = __webpack_require__(50);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_17__question_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_17__question_multipletext__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__panel__ = __webpack_require__(21);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__page__ = __webpack_require__(24);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_19__page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__question__ = __webpack_require__(8);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_20__question__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__questionnonvalue__ = __webpack_require__(54);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_21__questionnonvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__question_empty__ = __webpack_require__(42);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_22__question_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__question_baseselect__ = __webpack_require__(16);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_23__question_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_23__question_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__question_checkbox__ = __webpack_require__(40);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_24__question_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__question_comment__ = __webpack_require__(41);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_25__question_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__question_dropdown__ = __webpack_require__(26);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_26__question_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__questionfactory__ = __webpack_require__(3);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_27__questionfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_27__questionfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__question_file__ = __webpack_require__(44);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_28__question_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__question_html__ = __webpack_require__(45);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_29__question_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__question_radiogroup__ = __webpack_require__(52);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_30__question_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__question_rating__ = __webpack_require__(53);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_31__question_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__question_expression__ = __webpack_require__(43);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_32__question_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__question_text__ = __webpack_require__(27);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_33__question_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__question_boolean__ = __webpack_require__(39);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_34__question_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__question_imagepicker__ = __webpack_require__(46);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_35__question_imagepicker__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__question_paneldynamic__ = __webpack_require__(51);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_36__question_paneldynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_36__question_paneldynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__surveytimer__ = __webpack_require__(57);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_37__surveytimer__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__survey__ = __webpack_require__(28);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_38__survey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__trigger__ = __webpack_require__(137);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_39__trigger__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_39__trigger__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_39__trigger__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_39__trigger__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_39__trigger__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__surveyWindow__ = __webpack_require__(56);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_40__surveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__textPreProcessor__ = __webpack_require__(18);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_41__textPreProcessor__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__dxSurveyService__ = __webpack_require__(35);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_42__dxSurveyService__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__localization_english__ = __webpack_require__(37);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_35", function() { return __WEBPACK_IMPORTED_MODULE_43__localization_english__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__surveyStrings__ = __webpack_require__(2);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_36", function() { return __WEBPACK_IMPORTED_MODULE_44__surveyStrings__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_37", function() { return __WEBPACK_IMPORTED_MODULE_44__surveyStrings__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__questionCustomWidgets__ = __webpack_require__(25);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_38", function() { return __WEBPACK_IMPORTED_MODULE_45__questionCustomWidgets__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_39", function() { return __WEBPACK_IMPORTED_MODULE_45__questionCustomWidgets__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__stylesmanager__ = __webpack_require__(55);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_40", function() { return __WEBPACK_IMPORTED_MODULE_46__stylesmanager__["a"]; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Version; });
// styles
var Version;
Version = "" + "1.0.63";
//Uncomment to include the "date" question type.
//export {default as QuestionDateModel} from "../../plugins/question_date";
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyWindow__ = __webpack_require__(56);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__kosurvey__ = __webpack_require__(20);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindow; });
var koTemplate = __webpack_require__(108);
var SurveyWindow = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyWindow, _super);
function SurveyWindow(jsonObj, initialModel) {
if (jsonObj === void 0) { jsonObj = null; }
if (initialModel === void 0) { initialModel = null; }
var _this = _super.call(this, jsonObj, initialModel) || this;
_this.koExpanded = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](false);
_this.koExpandedCss = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.getButtonCss());
var self = _this;
_this.expandedChangedCallback = function () {
self.koExpanded(self.isExpanded);
self.koExpandedCss(self.getButtonCss());
};
_this.showingChangedCallback = function () {
self.doShowingChanged();
};
_this.doExpand = function () {
self.changeExpanded();
};
return _this;
}
SurveyWindow.prototype.createSurvey = function (jsonObj) {
return new __WEBPACK_IMPORTED_MODULE_3__kosurvey__["a" /* Survey */](jsonObj);
};
SurveyWindow.prototype.closeWindowOnComplete = function () {
this.hide();
};
Object.defineProperty(SurveyWindow.prototype, "template", {
get: function () {
return this.templateValue ? this.templateValue : this.getDefaultTemplate();
},
set: function (value) {
this.templateValue = value;
},
enumerable: true,
configurable: true
});
SurveyWindow.prototype.doShowingChanged = function () {
if (this.isShowing) {
this.windowElement.innerHTML = this.template;
__WEBPACK_IMPORTED_MODULE_1_knockout__["cleanNode"](this.windowElement);
__WEBPACK_IMPORTED_MODULE_1_knockout__["applyBindings"](this, this.windowElement);
document.body.appendChild(this.windowElement);
this.survey.render(SurveyWindow.surveyElementName);
}
else {
document.body.removeChild(this.windowElement);
this.windowElement.innerHTML = "";
}
};
SurveyWindow.prototype.getDefaultTemplate = function () {
return koTemplate;
};
Object.defineProperty(SurveyWindow.prototype, "css", {
get: function () {
return this.survey["css"];
},
enumerable: true,
configurable: true
});
SurveyWindow.prototype.changeExpanded = function () {
this.expandcollapse(!this.isExpanded);
};
SurveyWindow.prototype.getButtonCss = function () {
return this.koExpanded()
? this.css.window.header.buttonCollapsed
: this.css.window.header.buttonExpanded;
};
return SurveyWindow;
}(__WEBPACK_IMPORTED_MODULE_2__surveyWindow__["a" /* SurveyWindowModel */]));
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_boolean__ = __webpack_require__(39);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* unused harmony export QuestionBooleanImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBoolean; });
var QuestionBooleanImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBooleanImplementor, _super);
function QuestionBooleanImplementor(question) {
var _this = _super.call(this, question) || this;
_this.question = question;
_this.koIndeterminate = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.isIndeterminate);
_this.koCheckedValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.checkedValue);
var self = _this;
_this.koCheckedValue.subscribe(function (newValue) {
self.updateCheckedValue(newValue);
});
_this.question["koIndeterminate"] = _this.koIndeterminate;
_this.question["koCheckedValue"] = _this.koCheckedValue;
return _this;
}
QuestionBooleanImplementor.prototype.updateCheckedValue = function (newValue) {
this.question.checkedValue = newValue;
};
return QuestionBooleanImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionBoolean = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBoolean, _super);
function QuestionBoolean(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionBooleanImplementor(_this);
return _this;
}
QuestionBoolean.prototype.getItemCss = function (row, column) {
var isChecked = this["koCheckedValue"]();
var itemClass = this["koCss"]().item + (isChecked ? " checked" : "");
return itemClass;
};
return QuestionBoolean;
}(__WEBPACK_IMPORTED_MODULE_2__question_boolean__["a" /* QuestionBooleanModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("boolean", function () {
return new QuestionBoolean("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("boolean", function (name) {
return new QuestionBoolean(name);
});
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__koquestion_baseselect__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question_checkbox__ = __webpack_require__(40);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckbox; });
var QuestionCheckboxImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckboxImplementor, _super);
function QuestionCheckboxImplementor(question) {
var _this = _super.call(this, question) || this;
_this._koValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"]();
_this._koValue.subscribe(function (newValue) {
_this.question.value = newValue;
});
Object.defineProperty(_this.question, "koValue", {
get: function () {
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isTwoValueEquals(_this._koValue(), _this.question.value)) {
_this._koValue(_this.question.value || []);
}
return _this._koValue;
},
set: function (newValue) {
var newVal = [].concat(__WEBPACK_IMPORTED_MODULE_1_knockout__["unwrap"](newValue));
_this.question.value = newVal;
},
enumerable: true,
configurable: true
});
return _this;
}
return QuestionCheckboxImplementor;
}(__WEBPACK_IMPORTED_MODULE_2__koquestion_baseselect__["b" /* QuestionCheckboxBaseImplementor */]));
var QuestionCheckbox = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckbox, _super);
function QuestionCheckbox(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isAllSelectedUpdating = false;
new QuestionCheckboxImplementor(_this);
_this.koAllSelected = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.isAllSelected);
var self = _this;
_this.koAllSelected.subscribe(function (newValue) {
if (self.isAllSelectedUpdating)
return;
if (newValue)
self.selectAll();
else
self.clearValue();
});
return _this;
}
QuestionCheckbox.prototype.onValueChanged = function () {
_super.prototype.onValueChanged.call(this);
this.updateAllSelected();
};
QuestionCheckbox.prototype.onVisibleChoicesChanged = function () {
_super.prototype.onVisibleChoicesChanged.call(this);
this.updateAllSelected();
};
QuestionCheckbox.prototype.updateAllSelected = function () {
this.isAllSelectedUpdating = true;
this.koAllSelected(this.isAllSelected);
this.isAllSelectedUpdating = false;
};
QuestionCheckbox.prototype.getItemClass = function (item) {
var val = this.value; //trigger dependencies from koValue for knockout
var isChecked = this.isItemSelected(item);
var itemClass = this.cssClasses.item +
(this.colCount === 0
? " sv_q_checkbox_inline"
: " sv-q-col-" + this.colCount);
if (isChecked)
itemClass += " checked";
return itemClass;
};
return QuestionCheckbox;
}(__WEBPACK_IMPORTED_MODULE_5__question_checkbox__["a" /* QuestionCheckboxModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("checkbox", function () {
return new QuestionCheckbox("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("checkbox", function (name) {
var q = new QuestionCheckbox(name);
q.choices = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_comment__ = __webpack_require__(41);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionComment; });
var QuestionComment = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionComment, _super);
function QuestionComment(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
return QuestionComment;
}(__WEBPACK_IMPORTED_MODULE_3__question_comment__["a" /* QuestionCommentModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("comment", function () {
return new QuestionComment("");
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) {
return new QuestionComment(name);
});
/***/ }),
/* 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__question_dropdown__ = __webpack_require__(26);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdown; });
var QuestionDropdown = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionDropdown, _super);
function QuestionDropdown(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__["a" /* QuestionSelectBaseImplementor */](_this);
return _this;
}
return QuestionDropdown;
}(__WEBPACK_IMPORTED_MODULE_1__question_dropdown__["a" /* QuestionDropdownModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("dropdown", function () {
return new QuestionDropdown("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("dropdown", function (name) {
var q = new QuestionDropdown(name);
q.choices = __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 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__question_empty__ = __webpack_require__(42);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionEmpty; });
var QuestionEmpty = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionEmpty, _super);
function QuestionEmpty(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
return QuestionEmpty;
}(__WEBPACK_IMPORTED_MODULE_1__question_empty__["a" /* QuestionEmptyModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("empty", function () {
return new QuestionEmpty("");
});
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_expression__ = __webpack_require__(43);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* unused harmony export QuestionExpressionImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpression; });
var QuestionExpressionImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionExpressionImplementor, _super);
function QuestionExpressionImplementor(question) {
var _this = _super.call(this, question) || this;
_this.question = question;
_this.koDisplayValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.displayValue);
_this.question["koDisplayValue"] = _this.koDisplayValue;
__WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
_this.koDisplayValue(_this.question.displayValue);
});
return _this;
}
return QuestionExpressionImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionExpression = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionExpression, _super);
function QuestionExpression(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionExpressionImplementor(_this);
return _this;
}
return QuestionExpression;
}(__WEBPACK_IMPORTED_MODULE_2__question_expression__["a" /* QuestionExpressionModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("expression", function () {
return new QuestionExpression("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) {
return new QuestionExpression(name);
});
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_file__ = __webpack_require__(44);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* unused harmony export QuestionFileImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFile; });
var QuestionFileImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionFileImplementor, _super);
function QuestionFileImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koState = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("empty");
_this.koHasValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () { return _this.koState() === "loaded"; });
_this.koData = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
if (_this.koHasValue()) {
return _this.question.previewValue;
}
return [];
});
_this.koInputTitle = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]();
var self = _this;
_this.question["koData"] = _this.koData;
_this.question["koHasValue"] = _this.koHasValue;
_this.question["koInputTitle"] = _this.koInputTitle;
var updateState = function (state) {
_this.koState(state);
_this.koInputTitle(_this.question.inputTitle);
};
_this.question.onStateChanged.add(function (sender, options) {
updateState(options.state);
});
_this.question["dochange"] = function (data, event) {
var src = event.target || event.srcElement;
self.onChange(src);
};
_this.question["doclean"] = function (data, event) {
var src = event.target || event.srcElement;
var input = src.parentElement.querySelectorAll("input")[0];
_this.question.clear();
input.value = "";
};
_this.question["doremovefile"] = function (data, event) {
_this.question.removeFile(data);
};
return _this;
}
QuestionFileImplementor.prototype.onChange = function (src) {
if (!window["FileReader"])
return;
if (!src || !src.files || src.files.length < 1)
return;
var files = [];
for (var i = 0; i < src.files.length; i++) {
files.push(src.files[i]);
}
src.value = "";
this.question.loadFiles(files);
};
return QuestionFileImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionFile = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionFile, _super);
function QuestionFile(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionFileImplementor(_this);
return _this;
}
return QuestionFile;
}(__WEBPACK_IMPORTED_MODULE_4__question_file__["a" /* QuestionFileModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("file", function () {
return new QuestionFile("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) {
return new QuestionFile(name);
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_html__ = __webpack_require__(45);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionHtml; });
var QuestionHtml = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionHtml, _super);
function QuestionHtml(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
return QuestionHtml;
}(__WEBPACK_IMPORTED_MODULE_4__question_html__["a" /* QuestionHtmlModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("html", function () {
return new QuestionHtml("");
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) {
return new QuestionHtml(name);
});
/***/ }),
/* 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__question_imagepicker__ = __webpack_require__(46);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionImagePicker; });
var QuestionImagePicker = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionImagePicker, _super);
function QuestionImagePicker(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionImagePicker.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
new __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__["b" /* QuestionCheckboxBaseImplementor */](this);
};
QuestionImagePicker.prototype.getItemClass = function (item) {
var itemClass = this.cssClasses.item +
(this.colCount === 0
? " sv_q_imagepicker_inline"
: " sv-q-col-" + this.colCount);
if (this.multiSelect) {
if (!!this.value && this.value.indexOf(item.value) !== -1) {
itemClass += " checked";
}
}
else {
if (!!item.value && item.value === this.value) {
itemClass += " checked";
}
}
return itemClass;
};
return QuestionImagePicker;
}(__WEBPACK_IMPORTED_MODULE_1__question_imagepicker__["a" /* QuestionImagePickerModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("imagepicker", function () {
return new QuestionImagePicker("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("imagepicker", function (name) {
var q = new QuestionImagePicker(name);
//q.choices = QuestionFactory.DefaultChoices;
return q;
});
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_matrix__ = __webpack_require__(47);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRow; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrix; });
var MatrixRow = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixRow, _super);
function MatrixRow(item, fullName, data, value) {
var _this = _super.call(this, item, fullName, data, value) || this;
_this.fullName = fullName;
_this.isValueUpdating = false;
_this.koValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.value);
var self = _this;
_this.koValue.subscribe(function (newValue) {
if (self.isValueUpdating)
true;
self.value = newValue;
});
_this.koCellClick = function (column) {
self.koValue(column.value);
};
return _this;
}
MatrixRow.prototype.onValueChanged = function () {
this.isValueUpdating = true;
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isTwoValueEquals(this.koValue(), this.value)) {
this.koValue(this.value);
}
this.isValueUpdating = false;
};
return MatrixRow;
}(__WEBPACK_IMPORTED_MODULE_2__question_matrix__["a" /* MatrixRowModel */]));
var QuestionMatrix = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrix, _super);
function QuestionMatrix(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */](_this);
_this.koVisibleRows = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.visibleRows);
_this.koVisibleColumns = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.visibleColumns);
return _this;
}
QuestionMatrix.prototype.onRowsChanged = function () {
_super.prototype.onRowsChanged.call(this);
this.koVisibleRows(this.visibleRows);
this.koVisibleColumns(this.visibleColumns);
};
QuestionMatrix.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.onRowsChanged();
};
QuestionMatrix.prototype.createMatrixRow = function (item, fullName, value) {
return new MatrixRow(item, fullName, this, value);
};
QuestionMatrix.prototype.getItemCss = function (row, column) {
var isChecked = row.koValue() == column.value;
var cellSelectedClass = this.hasCellText
? this.cssClasses.cellTextSelected
: "checked";
var cellClass = this.hasCellText
? this["koCss"]().cellText
: this["koCss"]().label;
var itemClass = cellClass + (isChecked ? " " + cellSelectedClass : "");
return itemClass;
};
return QuestionMatrix;
}(__WEBPACK_IMPORTED_MODULE_2__question_matrix__["b" /* QuestionMatrixModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("matrix", function () {
return new QuestionMatrix("");
});
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrix(name);
q.rows = __WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].DefaultRows;
q.columns = __WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].DefaultColums;
return q;
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion_matrixdropdown__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_matrixdynamic__ = __webpack_require__(49);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question_matrixdropdownbase__ = __webpack_require__(17);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDynamicImplementor; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDynamic; });
var QuestionMatrixDynamicImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDynamicImplementor, _super);
function QuestionMatrixDynamicImplementor(question) {
return _super.call(this, question) || this;
}
QuestionMatrixDynamicImplementor.prototype.hasRowText = function () {
return false;
};
QuestionMatrixDynamicImplementor.prototype.isAddRowTop = function () {
return this.question.isAddRowOnTop;
};
QuestionMatrixDynamicImplementor.prototype.isAddRowBottom = function () {
return this.question.isAddRowOnBottom;
};
QuestionMatrixDynamicImplementor.prototype.canRemoveRow = function () {
return (!this.question.isReadOnly &&
this.question.canRemoveRow);
};
QuestionMatrixDynamicImplementor.prototype.onUpdateCells = function () {
//Genereate rows again.
var rows = this.question["generatedVisibleRows"];
var columns = this.question.columns;
if (rows && rows.length > 0 && columns && columns.length > 0)
this.onColumnChanged();
};
QuestionMatrixDynamicImplementor.prototype.addRow = function () {
this.question.addRow();
};
QuestionMatrixDynamicImplementor.prototype.removeRow = function (row) {
var rows = this.question.visibleRows;
var index = rows.indexOf(row);
if (index > -1) {
this.question.removeRowUI(index);
}
};
return QuestionMatrixDynamicImplementor;
}(__WEBPACK_IMPORTED_MODULE_3__koquestion_matrixdropdown__["b" /* QuestionMatrixBaseImplementor */]));
var QuestionMatrixDynamic = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDynamic, _super);
function QuestionMatrixDynamic(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionMatrixDynamicImplementor(_this);
return _this;
}
return QuestionMatrixDynamic;
}(__WEBPACK_IMPORTED_MODULE_4__question_matrixdynamic__["a" /* QuestionMatrixDynamicModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("matrixdynamic", function () {
return new QuestionMatrixDynamic("");
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdynamic", function (name) {
var q = new QuestionMatrixDynamic(name);
q.choices = [1, 2, 3, 4, 5];
q.rowCount = 2;
__WEBPACK_IMPORTED_MODULE_5__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_multipletext__ = __webpack_require__(50);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_text__ = __webpack_require__(31);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultipleTextItem; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMultipleTextImplementor; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return QuestionMultipleText; });
var MultipleTextItem = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MultipleTextItem, _super);
function MultipleTextItem(name, title) {
if (name === void 0) { name = null; }
if (title === void 0) { title = null; }
var _this = _super.call(this, name, title) || this;
_this.name = name;
return _this;
}
MultipleTextItem.prototype.createEditor = function (name) {
return new __WEBPACK_IMPORTED_MODULE_4__koquestion_text__["a" /* QuestionText */](name);
};
return MultipleTextItem;
}(__WEBPACK_IMPORTED_MODULE_2__question_multipletext__["a" /* MultipleTextItemModel */]));
var QuestionMultipleTextImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleTextImplementor, _super);
function QuestionMultipleTextImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koRows = __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"](_this.question.getRows());
_this.question["koRows"] = _this.koRows;
_this.onColCountChanged();
var self = _this;
_this
.question.colCountChangedCallback = function () {
self.onColCountChanged();
};
return _this;
}
QuestionMultipleTextImplementor.prototype.onColCountChanged = function () {
this.koRows(this.question.getRows());
};
return QuestionMultipleTextImplementor;
}(__WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */]));
var QuestionMultipleText = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleText, _super);
function QuestionMultipleText(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionMultipleTextImplementor(_this);
return _this;
}
QuestionMultipleText.prototype.createTextItem = function (name, title) {
return new MultipleTextItem(name, title);
};
return QuestionMultipleText;
}(__WEBPACK_IMPORTED_MODULE_2__question_multipletext__["b" /* QuestionMultipleTextModel */]));
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("multipletextitem", function () {
return new MultipleTextItem("");
});
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("multipletext", function () {
return new QuestionMultipleText("");
});
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleText(name);
q.addItem("text1");
q.addItem("text2");
return q;
});
/***/ }),
/* 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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__question_paneldynamic__ = __webpack_require__(51);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__kopage__ = __webpack_require__(23);
/* unused harmony export QuestionPanelDynamicImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionPanelDynamic; });
var QuestionPanelDynamicImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamicImplementor, _super);
function QuestionPanelDynamicImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koRecalc = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
_this.koPanels = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
this.koRecalc();
return this.question.panels;
}, _this);
_this.question["koPanels"] = _this.koPanels;
var self = _this;
_this.koAddPanelClick = function () {
self.addPanel();
};
_this.koRemovePanelClick = function (data) {
self.removePanel(data);
};
_this.koPrevPanelClick = function () {
self.question.currentIndex--;
};
_this.koNextPanelClick = function () {
self.question.currentIndex++;
};
_this.koCanAddPanel = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.canAddPanel;
});
_this.koCanRemovePanel = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.canRemovePanel;
});
_this.koIsPrevButton = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isPrevButtonShowing;
});
_this.koIsNextButton = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isNextButtonShowing;
});
_this.koIsRange = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isRangeShowing;
});
_this.koPanel = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.currentPanel;
});
_this.koIsList = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isRenderModeList;
});
_this.koIsProgressTop = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isProgressTopShowing;
});
_this.koIsProgressBottom = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isProgressBottomShowing;
});
_this.koRangeValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](self.question.currentIndex);
_this.koRangeValue.subscribe(function (newValue) {
self.question.currentIndex = newValue;
});
_this.koRangeMax = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.panelCount - 1;
});
_this.question["koAddPanelClick"] = _this.koAddPanelClick;
_this.question["koRemovePanelClick"] = _this.koRemovePanelClick;
_this.question["koPrevPanelClick"] = _this.koPrevPanelClick;
_this.question["koNextPanelClick"] = _this.koNextPanelClick;
_this.question["koCanAddPanel"] = _this.koCanAddPanel;
_this.question["koCanRemovePanel"] = _this.koCanRemovePanel;
_this.question["koPanel"] = _this.koPanel;
_this.question["koIsList"] = _this.koIsList;
_this.question["koIsProgressTop"] = _this.koIsProgressTop;
_this.question["koIsProgressBottom"] = _this.koIsProgressBottom;
_this.question["koIsPrevButton"] = _this.koIsPrevButton;
_this.question["koIsNextButton"] = _this.koIsNextButton;
_this.question["koIsRange"] = _this.koIsRange;
_this.question["koRangeValue"] = _this.koRangeValue;
_this.question["koRangeMax"] = _this.koRangeMax;
_this.question["koPanelAfterRender"] = function (el, con) {
self.panelAfterRender(el, con);
};
_this
.question.panelCountChangedCallback = function () {
self.onPanelCountChanged();
};
_this
.question.renderModeChangedCallback = function () {
self.onRenderModeChanged();
};
_this
.question.currentIndexChangedCallback = function () {
self.onCurrentIndexChanged();
};
return _this;
}
QuestionPanelDynamicImplementor.prototype.onPanelCountChanged = function () {
this.onCurrentIndexChanged();
};
QuestionPanelDynamicImplementor.prototype.onRenderModeChanged = function () {
this.onCurrentIndexChanged();
};
QuestionPanelDynamicImplementor.prototype.onCurrentIndexChanged = function () {
this.koRecalc(this.koRecalc() + 1);
this.koRangeValue(this.question.currentIndex);
};
QuestionPanelDynamicImplementor.prototype.addPanel = function () {
this.question.addPanelUI();
};
QuestionPanelDynamicImplementor.prototype.removePanel = function (val) {
var q = this.question;
if (!q.isRenderModeList) {
val = q.currentPanel;
}
q.removePanelUI(val);
};
QuestionPanelDynamicImplementor.prototype.panelAfterRender = function (elements, con) {
if (!this.question || !this.question.survey)
return;
var el = __WEBPACK_IMPORTED_MODULE_2__base__["c" /* SurveyElement */].GetFirstNonTextElement(elements);
this.question.survey.afterRenderPanel(con, el);
};
return QuestionPanelDynamicImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionPanelDynamic = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamic, _super);
function QuestionPanelDynamic(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionPanelDynamicImplementor(_this);
return _this;
}
QuestionPanelDynamic.prototype.createNewPanelObject = function () {
return new __WEBPACK_IMPORTED_MODULE_7__kopage__["c" /* Panel */]();
};
return QuestionPanelDynamic;
}(__WEBPACK_IMPORTED_MODULE_6__question_paneldynamic__["a" /* QuestionPanelDynamicModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("paneldynamic", function () {
return new QuestionPanelDynamic("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) {
return new QuestionPanelDynamic(name);
});
/***/ }),
/* 76 */
/***/ (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_radiogroup__ = __webpack_require__(52);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroup; });
var QuestionRadiogroup = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRadiogroup, _super);
function QuestionRadiogroup(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__["b" /* QuestionCheckboxBaseImplementor */](_this);
return _this;
}
QuestionRadiogroup.prototype.getItemClass = function (item) {
var itemClass = this.cssClasses.item +
(this.colCount === 0
? " sv_q_radiogroup_inline"
: " sv-q-col-" + this.colCount);
if (item.value === this.value)
itemClass += " checked";
return itemClass;
};
return QuestionRadiogroup;
}(__WEBPACK_IMPORTED_MODULE_1__question_radiogroup__["a" /* QuestionRadiogroupModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("radiogroup", function () {
return new QuestionRadiogroup("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("radiogroup", function (name) {
var q = new QuestionRadiogroup(name);
q.choices = __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 77 */
/***/ (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_knockout__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_rating__ = __webpack_require__(53);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRating; });
var QuestionRatingImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRatingImplementor, _super);
function QuestionRatingImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koVisibleRateValues = __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"](_this.getValues());
_this.question["koVisibleRateValues"] = _this.koVisibleRateValues;
var self = _this;
_this.koChange = function (val) {
self.question.value = val.itemValue;
};
_this.question["koChange"] = _this.koChange;
_this.question.rateValuesChangedCallback = function () {
self.onRateValuesChanged();
};
_this.question["koGetCss"] = function (val) {
var css = self.question.cssClasses.item;
var selected = self.question.cssClasses.selected;
return _this.question.value === val.value ? css + " " + selected : css;
};
return _this;
}
QuestionRatingImplementor.prototype.onRateValuesChanged = function () {
this.koVisibleRateValues(this.getValues());
};
QuestionRatingImplementor.prototype.getValues = function () {
return this.question.visibleRateValues;
};
return QuestionRatingImplementor;
}(__WEBPACK_IMPORTED_MODULE_2__koquestion__["a" /* QuestionImplementor */]));
var QuestionRating = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRating, _super);
function QuestionRating(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionRatingImplementor(_this);
return _this;
}
return QuestionRating;
}(__WEBPACK_IMPORTED_MODULE_3__question_rating__["a" /* QuestionRatingModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */].metaData.overrideClassCreatore("rating", function () {
return new QuestionRating("");
});
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("rating", function (name) {
return new QuestionRating(name);
});
/***/ }),
/* 78 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 79 */
/***/ (function(module, exports) {
module.exports = "\n\n";
/***/ }),
/* 80 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 81 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 82 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 83 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 84 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 85 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 86 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 87 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 88 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 89 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 90 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 91 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 92 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 93 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 94 */
/***/ (function(module, exports) {
module.exports = "\n\n";
/***/ }),
/* 95 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 96 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 97 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 98 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 99 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 100 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 101 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 102 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 103 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 104 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 105 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 106 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 107 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = "" + __webpack_require__(79) + " " + __webpack_require__(78) + " " + __webpack_require__(81) + " " + __webpack_require__(82) + " " + __webpack_require__(83) + "\n" + __webpack_require__(104) + " " + __webpack_require__(105) + " " + __webpack_require__(106) + " " + __webpack_require__(80) + " " + __webpack_require__(102) + "\n" + __webpack_require__(103) + " " + __webpack_require__(85) + " " + __webpack_require__(86) + " " + __webpack_require__(87) + "\n" + __webpack_require__(89) + " " + __webpack_require__(91) + " " + __webpack_require__(92) + " " + __webpack_require__(94) + "\n" + __webpack_require__(95) + " " + __webpack_require__(98) + " " + __webpack_require__(97) + "\n" + __webpack_require__(96) + " " + __webpack_require__(99) + " " + __webpack_require__(100) + "\n" + __webpack_require__(101) + " " + __webpack_require__(84) + " " + __webpack_require__(88) + " " + __webpack_require__(90) + "\n" + __webpack_require__(93) + "";
/***/ }),
/* 108 */
/***/ (function(module, exports) {
module.exports = "\n
\n \n \n \n \n \n X\n \n
\n
\n
";
/***/ }),
/* 109 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "العربية";
/***/ }),
/* 110 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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à";
/***/ }),
/* 111 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 112 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 113 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export dutchSurveyStrings */
//Created on behalf https://github.com/Frank13
var dutchSurveyStrings = {
pagePrevText: "Vorige",
pageNextText: "Volgende",
completeText: "Verzenden",
otherItemText: "Andere",
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: "Gelieve een antwoord in te vullen",
numericError: "Het antwoord moet een getal zijn",
textMinLength: "Gelieve minsten {0} karakters in te vullen.",
minSelectError: "Gelieve minimum {0} antwoorden te selecteren.",
maxSelectError: "Gelieve niet meer dan {0} antwoorden te selecteren.",
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: "Gelieve een geldig e-mailadres in te vullen.",
exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}.",
otherRequiredError: "Gelieve het veld 'Andere' in te vullen"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["nl"] = dutchSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["nl"] = "nederlands";
/***/ }),
/* 114 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 115 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fr"] = frenchSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fr"] = "français";
/***/ }),
/* 116 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "ქართული";
/***/ }),
/* 117 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export germanSurveyStrings */
var germanSurveyStrings = {
pagePrevText: "Zurück",
pageNextText: "Weiter",
completeText: "Absenden",
progressText: "Seite {0} von {1}",
emptySurvey: "Es gibt keine sichtbare Frage.",
completingSurvey: "Vielen Dank für die Beantwortung des Fragebogens!",
loadingSurvey: "Der Fragebogen wird vom Server geladen...",
otherItemText: "Benutzerdefinierte Antwort...",
optionsCaption: "Wählen...",
requiredError: "Bitte beantworten Sie diese Frage.",
numericError: "Der Wert sollte eine Zahl sein.",
textMinLength: "Bitte geben Sie mindestens {0} Zeichen ein.",
minSelectError: "Bitte wählen Sie mindestens {0} Einträge.",
maxSelectError: "Bitte wählen Sie nicht mehr als {0} Einträge.",
numericMinMax: "'{0}' sollte gleich oder größer sein als {1} und gleich oder kleiner als {2}.",
numericMin: "'{0}' sollte gleich oder größer sein als {1}.",
numericMax: "'{0}' sollte gleich oder kleiner als {1} sein.",
invalidEmail: "Bitte geben Sie eine gültige E-Mail Adresse ein.",
exceedMaxSize: "Die Dateigröße darf {0} nicht überschreiten.",
otherRequiredError: "Bitte geben Sie Ihre benutzerdefinierte Antwort ein.",
addRow: "Reihe hinzufügen",
removeRow: "Löschen"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["de"] = germanSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["de"] = "deutsch";
/***/ }),
/* 118 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "ελληνικά";
/***/ }),
/* 119 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "עברית";
/***/ }),
/* 120 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 121 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 122 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 123 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "한국어";
/***/ }),
/* 124 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 125 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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ų";
/***/ }),
/* 126 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 127 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "فارْسِى";
/***/ }),
/* 128 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 129 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export portugueseSurveyStrings */
var portugueseSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Próximo",
completeText: "Finalizar",
otherItemText: "Outros (descrever)",
progressText: "Pagina {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.",
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.",
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.",
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"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pt"] = portugueseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["pt"] = "português";
/***/ }),
/* 130 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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ă";
/***/ }),
/* 131 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "русский";
/***/ }),
/* 132 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export simplifiedChineseSurveyStrings */
var simplifiedChineseSurveyStrings = {
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-cn"] = simplifiedChineseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["zh-cn"] = "简体中文";
/***/ }),
/* 133 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 134 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 135 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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"] = "繁體中文";
/***/ }),
/* 136 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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";
/***/ }),
/* 137 */
/***/ (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__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", 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 SurveyTriggerRunExpression */
/* unused harmony export 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_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";
};
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 triggerResult = this.conditionRunner.run(values, properties);
if (triggerResult) {
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.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 +
" " +
new __WEBPACK_IMPORTED_MODULE_4__conditions__["d" /* Operand */](this.value).toString());
};
Trigger.prototype.isCheckRequired = function (keys) {
if (!keys)
return false;
this.buildUsedNames();
for (var i = 0; i < this.usedNames.length; i++) {
if (keys.hasOwnProperty(this.usedNames[i]))
return true;
//if (keys[this.usedNames[i]] != undefined) 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__["a" /* ConditionRunner */](expression);
this.usedNames = this.conditionRunner.getVariables();
var processValue = new __WEBPACK_IMPORTED_MODULE_5__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__["a" /* Base */]));
/**
* It extends the Trigger base class and add properties required for SurveyJS classes.
*/
var SurveyTrigger = /** @class */ (function (_super) {
__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_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_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.doComplete();
};
return SurveyTriggerComplete;
}(SurveyTrigger));
var SurveyTriggerSetValue = /** @class */ (function (_super) {
__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));
var SurveyTriggerRunExpression = /** @class */ (function (_super) {
__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) {
if (!this.owner || !this.runExpression)
return;
var newValue = undefined;
var expression = new __WEBPACK_IMPORTED_MODULE_4__conditions__["h" /* ExpressionRunner */](this.runExpression);
if (expression.canRun) {
newValue = expression.run(values, properties);
}
if (!this.setToName || newValue !== undefined) {
this.owner.setTriggerValue(this.setToName, newValue, false);
}
};
return SurveyTriggerRunExpression;
}(SurveyTrigger));
var SurveyTriggerCopyValue = /** @class */ (function (_super) {
__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__["b" /* JsonObject */].metaData.addClass("trigger", [
{ name: "operator", default: "equal" },
"value",
"expression:condition"
]);
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("surveytrigger", ["name"], null, "trigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("visibletrigger", ["pages", "questions"], function () {
return new SurveyTriggerVisible();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("completetrigger", [], function () {
return new SurveyTriggerComplete();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("setvaluetrigger", ["!setToName", "setValue", "isVariable:boolean"], function () {
return new SurveyTriggerSetValue();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("copyvaluetrigger", ["!setToName", "!fromName"], function () {
return new SurveyTriggerCopyValue();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* JsonObject */].metaData.addClass("runExpressiontrigger", ["setToName", "runExpression"], function () {
return new SurveyTriggerRunExpression();
}, "surveytrigger");
/***/ }),
/* 138 */
/***/ (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__(61);
/* 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__, "Helpers", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["d"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["e"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["f"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["g"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["h"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["i"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["j"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ItemValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["k"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["l"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["m"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["n"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyElement", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["o"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["p"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "OneAnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["r"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RequreNumericError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["s"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExceedSizeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["t"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["u"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ChoicesRestfull", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["v"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["w"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Condition", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["x"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionNode", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExpressionRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["A"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionsParser", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["B"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ProcessValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["C"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["D"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonIncorrectTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["E"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadata", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["F"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadataClass", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["G"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["H"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeErrorBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["I"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObject", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["J"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObjectProperty", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["K"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonRequiredPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["L"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonUnknownPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["M"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["N"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["O"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "matrixDropdownColumnTypes", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["P"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["R"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["S"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["T"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["U"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["V"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["W"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MartrixCells", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["X"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_0"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_1"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_2"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_3"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_4"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_5"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionNonValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_6"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_7"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_8"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_9"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_10"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_11"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_12"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_13"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_14"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_15"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_16"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_17"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_18"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_19"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_20"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_21"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePickerModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_22"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_23"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_24"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_25"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_26"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_27"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_28"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_29"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_30"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_31"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_32"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_33"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "dxSurveyService", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_34"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "englishStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_35"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_36"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_37"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_38"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_39"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "StylesManager", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_40"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__chunks_localization__ = __webpack_require__(60);
/* 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 import */ var __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__ = __webpack_require__(12);
/* 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__(58);
/* 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__(59);
/* 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__main_scss__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__main_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6__main_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__ = __webpack_require__(20);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Survey", function() { return __WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Model", function() { return __WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__knockout_kobase__ = __webpack_require__(19);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ImplementorBase", function() { return __WEBPACK_IMPORTED_MODULE_8__knockout_kobase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__knockout_kopage__ = __webpack_require__(23);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRow", function() { return __WEBPACK_IMPORTED_MODULE_9__knockout_kopage__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Page", function() { return __WEBPACK_IMPORTED_MODULE_9__knockout_kopage__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Panel", function() { return __WEBPACK_IMPORTED_MODULE_9__knockout_kopage__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__knockout_koquestion__ = __webpack_require__(6);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionImplementor", function() { return __WEBPACK_IMPORTED_MODULE_10__knockout_koquestion__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion_baseselect__ = __webpack_require__(13);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBaseImplementor", function() { return __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBaseImplementor", function() { return __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_checkbox__ = __webpack_require__(64);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__knockout_koquestion_comment__ = __webpack_require__(65);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionComment", function() { return __WEBPACK_IMPORTED_MODULE_13__knockout_koquestion_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__knockout_koquestion_dropdown__ = __webpack_require__(66);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdown", function() { return __WEBPACK_IMPORTED_MODULE_14__knockout_koquestion_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__knockout_koquestion_file__ = __webpack_require__(69);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionFile", function() { return __WEBPACK_IMPORTED_MODULE_15__knockout_koquestion_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__knockout_koquestion_html__ = __webpack_require__(70);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionHtml", function() { return __WEBPACK_IMPORTED_MODULE_16__knockout_koquestion_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_matrix__ = __webpack_require__(72);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixRow", function() { return __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrix", function() { return __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_matrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrixdropdown__ = __webpack_require__(30);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdown", function() { return __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrixdropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdynamic__ = __webpack_require__(73);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicImplementor", function() { return __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_paneldynamic__ = __webpack_require__(75);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_paneldynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__ = __webpack_require__(74);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItem", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextImplementor", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_radiogroup__ = __webpack_require__(76);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__knockout_koquestion_rating__ = __webpack_require__(77);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRating", function() { return __WEBPACK_IMPORTED_MODULE_23__knockout_koquestion_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__knockout_koquestion_text__ = __webpack_require__(31);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionText", function() { return __WEBPACK_IMPORTED_MODULE_24__knockout_koquestion_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__knockout_koquestion_boolean__ = __webpack_require__(63);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionBoolean", function() { return __WEBPACK_IMPORTED_MODULE_25__knockout_koquestion_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__knockout_koquestion_empty__ = __webpack_require__(67);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionEmpty", function() { return __WEBPACK_IMPORTED_MODULE_26__knockout_koquestion_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__knockout_koquestion_expression__ = __webpack_require__(68);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionExpression", function() { return __WEBPACK_IMPORTED_MODULE_27__knockout_koquestion_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__knockout_koquestion_imagepicker__ = __webpack_require__(71);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePicker", function() { return __WEBPACK_IMPORTED_MODULE_28__knockout_koquestion_imagepicker__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__knockout_koSurveyWindow__ = __webpack_require__(62);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyWindow", function() { return __WEBPACK_IMPORTED_MODULE_29__knockout_koSurveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__knockout_templateText__ = __webpack_require__(32);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTemplateText", function() { return __WEBPACK_IMPORTED_MODULE_30__knockout_templateText__["a"]; });
// model
// localization
// helpers
// css standard
// css bootstrap
// css bootstrap + material
// styles
// knockout
//Uncomment to include the "date" question type.
//export {QuestionDate} from "../plugins/knockout/koquestion_date";
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA0NmI4YjNlZjhhYmEwOGUzNWE5NiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25mYWN0b3J5LnRzIiwid2VicGFjazovLy8uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uLnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJrb1wiLFwiY29tbW9uanMyXCI6XCJrbm9ja291dFwiLFwiY29tbW9uanNcIjpcImtub2Nrb3V0XCIsXCJhbWRcIjpcImtub2Nrb3V0XCJ9Iiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmRpdGlvbnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2l0ZW12YWx1ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25Qcm9jZXNzVmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphYmxlc3RyaW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy92YWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcGFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25DdXN0b21XaWRnZXRzLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9tYWluLnNjc3MiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVUZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9jaG9pY2VzUmVzdGZ1bGwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmRpdGlvbnNQYXJzZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2R4U3VydmV5U2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZnVuY3Rpb25zZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2VuZ2xpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21hcnRpeEJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZmlsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25faHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25faW1hZ2VwaWNrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9yYXRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9ubm9udmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N0eWxlc21hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleVdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5dGltZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9sb2NhbGl6YXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb1N1cnZleVdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9ib29sZWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZW1wdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25faW1hZ2VwaWNrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX21hdHJpeGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3JhdGluZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2NvbW1lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2luZGV4Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9tYXRyaXhjZWxsLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9wYWdlLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9wYW5lbC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcHJvZ3Jlc3MuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWJvb2xlYW4uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWNoZWNrYm94Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jb21tZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1kcm9wZG93bi5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZW1wdHkuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWVycm9ycy5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZXhwcmVzc2lvbi5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZmlsZS5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24taHRtbC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24taW1hZ2VwaWNrZXIuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbWF0cml4ZHluYW1pYy5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbXVsdGlwbGV0ZXh0Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1wYW5lbGR5bmFtaWMtbmF2aWdhdG9yLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1wYW5lbGR5bmFtaWMuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhZGlvZ3JvdXAuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhdGluZy5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tdGV4dC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9udGl0bGUuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3Jvd3MuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3N0cmluZy5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvdGltZXJwYW5lbC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvZW50cnkuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3dpbmRvdy93aW5kb3cuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2NhdGFsYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9jemVjaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2R1dGNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2dlb3JnaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9oZWJyZXcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9odW5nYXJpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pY2VsYW5kaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24va29yZWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vbGF0dmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2xpdGh1YW5pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wZXJzaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcG9ydHVndWVzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3JvbWFuaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9zd2VkaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyaWdnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMva25vY2tvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaEVPLElBQUksUUFBUSxHQUNYLE1BQU8sQ0FBQyxRQUFRLENBQUM7SUFDdkIsVUFBUyxNQUFXO1FBQ2xCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BELENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsR0FBRyxDQUFDLENBQUMsSUFB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QU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBQ0gsOEJBQUM7QUFBRCxDQUFDLENBNUg0QywyREFBUSxHQTRIcEQ7O0FBRUQ7SUFDRSxNQUFNLENBQUM7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFD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aUQ7QUFDakUsMkJBQTJCO0FBR2lCO0FBQzVDLFNBQVM7QUFDYTtBQUV0QixXQUFXO0FBQ21DO0FBQ1M7QUFDRjtBQUNTO0FBQ0Q7QUFHbEI7QUFHQTtBQUN3QjtBQUNGO0FBQ0U7QUFDUjtBQUNBO0FBQ2U7QUFDSztBQUlqQztBQUM2QjtBQUs5QjtBQUMwQjtBQUNSO0FBQ0o7QUFDTTtBQUNKO0FBQ1U7QUFDRTtBQUNmO0FBQ0k7QUFFOUQsZ0RBQWdEO0FBQ2hELG1FQUFtRSIsImZpbGUiOiIuL3BhY2thZ2VzL3N1cnZleS1rbm9ja291dC9zdXJ2ZXkua28uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleVwiLCBbXCJrbm9ja291dFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5XCJdID0gZmFjdG9yeShyb290W1wia29cIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV83X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTM4KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA0NmI4YjNlZjhhYmEwOGUzNWE5NiIsImV4cG9ydCB2YXIgX19hc3NpZ24gPVxuICAoPGFueT5PYmplY3QpW1wiYXNzaWduXCJdIHx8XG4gIGZ1bmN0aW9uKHRhcmdldDogYW55KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIgcCBpbiBzKVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0YXJnZXRbcF0gPSBzW3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKHRoaXNDbGFzczogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICBmb3IgKHZhciBwIGluIGJhc2VDbGFzcylcbiAgICBpZiAoYmFzZUNsYXNzLmhhc093blByb3BlcnR5KHApKSB0aGlzQ2xhc3NbcF0gPSBiYXNlQ2xhc3NbcF07XG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSB0aGlzQ2xhc3M7XG4gIH1cbiAgdGhpc0NsYXNzLnByb3RvdHlwZSA9XG4gICAgYmFzZUNsYXNzID09PSBudWxsXG4gICAgICA/IE9iamVjdC5jcmVhdGUoYmFzZUNsYXNzKVxuICAgICAgOiAoKF9fLnByb3RvdHlwZSA9IGJhc2VDbGFzcy5wcm90b3R5cGUpLCBuZXcgKDxhbnk+X18pKCkpO1xufVxuXG5kZWNsYXJlIHZhciBSZWZsZWN0OmFueTtcblxuZXhwb3J0IHZhciBfX2RlY29yYXRlID0gZnVuY3Rpb24oXG4gIGRlY29yYXRvcnM6IGFueSxcbiAgdGFyZ2V0OiBhbnksXG4gIGtleTogYW55LFxuICBkZXNjOiBhbnlcbikge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgM1xuICAgICAgICA/IHRhcmdldFxuICAgICAgICA6IGRlc2MgPT09IG51bGxcbiAgICAgICAgICA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpXG4gICAgICAgICAgOiBkZXNjLFxuICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpXG4gICAgICAgIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0UHJvcGVydHkgaW1wbGVtZW50cyBJT2JqZWN0IHtcbiAgcHVibGljIHN0YXRpYyBnZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlOiAodmFsOiBhbnkpID0+IGFueTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBtZXJnYWJsZVZhbHVlcyA9IFtcbiAgICBcInR5cGVWYWx1ZVwiLFxuICAgIFwiY2hvaWNlc1ZhbHVlXCIsXG4gICAgXCJyZWFkT25seVZhbHVlXCIsXG4gICAgXCJ2aXNpYmxlVmFsdWVcIixcbiAgICBcImlzU2VyaWFsaXphYmxlXCIsXG4gICAgXCJpc0R5bmFtaWNDaG9pY2VzXCIsXG4gICAgXCJpc0xvY2FsaXphYmxlVmFsdWVcIixcbiAgICBcImNsYXNzTmFtZVwiLFxuICAgIFwiYWx0ZXJuYXRpdmVOYW1lXCIsXG4gICAgXCJjbGFzc05hbWVQYXJ0XCIsXG4gICAgXCJiYXNlQ2xhc3NOYW1lXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVcIixcbiAgICBcInNlcmlhbGl6YXRpb25Qcm9wZXJ0eVwiLFxuICAgIFwib25HZXRWYWx1ZVwiLFxuICAgIFwib25TZXRWYWx1ZVwiXG4gIF07XG4gIHByaXZhdGUgdHlwZVZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNob2ljZXNWYWx1ZTogQXJyYXk8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgaXNSZXF1aXJlZFZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpc2libGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzTG9jYWxpemFibGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNob2ljZXNmdW5jOiAob2JqOiBhbnkpID0+IEFycmF5PGFueT4gPSBudWxsO1xuICBwdWJsaWMgaXNTZXJpYWxpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaXNEeW5hbWljQ2hvaWNlczogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgYWx0ZXJuYXRpdmVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgY2xhc3NOYW1lUGFydDogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBkZWZhdWx0VmFsdWVWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHVibGljIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIG9uR2V0VmFsdWU6IChvYmo6IGFueSkgPT4gYW55ID0gbnVsbDtcbiAgcHVibGljIG9uU2V0VmFsdWU6IChvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnY6IEpzb25PYmplY3QpID0+IGFueSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5pc1JlcXVpcmVkVmFsdWUgPSBpc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGVWYWx1ZSA/IHRoaXMudHlwZVZhbHVlIDogXCJzdHJpbmdcIjtcbiAgfVxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJpdGVtdmFsdWVzXCIpIHZhbHVlID0gXCJpdGVtdmFsdWVbXVwiO1xuICAgIHRoaXMudHlwZVZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMudHlwZVZhbHVlLmluZGV4T2YoXCJbXVwiKSA9PT0gdGhpcy50eXBlVmFsdWUubGVuZ3RoIC0gMikge1xuICAgICAgdGhpcy5pc0FycmF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy50eXBlVmFsdWUuc3Vic3RyKDAsIHRoaXMudHlwZVZhbHVlLmxlbmd0aCAtIDIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNBcnJheSA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvVXNlR2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMub25HZXRWYWx1ZSB8fCB0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpIHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB0aGlzLmRlZmF1bHRWYWx1ZVZhbHVlO1xuICAgIGlmIChcbiAgICAgICEhSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUgJiZcbiAgICAgIEpzb25PYmplY3QubWV0YURhdGEuaXNEZXNjZW5kYW50T2YodGhpcy5jbGFzc05hbWUsIFwiaXRlbXZhbHVlXCIpXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSBKc29uT2JqZWN0UHJvcGVydHkuZ2V0SXRlbVZhbHVlc0RlZmF1bHRWYWx1ZShcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVWYWx1ZSB8fCBbXVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZShuZXdWYWx1ZSkge1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgaXNEZWZhdWx0VmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpKVxuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlID09IHZhbHVlO1xuICAgIHJldHVybiAoXG4gICAgICAodmFsdWUgPT09IGZhbHNlICYmIHRoaXMudHlwZSA9PSBcImJvb2xlYW5cIikgfHxcbiAgICAgIHZhbHVlID09PSBcIlwiIHx8XG4gICAgICBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMub25HZXRWYWx1ZSkgcmV0dXJuIHRoaXMub25HZXRWYWx1ZShvYmopO1xuICAgIGlmICh0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSlcbiAgICAgIHJldHVybiBvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldLmdldEpzb24oKTtcbiAgICByZXR1cm4gb2JqW3RoaXMubmFtZV07XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnR5VmFsdWUob2JqOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzTG9jYWxpemFibGUpIHJldHVybiBvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldLnRleHQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUob2JqKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvVXNlU2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMub25TZXRWYWx1ZSB8fCB0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSB7XG4gICAgaWYgKHRoaXMub25TZXRWYWx1ZSkge1xuICAgICAgdGhpcy5vblNldFZhbHVlKG9iaiwgdmFsdWUsIGpzb25Db252KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5KVxuICAgICAgICBvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldLnNldEpzb24odmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvYmpbdGhpcy5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0T2JqVHlwZShvYmpUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NOYW1lUGFydCkgcmV0dXJuIG9ialR5cGU7XG4gICAgcmV0dXJuIG9ialR5cGUucmVwbGFjZSh0aGlzLmNsYXNzTmFtZVBhcnQsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjbGFzc05hbWUpIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmNsYXNzTmFtZVBhcnQgJiYgY2xhc3NOYW1lLmluZGV4T2YodGhpcy5jbGFzc05hbWVQYXJ0KSA8IDBcbiAgICAgID8gY2xhc3NOYW1lICsgdGhpcy5jbGFzc05hbWVQYXJ0XG4gICAgICA6IGNsYXNzTmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hvaWNlcyhudWxsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2hvaWNlcyhvYmo6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIGlmICh0aGlzLmNob2ljZXNWYWx1ZSAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XG4gICAgaWYgKHRoaXMuY2hvaWNlc2Z1bmMgIT0gbnVsbCkgcmV0dXJuIHRoaXMuY2hvaWNlc2Z1bmMob2JqKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0Q2hvaWNlcyh2YWx1ZTogQXJyYXk8YW55PiwgdmFsdWVGdW5jOiAoKSA9PiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5jaG9pY2VzVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNob2ljZXNmdW5jID0gdmFsdWVGdW5jO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHlWYWx1ZSAhPSBudWxsID8gdGhpcy5yZWFkT25seVZhbHVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlYWRPbmx5VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVWYWx1ZSAhPSBudWxsID8gdGhpcy52aXNpYmxlVmFsdWUgOiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9jYWxpemFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNMb2NhbGl6YWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgbWVyZ2VXaXRoKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHZhciB2YWx1ZXNOYW1lcyA9IEpzb25PYmplY3RQcm9wZXJ0eS5tZXJnYWJsZVZhbHVlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1lcmdlVmFsdWUocHJvcCwgdmFsdWVzTmFtZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG1lcmdlVmFsdWUocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCB2YWx1ZU5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzW3ZhbHVlTmFtZV0gPT0gbnVsbCAmJiBwcm9wW3ZhbHVlTmFtZV0gIT0gbnVsbCkge1xuICAgICAgdGhpc1t2YWx1ZU5hbWVdID0gcHJvcFt2YWx1ZU5hbWVdO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcHJvcGVydGllczogSU9iamVjdCA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBwYXJlbnRDbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHB1YmxpYyBzdGF0aWMgYWRkUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5OiBhbnkpIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIGlmICghcHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgcHJvcHNbY2xhc3NOYW1lXSA9IFtdO1xuICAgIH1cbiAgICBwcm9wc1tjbGFzc05hbWVdLnB1c2gocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgcmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAoIXByb3BzW2NsYXNzTmFtZV0pIHJldHVybjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BzW2NsYXNzTmFtZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5uYW1lID09IHByb3BlcnR5TmFtZSkge1xuICAgICAgICBwcm9wc1tjbGFzc05hbWVdLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHBhcmVudENsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHBhcmVudENsYXNzTmFtZSkge1xuICAgICAgcGFyZW50Q2xhc3NOYW1lID0gcGFyZW50Q2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXSA9IHBhcmVudENsYXNzTmFtZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICB3aGlsZSAoY2xhc3NOYW1lKSB7XG4gICAgICB2YXIgcHJvcGVydGllcyA9IHByb3BzW2NsYXNzTmFtZV07XG4gICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3NOYW1lID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhvYmo6IGFueSkge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuO1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iaiwgb2JqLmdldFR5cGUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0NvcmUob2JqOiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAocHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0luT2JqKG9iaiwgcHJvcHNbY2xhc3NOYW1lXSk7XG4gICAgfVxuICAgIHZhciBwYXJlbnRDbGFzcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXTtcbiAgICBpZiAocGFyZW50Q2xhc3MpIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iaiwgcGFyZW50Q2xhc3MpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzSW5PYmoob2JqOiBhbnksIHByb3BlcnRpZXM6IGFueVtdKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0eUluT2JqKG9iaiwgcHJvcGVydGllc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnR5SW5PYmoob2JqOiBhbnksIHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIGlmIChvYmpbcHJvcC5uYW1lXSB8fCBvYmouaGFzT3duUHJvcGVydHkocHJvcC5uYW1lKSkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIHByb3AuaXNMb2NhbGl6YWJsZSAmJlxuICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiZcbiAgICAgICFvYmpbcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHldICYmXG4gICAgICBvYmouY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmpcbiAgICApIHtcbiAgICAgIG9iai5jcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9iaihwcm9wLm5hbWUpO1xuICAgICAgdmFyIGxvY0Rlc2MgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5nZXRMb2NhbGl6YWJsZVN0cmluZyhwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHksIGxvY0Rlc2MpO1xuICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQocHJvcC5uYW1lLCBwcm9wLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odjogYW55KSB7XG4gICAgICAgICAgb2JqLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChwcm9wLm5hbWUsIHYpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3AuZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKFxuICAgICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKHByb3AuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKSAmJlxuICAgICAgICB0eXBlb2Ygb2JqLmNyZWF0ZU5ld0FycmF5ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICkge1xuICAgICAgICBvYmouY3JlYXRlTmV3QXJyYXkocHJvcC5uYW1lLCBmdW5jdGlvbihpdGVtOiBhbnkpIHtcbiAgICAgICAgICBpdGVtLmxvY093bmVyID0gb2JqO1xuICAgICAgICB9KTtcbiAgICAgICAgb2JqLnNldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCEhb2JqLmdldFByb3BlcnR5VmFsdWUgJiYgISFvYmouc2V0UHJvcGVydHlWYWx1ZSkge1xuICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvYmouZ2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHY6IGFueSkge1xuICAgICAgICAgICAgb2JqLnNldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AubmFtZSwgZGVzYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGFDbGFzcyB7XG4gIHN0YXRpYyByZXF1aXJlZFN5bWJvbCA9IFwiIVwiO1xuICBzdGF0aWMgdHlwZVN5bWJvbCA9IFwiOlwiO1xuICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+LFxuICAgIHB1YmxpYyBjcmVhdG9yOiAoanNvbj86IGFueSkgPT4gYW55ID0gbnVsbCxcbiAgICBwdWJsaWMgcGFyZW50TmFtZTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uYWRkQ2xhc3MobmFtZSwgcGFyZW50TmFtZSk7XG4gICAgfVxuICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMuY3JlYXRlUHJvcGVydHkocHJvcGVydGllc1tpXSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGZpbmQobmFtZTogc3RyaW5nKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLnByb3BlcnRpZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVQcm9wZXJ0eShwcm9wSW5mbzogYW55KTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gdHlwZW9mIHByb3BJbmZvID09PSBcInN0cmluZ1wiID8gcHJvcEluZm8gOiBwcm9wSW5mby5uYW1lO1xuICAgIGlmICghcHJvcGVydHlOYW1lKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnR5VHlwZSA9IG51bGw7XG4gICAgdmFyIHR5cGVJbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKEpzb25NZXRhZGF0YUNsYXNzLnR5cGVTeW1ib2wpO1xuICAgIGlmICh0eXBlSW5kZXggPiAtMSkge1xuICAgICAgcHJvcGVydHlUeXBlID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyh0eXBlSW5kZXggKyAxKTtcbiAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgdHlwZUluZGV4KTtcbiAgICB9XG4gICAgdmFyIGlzUmVxdWlyZWQgPSB0aGlzLmdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lKTtcbiAgICBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpO1xuICAgIHZhciBwcm9wID0gbmV3IEpzb25PYmplY3RQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGlzUmVxdWlyZWQpO1xuICAgIGlmIChwcm9wZXJ0eVR5cGUpIHtcbiAgICAgIHByb3AudHlwZSA9IHByb3BlcnR5VHlwZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKHByb3BJbmZvLnR5cGUpIHtcbiAgICAgICAgcHJvcC50eXBlID0gcHJvcEluZm8udHlwZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uZGVmYXVsdCkpIHtcbiAgICAgICAgcHJvcC5kZWZhdWx0VmFsdWUgPSBwcm9wSW5mby5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc1NlcmlhbGl6YWJsZSkpIHtcbiAgICAgICAgcHJvcC5pc1NlcmlhbGl6YWJsZSA9IHByb3BJbmZvLmlzU2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc0R5bmFtaWNDaG9pY2VzKSkge1xuICAgICAgICBwcm9wLmlzRHluYW1pY0Nob2ljZXMgPSBwcm9wSW5mby5pc0R5bmFtaWNDaG9pY2VzO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHByb3AudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNob2ljZXMpIHtcbiAgICAgICAgdmFyIGNob2ljZXNGdW5jID1cbiAgICAgICAgICB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyA9PT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgIHZhciBjaG9pY2VzVmFsdWUgPVxuICAgICAgICAgIHR5cGVvZiBwcm9wSW5mby5jaG9pY2VzICE9PSBcImZ1bmN0aW9uXCIgPyBwcm9wSW5mby5jaG9pY2VzIDogbnVsbDtcbiAgICAgICAgcHJvcC5zZXRDaG9pY2VzKGNob2ljZXNWYWx1ZSwgY2hvaWNlc0Z1bmMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLm9uR2V0VmFsdWUpIHtcbiAgICAgICAgcHJvcC5vbkdldFZhbHVlID0gcHJvcEluZm8ub25HZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5vblNldFZhbHVlKSB7XG4gICAgICAgIHByb3Aub25TZXRWYWx1ZSA9IHByb3BJbmZvLm9uU2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBcImxvY1wiICsgcHJvcEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkpIHtcbiAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gICAgICAgIHZhciBzOiBzdHJpbmc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJlxuICAgICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LmluZGV4T2YoXCJsb2NcIikgPT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSBwcm9wSW5mby5pc0xvY2FsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNsYXNzTmFtZSkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZSA9IHByb3BJbmZvLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3AuYmFzZUNsYXNzTmFtZSA9IHByb3BJbmZvLmJhc2VDbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uY2xhc3NOYW1lUGFydCkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZVBhcnQgPSBwcm9wSW5mby5jbGFzc05hbWVQYXJ0O1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZSkge1xuICAgICAgICBwcm9wLmFsdGVybmF0aXZlTmFtZSA9IHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3BlcnR5TmFtZS5sZW5ndGggPiAwICYmXG4gICAgICBwcm9wZXJ0eU5hbWVbMF0gPT0gSnNvbk1ldGFkYXRhQ2xhc3MucmVxdWlyZWRTeW1ib2xcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZ2V0SXNQcm9wZXJ0eU5hbWVSZXF1aXJlZChwcm9wZXJ0eU5hbWUpKSByZXR1cm4gcHJvcGVydHlOYW1lO1xuICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zbGljZSgxKTtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1ldGFkYXRhIHtcbiAgcHJpdmF0ZSBjbGFzc2VzOiBIYXNoVGFibGU8SnNvbk1ldGFkYXRhQ2xhc3M+ID0ge307XG4gIHByaXZhdGUgYWx0ZXJuYXRpdmVOYW1lczogSGFzaFRhYmxlPHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBjaGlsZHJlbkNsYXNzZXM6IEhhc2hUYWJsZTxBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4+ID0ge307XG4gIHByaXZhdGUgY2xhc3NQcm9wZXJ0aWVzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk9iamVjdFByb3BlcnR5Pj4gPSB7fTtcbiAgcHVibGljIGFkZENsYXNzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+LFxuICAgIGNyZWF0b3I6IChqc29uPzogYW55KSA9PiBhbnkgPSBudWxsLFxuICAgIHBhcmVudE5hbWU6IHN0cmluZyA9IG51bGxcbiAgKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSBuZXcgSnNvbk1ldGFkYXRhQ2xhc3MoXG4gICAgICBuYW1lLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGNyZWF0b3IsXG4gICAgICBwYXJlbnROYW1lXG4gICAgKTtcbiAgICB0aGlzLmNsYXNzZXNbbmFtZV0gPSBtZXRhRGF0YUNsYXNzO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV07XG4gICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXS5wdXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YURhdGFDbGFzcztcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGVDbGFzc0NyZWF0b3JlKG5hbWU6IHN0cmluZywgY3JlYXRvcjogKCkgPT4gYW55KSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzKSB7XG4gICAgICBtZXRhRGF0YUNsYXNzLmNyZWF0b3IgPSBjcmVhdG9yO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllcyhjbGFzc05hbWU6IHN0cmluZyk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBtZXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghbWV0YUNsYXNzKSByZXR1cm4gW107XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmNsYXNzUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV07XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICBwcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcbiAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMobWV0YUNsYXNzLm5hbWUsIHByb3BlcnRpZXMpO1xuICAgICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdID0gcHJvcGVydGllcztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXREeW5hbWljUHJvcGVydGllcyhvYmo6IGFueSk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmIChvYmouZ2V0RHluYW1pY1Byb3BlcnRpZXMgJiYgb2JqLmdldER5bmFtaWNUeXBlKSB7XG4gICAgICB2YXIgbmFtZXMgPSBvYmouZ2V0RHluYW1pY1Byb3BlcnRpZXMoKTtcbiAgICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhLmZpbmRQcm9wZXJ0aWVzKG9iai5nZXREeW5hbWljVHlwZSgpLCBuYW1lcyk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllc0J5T2JqKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlKSByZXR1cm4gW107XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBwcm9wcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhvYmouZ2V0VHlwZSgpKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wc1tpXSk7XG4gICAgfVxuICAgIHZhciBkeW5hbWljUHJvcHMgPSB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaik7XG4gICAgaWYgKGR5bmFtaWNQcm9wcyAmJiBkeW5hbWljUHJvcHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnB1c2goZHluYW1pY1Byb3BzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUHJvcGVydHkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvcGVydHlDb3JlKHRoaXMuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG4gIHB1YmxpYyBmaW5kUHJvcGVydGllcyhcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWVzOiBBcnJheTxzdHJpbmc+XG4gICk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSB0aGlzLmZpbmRQcm9wZXJ0eUNvcmUocHJvcGVydGllcywgcHJvcGVydHlOYW1lc1tpXSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICByZXN1bHQucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGZpbmRQcm9wZXJ0eUNvcmUoXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuICApOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0ubmFtZSA9PSBwcm9wZXJ0eU5hbWUpIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlQ2xhc3MobmFtZTogc3RyaW5nLCBqc29uOiBhbnkgPSB1bmRlZmluZWQpOiBhbnkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBudWxsO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLmNyZWF0b3IpIHJldHVybiBtZXRhRGF0YUNsYXNzLmNyZWF0b3IoanNvbik7XG4gICAgdmFyIHBhcmVudE5hbWUgPSBtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWU7XG4gICAgd2hpbGUgKHBhcmVudE5hbWUpIHtcbiAgICAgIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhwYXJlbnROYW1lKTtcbiAgICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgICBwYXJlbnROYW1lID0gbWV0YURhdGFDbGFzcy5wYXJlbnROYW1lO1xuICAgICAgaWYgKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcilcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3VzdG9tVHlwZShuYW1lLCBtZXRhRGF0YUNsYXNzLmNyZWF0b3IsIGpzb24pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUN1c3RvbVR5cGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWF0b3I6IGFueSxcbiAgICBqc29uOiBhbnkgPSB1bmRlZmluZWRcbiAgKTogYW55IHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXMgPSBjcmVhdG9yKGpzb24pO1xuICAgIHZhciBjdXN0b21UeXBlTmFtZSA9IG5hbWU7XG4gICAgdmFyIGN1c3RvbVRlbXBsYXRlTmFtZSA9IHJlcy5nZXRUZW1wbGF0ZVxuICAgICAgPyByZXMuZ2V0VGVtcGxhdGUoKVxuICAgICAgOiByZXMuZ2V0VHlwZSgpO1xuICAgIHJlcy5nZXRUeXBlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVHlwZU5hbWU7XG4gICAgfTtcbiAgICByZXMuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjdXN0b21UZW1wbGF0ZU5hbWU7XG4gICAgfTtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q2hpbGRyZW5DbGFzc2VzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYW5CZUNyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4ge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+ID0gW107XG4gICAgdGhpcy5maWxsQ2hpbGRyZW5DbGFzc2VzKG5hbWUsIGNhbkJlQ3JlYXRlZCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBnZXRSZXF1aXJlZFByb3BlcnRpZXMobmFtZTogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMobmFtZSk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0uaXNSZXF1aXJlZCkge1xuICAgICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBhZGRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzSW5mb3M6IEFycmF5PGFueT4pIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkQ3VzdG9tUHJvcGVydHlDb3JlKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnRpZXNJbmZvc1tpXSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlJbmZvOiBhbnkpIHtcbiAgICB0aGlzLmFkZEN1c3RvbVByb3BlcnR5Q29yZSh0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpLCBwcm9wZXJ0eUluZm8pO1xuICB9XG4gIHByaXZhdGUgYWRkQ3VzdG9tUHJvcGVydHlDb3JlKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5SW5mbzogYW55XG4gICkge1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eSA9IG1ldGFEYXRhQ2xhc3MuY3JlYXRlUHJvcGVydHkocHJvcGVydHlJbmZvKTtcbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlUb0NsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcbiAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uYWRkUHJvcGVydHkobWV0YURhdGFDbGFzcy5uYW1lLCBwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyByZW1vdmVQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHByb3BlcnR5ID0gbWV0YURhdGFDbGFzcy5maW5kKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICB0aGlzLnJlbW92ZVByb3BlcnR5RnJvbUNsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcbiAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucmVtb3ZlUHJvcGVydHkoXG4gICAgICAgIG1ldGFEYXRhQ2xhc3MubmFtZSxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5VG9DbGFzcyhcbiAgICBtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcyxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHkubmFtZSkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVByb3BlcnR5RnJvbUNsYXNzKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgdmFyIGluZGV4ID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICBwcml2YXRlIGVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcykge1xuICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFEYXRhQ2xhc3MubmFtZV0gPSBudWxsO1xuICAgIHZhciBjaGlsZENsYXNzZXMgPSB0aGlzLmdldENoaWxkcmVuQ2xhc3NlcyhtZXRhRGF0YUNsYXNzLm5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1tjaGlsZENsYXNzZXNbaV0ubmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbGxDaGlsZHJlbkNsYXNzZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhbkJlQ3JlYXRlZDogYm9vbGVhbixcbiAgICByZXN1bHQ6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPlxuICApIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1tuYW1lXTtcbiAgICBpZiAoIWNoaWxkcmVuKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjYW5CZUNyZWF0ZWQgfHwgY2hpbGRyZW5baV0uY3JlYXRvcikge1xuICAgICAgICByZXN1bHQucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMoY2hpbGRyZW5baV0ubmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZmluZENsYXNzKG5hbWU6IHN0cmluZyk6IEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXMgPSB0aGlzLmNsYXNzZXNbbmFtZV07XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHZhciBuZXdOYW1lID0gdGhpcy5hbHRlcm5hdGl2ZU5hbWVzW25hbWVdO1xuICAgICAgaWYgKCEhbmV3TmFtZSAmJiBuZXdOYW1lICE9IG5hbWUpIHJldHVybiB0aGlzLmZpbmRDbGFzcyhuZXdOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgaXNEZXNjZW5kYW50T2YoY2xhc3NOYW1lOiBzdHJpbmcsIGFuY2VzdG9yQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSB8fCAhYW5jZXN0b3JDbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgYW5jZXN0b3JDbGFzc05hbWUgPSBhbmNlc3RvckNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjbGFzc18gPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghY2xhc3NfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBwYXJlbnRDbGFzcyA9IGNsYXNzXztcbiAgICBkbyB7XG4gICAgICBpZiAocGFyZW50Q2xhc3MubmFtZSA9PT0gYW5jZXN0b3JDbGFzc05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBwYXJlbnRDbGFzcyA9IHRoaXMuY2xhc3Nlc1twYXJlbnRDbGFzcy5wYXJlbnROYW1lXTtcbiAgICB9IHdoaWxlICghIXBhcmVudENsYXNzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFkZEFsdGVyTmF0aXZlQ2xhc3NOYW1lKG5hbWU6IHN0cmluZywgYWx0ZXJuYXRpdmVOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFsdGVybmF0aXZlTmFtZXNbYWx0ZXJuYXRpdmVOYW1lLnRvTG93ZXJDYXNlKCldID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHByaXZhdGUgZmlsbFByb3BlcnRpZXMobmFtZTogc3RyaW5nLCBsaXN0OiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KSB7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybjtcbiAgICBpZiAobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lKSB7XG4gICAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzKG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZSwgbGlzdCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZFByb3BlcnR5Q29yZShtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXNbaV0sIGxpc3QsIGxpc3QubGVuZ3RoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eUNvcmUoXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBsaXN0OiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIGVuZEluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmRJbmRleDsgaSsrKSB7XG4gICAgICBpZiAobGlzdFtpXS5uYW1lID09IHByb3BlcnR5Lm5hbWUpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgbGlzdC5wdXNoKHByb3BlcnR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcGVydHkubWVyZ2VXaXRoKGxpc3RbaW5kZXhdKTtcbiAgICAgIGxpc3RbaW5kZXhdID0gcHJvcGVydHk7XG4gICAgfVxuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbkVycm9yIHtcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgYXQ6IE51bWJlciA9IC0xO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7fVxuICBwdWJsaWMgZ2V0RnVsbERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSArICh0aGlzLmRlc2NyaXB0aW9uID8gXCJcXG5cIiArIHRoaXMuZGVzY3JpcHRpb24gOiBcIlwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25Vbmtub3duUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInVua25vd25wcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInIGluIGNsYXNzICdcIiArXG4gICAgICAgIGNsYXNzTmFtZSArXG4gICAgICAgIFwiJyBpcyB1bmtub3duLlwiXG4gICAgKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJUaGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvcGVydGllcyBhcmU6IFwiO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gcHJvcGVydGllc1tpXS5uYW1lO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBcIi5cIjtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2UgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmcsXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcih0eXBlLCBtZXNzYWdlKTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBhdmFpbGFibGU6IFwiO1xuICAgIHZhciB0eXBlcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0Q2hpbGRyZW5DbGFzc2VzKGJhc2VDbGFzc05hbWUsIHRydWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiJ1wiICsgdHlwZXNbaV0ubmFtZSArIFwiJ1wiO1xuICAgIH1cbiAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLlwiO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1pc3NpbmdUeXBlRXJyb3IgZXh0ZW5kcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBcIm1pc3Npbmd0eXBlcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgbWlzc2luZyBpbiB0aGUgb2JqZWN0LiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgcHJvcGVydHk6ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJy5cIlxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uSW5jb3JyZWN0VHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBiYXNlQ2xhc3NOYW1lLFxuICAgICAgXCJpbmNvcnJlY3R0eXBlcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgaW5jb3JyZWN0IGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgXCJyZXF1aXJlZHByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicgaXMgcmVxdWlyZWQgaW4gY2xhc3MgJ1wiICtcbiAgICAgICAgY2xhc3NOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdCB7XG4gIHByaXZhdGUgc3RhdGljIHR5cGVQcm9wZXJ0eU5hbWUgPSBcInR5cGVcIjtcbiAgcHJpdmF0ZSBzdGF0aWMgcG9zaXRpb25Qcm9wZXJ0eU5hbWUgPSBcInBvc1wiO1xuICBwcml2YXRlIHN0YXRpYyBtZXRhRGF0YVZhbHVlID0gbmV3IEpzb25NZXRhZGF0YSgpO1xuICBwdWJsaWMgc3RhdGljIGdldCBtZXRhRGF0YSgpIHtcbiAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YVZhbHVlO1xuICB9XG4gIHB1YmxpYyBlcnJvcnMgPSBuZXcgQXJyYXk8SnNvbkVycm9yPigpO1xuICBwdWJsaWMgdG9Kc29uT2JqZWN0KG9iajogYW55LCBzdG9yZURlZmF1bHRzID0gZmFsc2UpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnRvSnNvbk9iamVjdENvcmUob2JqLCBudWxsLCBzdG9yZURlZmF1bHRzKTtcbiAgfVxuICBwdWJsaWMgdG9PYmplY3QoanNvbk9iajogYW55LCBvYmo6IGFueSkge1xuICAgIGlmICghanNvbk9iaikgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gbnVsbDtcbiAgICB2YXIgb2JqVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgbmVlZEFkZEVycm9ycyA9IHRydWU7XG4gICAgaWYgKG9iai5nZXRUeXBlKSB7XG4gICAgICBvYmpUeXBlID0gb2JqLmdldFR5cGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqVHlwZSk7XG4gICAgICBuZWVkQWRkRXJyb3JzID1cbiAgICAgICAgISFvYmpUeXBlICYmICFKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKG9ialR5cGUsIFwiaXRlbXZhbHVlXCIpO1xuICAgIH1cbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcbiAgICBpZiAob2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICBvYmouc3RhcnRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB9XG4gICAgcHJvcGVydGllcyA9IHRoaXMuYWRkRHluYW1pY1Byb3BlcnRpZXMob2JqLCBqc29uT2JqLCBwcm9wZXJ0aWVzKTtcbiAgICBmb3IgKHZhciBrZXkgaW4ganNvbk9iaikge1xuICAgICAgaWYgKGtleSA9PT0gSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT09IEpzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgb2JqW2tleV0gPSBqc29uT2JqW2tleV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5maW5kUHJvcGVydHkocHJvcGVydGllcywga2V5KTtcbiAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgaWYgKG5lZWRBZGRFcnJvcnMpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKFxuICAgICAgICAgICAgbmV3IEpzb25Vbmtub3duUHJvcGVydHlFcnJvcihrZXkudG9TdHJpbmcoKSwgb2JqVHlwZSksXG4gICAgICAgICAgICBqc29uT2JqXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsdWVUb09iaihqc29uT2JqW2tleV0sIG9iaiwgcHJvcGVydHkpO1xuICAgIH1cbiAgICBpZiAob2JqLmVuZExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdG9Kc29uT2JqZWN0Q29yZShcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHN0b3JlRGVmYXVsdHMgPSBmYWxzZVxuICApOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuIG9iajtcbiAgICBpZiAodHlwZW9mIG9iai5nZXREYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBvYmouZ2V0RGF0YSgpO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiAhcHJvcGVydHkuY2xhc3NOYW1lKSB7XG4gICAgICAoPGFueT5yZXN1bHQpW0pzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5nZXRPYmpUeXBlKFxuICAgICAgICBvYmouZ2V0VHlwZSgpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSksXG4gICAgICByZXN1bHQsXG4gICAgICBzdG9yZURlZmF1bHRzXG4gICAgKTtcbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaiksXG4gICAgICByZXN1bHQsXG4gICAgICBzdG9yZURlZmF1bHRzXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqOiBhbnkpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAob2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzICYmIG9iai5nZXREeW5hbWljVHlwZSkge1xuICAgICAgdmFyIG5hbWVzID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzKCk7XG4gICAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YS5maW5kUHJvcGVydGllcyhvYmouZ2V0RHluYW1pY1R5cGUoKSwgbmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljUHJvcGVydGllcyhcbiAgICBvYmo6IGFueSxcbiAgICBqc29uT2JqOiBhbnksXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PlxuICApOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAoIW9iai5nZXREeW5hbWljUHJvcGVydHlOYW1lKSByZXR1cm4gcHJvcGVydGllcztcbiAgICB2YXIgZHluYW1pY1Byb3BOYW1lID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAoIWR5bmFtaWNQcm9wTmFtZSkgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgaWYgKGpzb25PYmpbZHluYW1pY1Byb3BOYW1lXSkge1xuICAgICAgb2JqW2R5bmFtaWNQcm9wTmFtZV0gPSBqc29uT2JqW2R5bmFtaWNQcm9wTmFtZV07XG4gICAgfVxuICAgIHZhciBkeW5hbWljUHJvcGVydGllcyA9IHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goZHluYW1pY1Byb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJvcGVydGllc1RvSnNvbihcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIGpzb246IGFueSxcbiAgICBzdG9yZURlZmF1bHRzID0gZmFsc2VcbiAgKSB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudmFsdWVUb0pzb24ob2JqLCBqc29uLCBwcm9wZXJ0aWVzW2ldLCBzdG9yZURlZmF1bHRzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHZhbHVlVG9Kc29uKFxuICAgIG9iajogYW55LFxuICAgIHJlc3VsdDogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgc3RvcmVEZWZhdWx0cyA9IGZhbHNlXG4gICkge1xuICAgIGlmIChwcm9wZXJ0eS5pc1NlcmlhbGl6YWJsZSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZShvYmopO1xuICAgIGlmICghc3RvcmVEZWZhdWx0cyAmJiBwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YXIgYXJyVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyVmFsdWUucHVzaCh0aGlzLnRvSnNvbk9iamVjdENvcmUodmFsdWVbaV0sIHByb3BlcnR5LCBzdG9yZURlZmF1bHRzKSk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGFyclZhbHVlLmxlbmd0aCA+IDAgPyBhcnJWYWx1ZSA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy50b0pzb25PYmplY3RDb3JlKHZhbHVlLCBwcm9wZXJ0eSwgc3RvcmVEZWZhdWx0cyk7XG4gICAgfVxuICAgIHZhciBoYXNWYWx1ZSA9XG4gICAgICB0eXBlb2Ygb2JqW1wiZ2V0UHJvcGVydHlWYWx1ZVwiXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBvYmpbXCJnZXRQcm9wZXJ0eVZhbHVlXCJdKHByb3BlcnR5Lm5hbWUsIG51bGwpICE9PSBudWxsO1xuICAgIGlmICgoc3RvcmVEZWZhdWx0cyAmJiBoYXNWYWx1ZSkgfHwgIXByb3BlcnR5LmlzRGVmYXVsdFZhbHVlKHZhbHVlKSkge1xuICAgICAgcmVzdWx0W3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvT2JqKHZhbHVlOiBhbnksIG9iajogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnJlbW92ZVBvcyhwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5Lmhhc1RvVXNlU2V0VmFsdWUpIHtcbiAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlVG9BcnJheSh2YWx1ZSwgb2JqLCBwcm9wZXJ0eS5uYW1lLCBwcm9wZXJ0eSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZXdPYmogPSB0aGlzLmNyZWF0ZU5ld09iaih2YWx1ZSwgcHJvcGVydHkpO1xuICAgIGlmIChuZXdPYmoubmV3T2JqKSB7XG4gICAgICB0aGlzLnRvT2JqZWN0KHZhbHVlLCBuZXdPYmoubmV3T2JqKTtcbiAgICAgIHZhbHVlID0gbmV3T2JqLm5ld09iajtcbiAgICB9XG4gICAgaWYgKCFuZXdPYmouZXJyb3IpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zKHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9wZXJ0eS50eXBlIHx8IHByb3BlcnR5LnR5cGUuaW5kZXhPZihcInZhbHVlXCIpIDwgMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnJlbW92ZVBvc0Zyb21PYmoodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zRnJvbU9iaihvYmo6IGFueSkge1xuICAgIGlmICghb2JqKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQb3NGcm9tT2JqKG9ialtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIW9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xuICAgICAgZGVsZXRlIG9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5ld09iaih2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB7IG5ld09iajogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICB2YXIgY2xhc3NOYW1lID0gdmFsdWVbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXTtcbiAgICBpZiAoIWNsYXNzTmFtZSAmJiBwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcHJvcGVydHkuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICByZXN1bHQubmV3T2JqID0gY2xhc3NOYW1lXG4gICAgICA/IEpzb25PYmplY3QubWV0YURhdGEuY3JlYXRlQ2xhc3MoY2xhc3NOYW1lLCB2YWx1ZSlcbiAgICAgIDogbnVsbDtcbiAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgICByZXN1bHQubmV3T2JqLFxuICAgICAgdmFsdWUsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgbmV3T2JqOiBhbnksXG4gICAgdmFsdWU6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEpzb25FcnJvciB7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICB2YXIgcmVxdWlyZWRQcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRSZXF1aXJlZFByb3BlcnRpZXMoXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChyZXF1aXJlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IoXG4gICAgICAgICAgICAgIHJlcXVpcmVkUHJvcGVydGllc1tpXSxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgSnNvbk1pc3NpbmdUeXBlRXJyb3IoXG4gICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHkuYmFzZUNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgSnNvbkluY29ycmVjdFR5cGVFcnJvcihcbiAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWRkTmV3RXJyb3IoZXJyb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIHByaXZhdGUgYWRkTmV3RXJyb3IoZXJyb3I6IEpzb25FcnJvciwganNvbk9iajogYW55KSB7XG4gICAgaWYgKGpzb25PYmogJiYganNvbk9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xuICAgICAgZXJyb3IuYXQgPSBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdLnN0YXJ0O1xuICAgIH1cbiAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxuICBwcml2YXRlIHZhbHVlVG9BcnJheShcbiAgICB2YWx1ZTogQXJyYXk8YW55PixcbiAgICBvYmo6IGFueSxcbiAgICBrZXk6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGlmIChvYmpba2V5XSAmJiB2YWx1ZS5sZW5ndGggPiAwKSBvYmpba2V5XS5zcGxpY2UoMCwgb2JqW2tleV0ubGVuZ3RoKTtcbiAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlW2ldLCBwcm9wZXJ0eSk7XG4gICAgICBpZiAobmV3VmFsdWUubmV3T2JqKSB7XG4gICAgICAgIGlmICghIXZhbHVlW2ldLm5hbWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5uZXdPYmoubmFtZSA9IHZhbHVlW2ldLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqW2tleV0ucHVzaChuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgICB0aGlzLnRvT2JqZWN0KHZhbHVlW2ldLCBuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcnJvcikge1xuICAgICAgICAgIG9ialtrZXldLnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc29ub2JqZWN0LnRzIiwiaW1wb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi9sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIHN1cnZleUxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHtbaW5kZXg6IHN0cmluZ106IGFueX0+e30sXG4gIGxvY2FsZU5hbWVzOiA8e1tpbmRleDogc3RyaW5nXTogYW55fT57fSxcbiAgc3VwcG9ydGVkTG9jYWxlczogPEFycmF5PGFueT4+W10sXG4gIGdldCBjdXJyZW50TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9PT0gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWVcbiAgICAgID8gXCJcIlxuICAgICAgOiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGN1cnJlbnRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGVcbiAgICAgID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV1cbiAgICAgIDogdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgaWYgKCFsb2MgfHwgIWxvY1tzdHJOYW1lXSkgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgdmFyIHJlc3VsdCA9IGxvY1tzdHJOYW1lXTtcbiAgICBpZihyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGdldExvY2FsZXM6IGZ1bmN0aW9uKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLnN1cHBvcnRlZExvY2FsZXNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+c3VydmV5TG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vL1RPRE8gcmVwbGFjZSBjb21wbGV0ZWx5IHdpdGggRWxlbWVudEZhY3RvcnlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBRdWVzdGlvbkZhY3RvcnkgPSBuZXcgUXVlc3Rpb25GYWN0b3J5KCk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IERlZmF1bHRDaG9pY2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiMVwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiMlwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiM1wiXG4gICAgXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Q29sdW1zKCk6IHN0cmluZ1tdIHtcbiAgICB2YXIgY29sTmFtZSA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfY29sdW1uXCIpICsgXCIgXCI7XG4gICAgcmV0dXJuIFtjb2xOYW1lICsgXCIxXCIsIGNvbE5hbWUgKyBcIjJcIiwgY29sTmFtZSArIFwiM1wiXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Um93cygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIHJvd05hbWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF0cml4X3Jvd1wiKSArIFwiIFwiO1xuICAgIHJldHVybiBbcm93TmFtZSArIFwiMVwiLCByb3dOYW1lICsgXCIyXCJdO1xuICB9XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBRdWVzdGlvbj4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJRdWVzdGlvbihcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyxcbiAgICBxdWVzdGlvbkNyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IFF1ZXN0aW9uXG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXSA9IHF1ZXN0aW9uQ3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGNyZWF0b3IobmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRGYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRWxlbWVudEZhY3RvcnkgPSBuZXcgRWxlbWVudEZhY3RvcnkoKTtcbiAgcHJpdmF0ZSBjcmVhdG9ySGFzaDogSGFzaFRhYmxlPChuYW1lOiBzdHJpbmcpID0+IElFbGVtZW50PiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlckVsZW1lbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICBlbGVtZW50Q3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gSUVsZW1lbnRcbiAgKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV0gPSBlbGVtZW50Q3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmdldEFsbFR5cGVzKCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IElFbGVtZW50IHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpXG4gICAgICByZXR1cm4gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKGVsZW1lbnRUeXBlLCBuYW1lKTtcbiAgICByZXR1cm4gY3JlYXRvcihuYW1lKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uZmFjdG9yeS50cyIsImltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbiwgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RGF0YSB7XG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYW55O1xuICBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBhbnk7XG4gIGdldEFsbFZhbHVlcygpOiBhbnk7XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueTtcbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRleHRQcm9jZXNzb3Ige1xuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZztcbiAgcHJvY2Vzc1RleHRFeChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW5cbiAgKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5IGV4dGVuZHMgSVRleHRQcm9jZXNzb3Ige1xuICBjdXJyZW50UGFnZTogSVBhZ2U7XG4gIHBhZ2VzOiBBcnJheTxJUGFnZT47XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuO1xuICBwYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZTogSVBhZ2UsIG5ld1ZhbHVlOiBib29sZWFuKTogYW55O1xuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKTogYW55O1xuICBxdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBib29sZWFuKTogYW55O1xuICBxdWVzdGlvbnNPcmRlcjogc3RyaW5nO1xuICBxdWVzdGlvbkFkZGVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICk6IGFueTtcbiAgcGFuZWxBZGRlZChcbiAgICBwYW5lbDogSUVsZW1lbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICk6IGFueTtcbiAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIHBhbmVsUmVtb3ZlZChwYW5lbDogSUVsZW1lbnQpOiBhbnk7XG4gIHF1ZXN0aW9uUmVuYW1lZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIG9sZE5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZU5hbWU6IHN0cmluZ1xuICApOiBhbnk7XG4gIHZhbGlkYXRlUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFN1cnZleUVycm9yO1xuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvcjtcbiAgaGFzVmlzaWJsZVF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICBxdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U3VydmV5TWFya2Rvd25IdG1sKGVsZW1lbnQ6IEJhc2UsIHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgaXNEaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgaXNEZXNpZ25Nb2RlOiBib29sZWFuO1xuICBhcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc6IGJvb2xlYW47XG4gIGlzTG9hZGluZ0Zyb21Kc29uOiBib29sZWFuO1xuXG4gIHJlcXVpcmVkVGV4dDogc3RyaW5nO1xuICBnZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogc3RyaW5nO1xuICBnZXRVcGRhdGVkUXVlc3Rpb25UaXRsZShxdWVzdGlvbjogSVF1ZXN0aW9uLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nO1xuXG4gIHF1ZXN0aW9uU3RhcnRJbmRleDogc3RyaW5nO1xuICBxdWVzdGlvblRpdGxlTG9jYXRpb246IHN0cmluZztcbiAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBzdHJpbmc7XG4gIHN0b3JlT3RoZXJzQXNDb21tZW50OiBib29sZWFuO1xuXG4gIG1heFRleHRMZW5ndGg6IG51bWJlcjtcbiAgbWF4T3RoZXJzTGVuZ3RoOiBudW1iZXI7XG4gIGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtczogYm9vbGVhbjtcblxuICB1cGxvYWRGaWxlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApOiBhbnk7XG4gIGRvd25sb2FkRmlsZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICk6IGFueTtcbiAgY2xlYXJGaWxlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgIGNsZWFyQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKTogYW55O1xuICB1cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNob2ljZXM6IEFycmF5PGFueT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKTogQXJyYXk8YW55PjtcbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSk6IGFueTtcbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSk6IGFueTtcbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uLCBodG1sRWxlbWVudDogYW55KTogYW55O1xuICBhZnRlclJlbmRlclBhbmVsKHBhbmVsOiBJRWxlbWVudCwgaHRtbEVsZW1lbnQ6IGFueSk6IGFueTtcbiAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50OiBhbnkpOiBhbnk7XG4gIG1hdHJpeFJvd0FkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIG1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnM6IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIGNhbkFkZFJvdzogYm9vbGVhbjtcbiAgfSk6IGFueTtcbiAgbWF0cml4Um93UmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCByb3dJbmRleDogbnVtYmVyLCByb3c6IGFueSk6IGFueTtcbiAgbWF0cml4Q2VsbENyZWF0ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IGFueTtcbiAgbWF0cml4Q2VsbFZhbGlkYXRlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IFN1cnZleUVycm9yO1xuICBkeW5hbWljUGFuZWxBZGRlZChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYW55O1xuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlcik6IGFueTtcbiAgZHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBhbnk7XG4gIGRyYWdBbmREcm9wQWxsb3cob3B0aW9uczogYW55KTogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUltcGwge1xuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGE7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQ29uZGl0aW9uUnVubmVyIHtcbiAgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RWxlbWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xuICBpc1BhZ2U6IGJvb2xlYW47XG4gIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKTogYW55O1xuICBvblN1cnZleUxvYWQoKTogYW55O1xuICBvbkZpcnN0UmVuZGVyaW5nKCk6IGFueTtcbiAgZ2V0VHlwZSgpOiBzdHJpbmc7XG4gIHNldFZpc2libGVJbmRleCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyO1xuICBsb2NTdHJzQ2hhbmdlZCgpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElFbGVtZW50IGV4dGVuZHMgSUNvbmRpdGlvblJ1bm5lciwgSVN1cnZleUVsZW1lbnQge1xuICB2aXNpYmxlOiBib29sZWFuO1xuICBwYXJlbnQ6IElQYW5lbDtcbiAgcmVuZGVyV2lkdGg6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbiAgcmlnaHRJbmRlbnQ6IG51bWJlcjtcbiAgc3RhcnRXaXRoTmV3TGluZTogYm9vbGVhbjtcbiAgaXNQYW5lbDogYm9vbGVhbjtcbiAgZ2V0UGFuZWwoKTogSVBhbmVsO1xuICByZW1vdmVFbGVtZW50KGVsOiBJRWxlbWVudCk6IGJvb2xlYW47XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpOiBhbnk7XG4gIGNsZWFySW5jb3JyZWN0VmFsdWVzKCk6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUXVlc3Rpb24gZXh0ZW5kcyBJRWxlbWVudCB7XG4gIGhhc1RpdGxlOiBib29sZWFuO1xuICBpc0VtcHR5KCk6IGJvb2xlYW47XG4gIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpOiBhbnk7XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCk6IGJvb2xlYW47XG4gIGNsZWFyVW51c2VkVmFsdWVzKCk6IGFueTtcbiAgZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnk7XG4gIGdldFZhbHVlTmFtZSgpOiBzdHJpbmc7XG4gIGNsZWFyVmFsdWUoKTogYW55O1xuICBjbGVhclZhbHVlSWZJbnZpc2libGUoKTogYW55O1xuICBpc0Fuc3dlckNvcnJlY3QoKTogYm9vbGVhbjtcbiAgdXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTogYW55O1xuICB2YWx1ZTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFyZW50RWxlbWVudCB7XG4gIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpOiBhbnk7XG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuO1xuICBpc1JlYWRPbmx5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYW5lbCBleHRlbmRzIElTdXJ2ZXlFbGVtZW50LCBJUGFyZW50RWxlbWVudCB7XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmc7XG4gIHBhcmVudDogSVBhbmVsO1xuICBlbGVtZW50V2lkdGhDaGFuZ2VkKGVsOiBJRWxlbWVudCk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2UgZXh0ZW5kcyBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIge31cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIFN1cnZleUpTIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBjb21tZW50UHJlZml4OiBzdHJpbmcgPSBcIi1Db21tZW50XCI7XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSXRlbVZhbHVlOiAoaXRlbTogYW55KSA9PiBhbnk7XG4gIHB1YmxpYyBzdGF0aWMgaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZDogKGFycjogQXJyYXk8YW55PikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEEgc3RhdGljIG1ldGhvZHMgdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSB1bmRlcmZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgb3IgZW1wdHkgYXJyYXkuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgSXNQcm9wZXJ0eUVtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IFwiXCIgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9wZXJ0eUhhc2g6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIGxvY2FsaXphYmxlU3RyaW5nczogeyBbaW5kZXg6IHN0cmluZ106IExvY2FsaXphYmxlU3RyaW5nIH07XG4gIHByaXZhdGUgYXJyYXlzSW5mbzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9O1xuICBwcml2YXRlIG9uUHJvcENoYW5nZUZ1bmN0aW9uczogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmdW5jOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gICAga2V5OiBzdHJpbmc7XG4gIH0+O1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgb25Qcm9wZXJ0eUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG5cbiAgZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyOiAocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyOiAoXG4gICAgcHJvcGVydGllc0hhc2g6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsOiBhbnlcbiAgKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYXMgYSBzdHJpbmcgYXMgaXQgcmVwcmVzZW50cyBpbiB0aGUganNvbi4gSXQgc2hvdWxkIGJlIGluIGxvd2Nhc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJhc2VcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZWxlbWVudCB0ZW1wbGF0ZSBuYW1lIHdpdGhvdXQgcHJlZml4LiBUeXBpY2FsbHkgaXQgZXF1YWxzIHRvIGdldFR5cGUoKVxuICAgKiBAc2VlIGdldFR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFR5cGUoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbG9hZGluZyBmcm9tIEpzb24gYXQgdGhlIGN1cnJlbnQgbW9tZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvYWRpbmdGcm9tSnNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlO1xuICB9XG4gIHN0YXJ0TG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IHRydWU7XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZWQgdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gSlNPTlxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiBhbnkge1xuICAgIHJldHVybiBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgaWYgKCEhdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5hcnJheXNJbmZvW2tleV07XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0uaXNJdGVtVmFsdWVzKSB7XG4gICAgICAgICAgdmFyIGFyciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgICAgIGlmIChhcnIgJiYgISFCYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQpXG4gICAgICAgICAgICBCYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQoYXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICAgICAgICBpZiAoaXRlbSkgaXRlbS5zdHJDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHByb3BlcnR5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eVZhbHVlKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSk7XG4gICAgaWYgKHRoaXMuSXNQcm9wZXJ0eUVtcHR5KHJlcykgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lKTtcbiAgICBlbHNlIHJldHVybiBwcm9wZXJ0aWVzSGFzaFtuYW1lXTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcilcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lLCB2YWwpO1xuICAgIGVsc2UgcHJvcGVydGllc0hhc2hbbmFtZV0gPSB2YWw7XG4gIH1cbiAgcHVibGljIGl0ZXJhdGVQcm9wZXJ0aWVzSGFzaChmdW5jOiAoaGFzaDogYW55LCBrZXk6IGFueSkgPT4gdm9pZCkge1xuICAgIHZhciBrZXlzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnByb3BlcnR5SGFzaCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4gZnVuYyh0aGlzLnByb3BlcnR5SGFzaCwga2V5KSk7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB2YWwgbmV3IHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgIGlmIChvbGRWYWx1ZSAmJiBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSkge1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkgcmV0dXJuO1xuICAgICAgdmFyIGFycmF5SW5mbyA9IHRoaXMuYXJyYXlzSW5mb1tuYW1lXTtcbiAgICAgIHRoaXMuc2V0QXJyYXkoXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICB2YWwsXG4gICAgICAgIGFycmF5SW5mbyA/IGFycmF5SW5mby5pc0l0ZW1WYWx1ZXMgOiBmYWxzZSxcbiAgICAgICAgYXJyYXlJbmZvID8gYXJyYXlJbmZvLm9uUHVzaCA6IG51bGxcbiAgICAgICk7XG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIHZhbCk7XG4gICAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkge1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV0ubmFtZSA9PSBuYW1lKVxuICAgICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5mdW5jKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBhIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ga2V5IGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gZm9yIHRoaXMgcHJvcGVydHkgd2l0aHQgdGhlIHNhbWUga2V5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmdW5jOiBhbnksXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHtcbiAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zID0gW107XG4gICAgfVxuICAgIGlmIChrZXkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXTtcbiAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBuYW1lICYmIGl0ZW0ua2V5ID09IGtleSkge1xuICAgICAgICAgIGl0ZW0uZnVuYyA9IGZ1bmM7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnB1c2goeyBuYW1lOiBuYW1lLCBmdW5jOiBmdW5jLCBrZXk6IGtleSB9KTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlZCBmcm9tIHRoZSBuYW1lcyBsaXN0LlxuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gd2l0aCBubyBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gcHJvcGVydHkgY2hhbmdlZC5cbiAgICogQHBhcmFtIGtleSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGZvciB0aGlzIHByb3BlcnR5IHdpdGh0IHRoZSBzYW1lIGtleSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGZ1bmM6IGFueSxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lc1tpXSwgZnVuYywga2V5KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgbm90aWZpY2F0aW9uIG9uIHByb3BlcnR5IHZhbHVlIGNoYW5nZWRcbiAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHdpdGggd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCB0aGUgbm90aWZpY2F0aW9uIGZvciB0aGlzIHByb3BlcnR5LiBJdCBjYW4gYmUgbnVsbC5cbiAgICovXG4gIHB1YmxpYyB1blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV07XG4gICAgICBpZiAoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZCBmb3IgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG5hbWVzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aXRoIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgdGhlIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eS4gSXQgY2FuIGJlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgdW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZXNbaV0sIGtleSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9iaihuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICBpZiAobG9jU3RyIHx8ICEoPGFueT50aGlzKS5nZXRMb2NhbGUpIHJldHVybjtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKG5hbWUsIDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgdXNlTWFya0Rvd246IGJvb2xlYW4gPSBmYWxzZVxuICApOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhvd25lciwgdXNlTWFya0Rvd24pO1xuICAgIGlmICghdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIHRoaXMubG9jYWxpemFibGVTdHJpbmdzID0ge307XG4gICAgfVxuICAgIHRoaXMubG9jYWxpemFibGVTdHJpbmdzW25hbWVdID0gbG9jU3RyO1xuICAgIHJldHVybiBsb2NTdHI7XG4gIH1cbiAgcHVibGljIGdldExvY2FsaXphYmxlU3RyaW5nKG5hbWU6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncyA/IHRoaXMubG9jYWxpemFibGVTdHJpbmdzW25hbWVdIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZWZhdWx0U3RyOiBzdHJpbmcgPSBcIlwiXG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKCFsb2NTdHIpIHJldHVybiBcIlwiO1xuICAgIHZhciByZXMgPSBsb2NTdHIudGV4dDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogZGVmYXVsdFN0cjtcbiAgfVxuICBwdWJsaWMgc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmICghbG9jU3RyKSByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gbG9jU3RyLnRleHQ7XG4gICAgaWYgKG9sZFZhbHVlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIGxvY1N0ci50ZXh0ID0gdmFsdWU7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtVmFsdWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PGFueT4ge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5jcmVhdGVOZXdBcnJheShuYW1lLCBmdW5jdGlvbihpdGVtOiBhbnkpIHtcbiAgICAgIGl0ZW0ubG9jT3duZXIgPSBzZWxmO1xuICAgIH0pO1xuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXS5pc0l0ZW1WYWx1ZXMgPSB0cnVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBcnJheUNoYW5nZWQoYXI6IGFueSkge1xuICAgICEhYXIub25BcnJheUNoYW5nZWQgJiYgYXIub25BcnJheUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3QXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uUHVzaDogYW55ID0gbnVsbCxcbiAgICBvblJlbW92ZTogYW55ID0gbnVsbFxuICApOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgbmV3QXJyYXkgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIG5ld0FycmF5KTtcbiAgICBpZiAoIXRoaXMuYXJyYXlzSW5mbykge1xuICAgICAgdGhpcy5hcnJheXNJbmZvID0ge307XG4gICAgfVxuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXSA9IHsgb25QdXNoOiBvblB1c2gsIGlzSXRlbVZhbHVlczogZmFsc2UgfTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbmV3QXJyYXkucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnB1c2guY2FsbChuZXdBcnJheSwgdmFsdWUpO1xuICAgICAgaWYgKG9uUHVzaCkgb25QdXNoKHZhbHVlLCBuZXdBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5KTtcbiAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBuZXdBcnJheS5wb3AgPSBmdW5jdGlvbigpOiBudW1iZXIge1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXdBcnJheSkucG9wLmNhbGwobmV3QXJyYXkpO1xuICAgICAgaWYgKG9uUmVtb3ZlKSBvblJlbW92ZShyZXN1bHQpO1xuICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXkpO1xuICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnNwbGljZSA9IGZ1bmN0aW9uKFxuICAgICAgc3RhcnQ/OiBudW1iZXIsXG4gICAgICBkZWxldGVDb3VudD86IG51bWJlcixcbiAgICAgIC4uLml0ZW1zOiBhbnlbXVxuICAgICk6IGFueVtdIHtcbiAgICAgIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgICAgIGlmICghZGVsZXRlQ291bnQpIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnNwbGljZS5jYWxsKFxuICAgICAgICBuZXdBcnJheSxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBpZiAob25SZW1vdmUgJiYgcmVzdWx0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb25SZW1vdmUocmVzdWx0W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9uUHVzaCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb25QdXNoKGl0ZW1zW2ldLCBzdGFydCArIGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSk7XG4gICAgICBzZWxmLm5vdGlmeUFycmF5Q2hhbmdlZChuZXdBcnJheSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEFycmF5KFxuICAgIHNyYzogYW55W10sXG4gICAgZGVzdDogYW55W10sXG4gICAgaXNJdGVtVmFsdWVzOiBib29sZWFuLFxuICAgIG9uUHVzaDogYW55XG4gICkge1xuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzcmMpLnNwbGljZS5jYWxsKHNyYywgMCwgc3JjLmxlbmd0aCk7XG4gICAgLy9zcmMuc3BsaWNlKDAsIHNyYy5sZW5ndGgpO1xuICAgIC8vICAgIHNyYy5sZW5ndGggPSAwO1xuICAgIGlmICghZGVzdCkge1xuICAgICAgdGhpcy5ub3RpZnlBcnJheUNoYW5nZWQoc3JjKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGRlc3RbaV07XG4gICAgICBpZiAoaXNJdGVtVmFsdWVzKSB7XG4gICAgICAgIGlmICghIUJhc2UuY3JlYXRlSXRlbVZhbHVlKSB7XG4gICAgICAgICAgaXRlbSA9IEJhc2UuY3JlYXRlSXRlbVZhbHVlKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3JjKS5wdXNoLmNhbGwoc3JjLCBpdGVtKTtcbiAgICAgIC8vc3JjW1wib3JpZ2lvbmFsUHVzaFwiXS5hcHBseShzcmMsIFtpdGVtXSk7XG4gICAgICBpZiAob25QdXNoKSBvblB1c2goc3JjW2ldKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlBcnJheUNoYW5nZWQoc3JjKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNUd29WYWx1ZUVxdWFscyh4OiBhbnksIHk6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeCwgeSk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFcnJvciB7XG4gIHByaXZhdGUgbG9jVGV4dFZhbHVlOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGwpIHtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhsb2NPd25lciwgdHJ1ZSk7XG4gICAgdGhpcy5sb2NUZXh0LnRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMudGV4dDtcbiAgICBpZiAoIXJlcykgcmVzID0gdGhpcy5nZXREZWZhdWx0VGV4dCgpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnQgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVN1cnZleUVsZW1lbnQge1xuICBwcml2YXRlIHN1cnZleUltcGxWYWx1ZTogSVN1cnZleUltcGw7XG4gIHByaXZhdGUgc3VydmV5RGF0YVZhbHVlOiBJU3VydmV5RGF0YTtcbiAgcHJpdmF0ZSBzdXJ2ZXlWYWx1ZTogSVN1cnZleTtcbiAgcHJpdmF0ZSB0ZXh0UHJvY2Vzc29yVmFsdWU6IElUZXh0UHJvY2Vzc29yO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudEluRGVzaWduVmFsdWU6IFN1cnZleUVsZW1lbnQgPSB0aGlzO1xuXG4gIHB1YmxpYyBzdGF0aWMgU2Nyb2xsRWxlbWVudFRvVG9wKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmICghZWwgfHwgIWVsLnNjcm9sbEludG9WaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgaWYgKGVsZW1Ub3AgPCAwKSBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBlbGVtVG9wIDwgMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHM6IGFueSkge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiN0ZXh0XCIgJiYgZWxlbWVudHNbaV0ubm9kZU5hbWUgIT0gXCIjY29tbWVudFwiKVxuICAgICAgICByZXR1cm4gZWxlbWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgRm9jdXNFbGVtZW50KGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlcnJvcnNcIik7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgdGhpcy5zdXJ2ZXlJbXBsVmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoIXRoaXMuc3VydmV5SW1wbFZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXlEYXRhVmFsdWUgPSB0aGlzLnN1cnZleUltcGxWYWx1ZS5nZVN1cnZleURhdGEoKTtcbiAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5KCk7XG4gICAgdGhpcy50ZXh0UHJvY2Vzc29yVmFsdWUgPSB0aGlzLnN1cnZleUltcGxWYWx1ZS5nZXRUZXh0UHJvY2Vzc29yKCk7XG4gICAgdGhpcy5vblNldERhdGEoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleUltcGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5SW1wbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5RGF0YVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdXJ2ZXkgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXlWYWx1ZSkgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXlJbXBsVmFsdWUpIHtcbiAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSB0aGlzLnN1cnZleUltcGxWYWx1ZS5nZXRTdXJ2ZXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gaW4gZGVzaWduIG1vZGUgcmlnaHQgbm93LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlO1xuICB9XG4gIHB1YmxpYyBnZXQgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIGlmICh0aGlzLnN1cnZleSkgcmV0dXJuIHRoaXMuc3VydmV5LmlzTG9hZGluZ0Zyb21Kc29uO1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgISFvbGRWYWx1ZSkge1xuICAgICAgdGhpcy5vbk5hbWVDaGFuZ2VkKG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge31cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVycm9ycy4gSXQgaXMgY3JlYXRlZCBieSBjYWxsaWcgaGFzRXJyb3JzIGZ1bmN0aW9uc1xuICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGdldCBlcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXJyb3JzKHZhbDogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnbigpOiBTdXJ2ZXlFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24odmFsOiBTdXJ2ZXlFbGVtZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge31cblxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge31cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwgfHwgIXRoaXMudGV4dFByb2Nlc3NvcikgcmV0dXJuIGh0bWw7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dChodG1sLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge31cbiAgcHJvdGVjdGVkIGdldFBhZ2UocGFyZW50OiBJUGFuZWwpOiBJUGFnZSB7XG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmdldFR5cGUoKSA9PSBcInBhZ2VcIikgcmV0dXJuIDxJUGFnZT4oPGFueT5wYXJlbnQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBzZXRQYWdlKHBhcmVudDogSVBhbmVsLCB2YWw6IElQYWdlKSB7XG4gICAgdmFyIG9sZFBhZ2UgPSB0aGlzLmdldFBhZ2UocGFyZW50KTtcbiAgICBpZiAob2xkUGFnZSA9PT0gdmFsKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpKTtcbiAgICBpZiAodmFsKSB7XG4gICAgICB2YWwuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIC0xKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY29weU9iamVjdChkc3Q6IGFueSwgc3JjOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICB2YXIgc291cmNlID0gc3JjW2tleV07XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBzb3VyY2UgPSB7fTtcbiAgICAgICAgdGhpcy5jb3B5T2JqZWN0KHNvdXJjZSwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgZHN0W2tleV0gPSBzb3VyY2U7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjb3B5Q3NzQ2xhc3NlcyhkZXN0OiBhbnksIHNvdXJjZTogYW55KSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGRlc3RbXCJyb290XCJdID0gc291cmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBTdXJ2ZXlFbGVtZW50LmNvcHlPYmplY3QoZGVzdCwgc291cmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4ge1xuICBwcml2YXRlIGNhbGxiYWNrczogQXJyYXk8VD47XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MgPT0gbnVsbCB8fCB0aGlzLmNhbGxiYWNrcy5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgZmlyZShzZW5kZXI6IGFueSwgb3B0aW9uczogT3B0aW9ucykge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNhbGxSZXN1bHQgPSB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgfVxuICBwdWJsaWMgYWRkKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PFQ+KCk7XG4gICAgfVxuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZnVuYyk7XG4gIH1cbiAgcHVibGljIHJlbW92ZShmdW5jOiBUKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApO1xuICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNGdW5jKGZ1bmM6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApID4gLTE7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9iYXNlLnRzIiwiZXhwb3J0IGludGVyZmFjZSBIYXNoVGFibGU8VD4ge1xuICBba2V5OiBzdHJpbmddOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgSGVscGVycyB7XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBtZXRob2RzIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZXJmaW5lZCwgbnVsbCwgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWx1ZUVtcHR5KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXlDb250YWluc0VxdWFsKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGogPSAwO1xuICAgICAgZm9yICg7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeFtpXSwgeVtqXSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheXNFcXVhbChcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGlnbm9yZU9yZGVyOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpZ25vcmVPcmRlcikge1xuICAgICAgdmFyIHhTb3J0ZWQgPSBbXTtcbiAgICAgIHZhciB5U29ydGVkID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeFNvcnRlZC5wdXNoKHhbaV0pO1xuICAgICAgICB5U29ydGVkLnB1c2goeVtpXSk7XG4gICAgICB9XG4gICAgICB4U29ydGVkLnNvcnQoKTtcbiAgICAgIHlTb3J0ZWQuc29ydCgpO1xuICAgICAgeCA9IHhTb3J0ZWQ7XG4gICAgICB5ID0geVNvcnRlZDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4W2ldLCB5W2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzVHdvVmFsdWVFcXVhbHMoXG4gICAgeDogYW55LFxuICAgIHk6IGFueSxcbiAgICBpZ25vcmVPcmRlcjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHggJiYgIXkpIHx8ICgheCAmJiB5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QpICYmICEoeSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiB4ID09IHk7XG4gICAgaWYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgfHwgISh5IGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh4W1wiZXF1YWxzXCJdKSByZXR1cm4geC5lcXVhbHMoeSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkgJiYgQXJyYXkuaXNBcnJheSh5KSlcbiAgICAgIHJldHVybiBIZWxwZXJzLmlzQXJyYXlzRXF1YWwoeCwgeSwgaWdub3JlT3JkZXIpO1xuICAgIGZvciAodmFyIHAgaW4geCkge1xuICAgICAgaWYgKCF4Lmhhc093blByb3BlcnR5KHApKSBjb250aW51ZTtcbiAgICAgIGlmICgheS5oYXNPd25Qcm9wZXJ0eShwKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHhbcF0gPT09IHlbcF0pIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiB4W3BdICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyh4W3BdLCB5W3BdKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKHAgaW4geSkge1xuICAgICAgaWYgKHkuaGFzT3duUHJvcGVydHkocCkgJiYgIXguaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJhbmRvbWl6ZUFycmF5PFQ+KGFycmF5OiBBcnJheTxUPik6IEFycmF5PFQ+IHtcbiAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgIHZhciB0ZW1wID0gYXJyYXlbaV07XG4gICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgYXJyYXlbal0gPSB0ZW1wO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRVbmJpbmRWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIC8vZG8gbm90IHJldHVybiB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UhISFcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldE1heExlbmd0aChtYXhMZW5ndGg6IG51bWJlciwgc3VydmV5TGVuZ3RoOiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChtYXhMZW5ndGggPCAwKSB7XG4gICAgICBtYXhMZW5ndGggPSBzdXJ2ZXlMZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBtYXhMZW5ndGggPiAwID8gbWF4TGVuZ3RoIDogbnVsbDtcbiAgfVxufVxuaWYgKCEoPGFueT5TdHJpbmcucHJvdG90eXBlKVtcImZvcm1hdFwiXSkge1xuICAoPGFueT5TdHJpbmcucHJvdG90eXBlKVtcImZvcm1hdFwiXSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL3soXFxkKyl9L2csIGZ1bmN0aW9uKG1hdGNoOmFueSwgbnVtYmVyOmFueSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gXCJ1bmRlZmluZWRcIiA/IGFyZ3NbbnVtYmVyXSA6IG1hdGNoO1xuICAgIH0pO1xuICB9O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2hlbHBlcnMudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltcGxlbWVudG9yIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgcHJpdmF0ZSBrb0R1bW15OiBhbnk7XG4gIGtvVGVtcGxhdGVOYW1lOiBhbnk7XG4gIGtvRWxlbWVudFR5cGU6IGFueTtcbiAga29Db21tZW50OiBhbnk7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHF1ZXN0aW9uLnN1cnZleUxvYWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblN1cnZleUxvYWQoKTtcbiAgICB9O1xuICAgIHRoaXMua29UZW1wbGF0ZU5hbWUgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5nZXRUZW1wbGF0ZU5hbWUoKTtcbiAgICB9KTtcbiAgICB0aGlzLmtvRWxlbWVudFR5cGUgPSBrby5vYnNlcnZhYmxlKFwic3VydmV5LXF1ZXN0aW9uXCIpO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29FbGVtZW50VHlwZVwiXSA9IHRoaXMua29FbGVtZW50VHlwZTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvVGVtcGxhdGVOYW1lXCJdID0gdGhpcy5rb1RlbXBsYXRlTmFtZTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcInVwZGF0ZVF1ZXN0aW9uXCJdID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLnVwZGF0ZVF1ZXN0aW9uKCk7XG4gICAgfTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ3NzXCJdID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB9KTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUm9vdENsYXNzXCJdID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHNlbGYucXVlc3Rpb24uY3NzQ2xhc3Nlcy5tYWluUm9vdDtcbiAgICAgIGlmIChzZWxmLnF1ZXN0aW9uLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgcmVzdWx0ICs9IFwiIHN2X3FzdG5fbGVmdFwiO1xuICAgICAgfVxuICAgICAgaWYgKHNlbGYucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ICs9IFwiIFwiICsgc2VsZi5xdWVzdGlvbi5jc3NDbGFzc2VzLmhhc0Vycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIHF1ZXN0aW9uLmNvbW1lbnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db21tZW50Q2hhbmdlZCgpO1xuICAgIH07XG4gICAgcXVlc3Rpb24ucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ2aXNpYmxlSW5kZXhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVmlzaWJsZUluZGV4Q2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMua29EdW1teSA9IGtvLm9ic2VydmFibGUoMCk7XG4gICAgdGhpcy5rb0NvbW1lbnQgPSBrby5vYnNlcnZhYmxlKHRoaXMucXVlc3Rpb24uY29tbWVudCk7XG4gICAgdGhpcy5rb0NvbW1lbnQuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgIHNlbGYudXBkYXRlQ29tbWVudChuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0NvbW1lbnRcIl0gPSB0aGlzLmtvQ29tbWVudDtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUXVlc3Rpb25BZnRlclJlbmRlclwiXSA9IGZ1bmN0aW9uKFxuICAgICAgZWw6IGFueSxcbiAgICAgIGNvbjogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLmtvUXVlc3Rpb25BZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvbigpIHtcbiAgICB0aGlzLnVwZGF0ZUtvRHVtbXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db21tZW50Q2hhbmdlZCgpIHtcbiAgICB2YXIgdmFsID0gdGhpcy5xdWVzdGlvbi5jb21tZW50O1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsLCB0aGlzLnF1ZXN0aW9uLnZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMua29Db21tZW50KHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUluZGV4Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZUtvRHVtbXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdXJ2ZXlMb2FkKCkge31cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRUZW1wbGF0ZSgpO1xuICB9XG4gIHByaXZhdGUgZ2V0VGVtcGxhdGVOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQgJiZcbiAgICAgICF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlclxuICAgIClcbiAgICAgIHJldHVybiBcInN1cnZleS13aWRnZXQtXCIgKyB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5uYW1lO1xuICAgIHJldHVybiBcInN1cnZleS1xdWVzdGlvbi1cIiArIHRoaXMuZ2V0UXVlc3Rpb25UZW1wbGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDb21tZW50KG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Tm8oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52aXNpYmxlSW5kZXggPiAtMVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uLnZpc2libGVJbmRleCArIDEgKyBcIi4gXCJcbiAgICAgIDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlS29EdW1teSgpIHtcbiAgICB0aGlzLmtvRHVtbXkodGhpcy5rb0R1bW15KCkgKyAxKTtcbiAgICB0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBrb1F1ZXN0aW9uQWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgIHZhciB0RWwgPSBlbGVtZW50c1swXTtcbiAgICBpZiAodEVsLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgICB0RWwgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAodEVsLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgICBpZiAoZWwgJiYgdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQpXG4gICAgICB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcih0aGlzLnF1ZXN0aW9uLCBlbCk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzdfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJrb1wiLFwiY29tbW9uanMyXCI6XCJrbm9ja291dFwiLFwiY29tbW9uanNcIjpcImtub2Nrb3V0XCIsXCJhbWRcIjpcImtub2Nrb3V0XCJ9XG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1xuICBCYXNlLFxuICBTdXJ2ZXlFcnJvcixcbiAgU3VydmV5RWxlbWVudCxcbiAgSUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgSVBhbmVsLFxuICBJQ29uZGl0aW9uUnVubmVyLFxuICBJU3VydmV5SW1wbCxcbiAgSVBhZ2Vcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQW5zd2VyUmVxdWlyZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciwgVmFsaWRhdG9yUnVubmVyIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25DdXN0b21XaWRnZXQgfSBmcm9tIFwiLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29uZGl0aW9uT2JqZWN0IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGFsbCBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbiBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJUXVlc3Rpb24sIElDb25kaXRpb25SdW5uZXIsIElMb2NhbGl6YWJsZU93bmVyLCBJVmFsaWRhdG9yT3duZXIge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHJpdmF0ZSBzdGF0aWMgVGV4dFByZXByb2Nlc3NvclZhbHVlc01hcCA9IHtcbiAgICB0aXRsZTogXCJwcm9jZXNzZWRUaXRsZVwiLFxuICAgIHJlcXVpcmU6IFwicmVxdWlyZWRUZXh0XCJcbiAgfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlc3Rpb25Db3VudGVyID0gMTAwO1xuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVzdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3FfXCIgKyBRdWVzdGlvbi5xdWVzdGlvbkNvdW50ZXIrKztcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0N1c3RvbVdpZGdldFJlcXVlc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGN1c3RvbVdpZGdldFZhbHVlOiBRdWVzdGlvbkN1c3RvbVdpZGdldDtcbiAgY3VzdG9tV2lkZ2V0RGF0YSA9IHsgaXNOZWVkUmVuZGVyOiB0cnVlIH07XG4gIGZvY3VzQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHN1cnZleUxvYWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIHF1ZXN0aW9uVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBxdWVzdGlvbkNvbW1lbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuICBwcml2YXRlIGNvbmRpdGlvbkVuYWJlbFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29tbWVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdmFsaWRhdGVWYWx1ZUNhbGxiYWNrOiAoKSA9PiBTdXJ2ZXlFcnJvcjtcbiAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2s6ICgpID0+IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5pZCA9IFF1ZXN0aW9uLmdldFF1ZXN0aW9uSWQoKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbGlkYXRvcnNcIiwgZnVuY3Rpb24odmFsaWRhdG9yOiBhbnkpIHtcbiAgICAgIHZhbGlkYXRvci5sb2NPd25lciA9IHNlbGY7XG4gICAgfSk7XG4gICAgdmFyIGxvY1RpdGxlVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgbG9jVGl0bGVWYWx1ZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuIHNlbGYuZnVsbFRpdGxlO1xuICAgIH07XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21tZW50VGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcIndpZHRoXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCEhc2VsZi5wYXJlbnQpIHtcbiAgICAgICAgc2VsZi5wYXJlbnQuZWxlbWVudFdpZHRoQ2hhbmdlZChzZWxmKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJpbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uSW5kZW50Q2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gdGhpcy52YWx1ZU5hbWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSBpZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgcXVlc3Rpb24gcmVzdWx0IGluIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKiBRdWVzdGlvbiBuYW1lIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHN1cnZleSBhbmQgdmFsdWVOYW1lIGNvdWxkIGJlIG5vdCB1bmlxdWUuIEl0IGFsbG93cyB0byBzaGFyZSBkYXRhIGJldHdlZW4gc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSB2YWx1ZU5hbWUuXG4gICAqIFRoZSBsaWJyYXJ5IHNldCB0aGUgdmFsdWUgYXV0b21hdGljYWxseSBpZiB0aGUgcXVlc3Rpb24ubmFtZSBwcm9wZXJ0eSBpcyBub3QgdmFsaWQuIEZvciBleGFtcGxlLCBpZiBpdCBjb250YWlucyB0aGUgcGVyaW9kICcuJyBzeW1ib2wuXG4gICAqIEluIHRoaXMgY2FzZSBpZiB5b3Ugc2V0IHRoZSBxdWVzdGlvbi5uYW1lIHByb3BlcnR5IHRvICd4LnknIHRoZW4gdGhlIHZhbHVlTmFtZSBiZWNvbWVzICd4IHknLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdmFyIG9sZFZhbHVlTmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIHRoaXMuZ2V0Q29ycmVjdGVkTmFtZSh2YWwpKTtcbiAgICB0aGlzLm9uVmFsdWVOYW1lQ2hhbmdlZChvbGRWYWx1ZU5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5xdWVzdGlvblJlbmFtZWQoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgISFvbGRWYWx1ZSA/IG9sZFZhbHVlIDogdGhpcy5uYW1lXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OYW1lQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVuYW1lZChcbiAgICAgIHRoaXMsXG4gICAgICBvbGRWYWx1ZSxcbiAgICAgIHRoaXMudmFsdWVOYW1lID8gdGhpcy52YWx1ZU5hbWUgOiBvbGRWYWx1ZVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhZ2Ugd2hlcmUgdGhlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2UoKTogSVBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UodGhpcy5wYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZSh2YWw6IElQYWdlKSB7XG4gICAgdGhpcy5zZXRQYWdlKHRoaXMucGFyZW50LCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbHdheXMgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsKCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQvc2V0IHRoZSBxdWVzdGlvbiB2aXNpYmlsaXR5LlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQoPElRdWVzdGlvbj50aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBjaG9vc2UgaG93IG90aGVyIHF1ZXN0aW9uIHZhbHVlcyB3aWxsIGJlIHJlbmRlcmVkIGluIHRpdGxlIGlmIHJlZmVyZW5jZWQgaW4ge30uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVzZURpc3BsYXlWYWx1ZXNJblRpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVzZURpc3BsYXlWYWx1ZXNJblRpdGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUXVlc3Rpb24gYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlIHx8IHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LiBJdCBjYW4gYmUgZnJvbSAwIHRvIGFsbCB2aXNpYmxlIHF1ZXN0aW9ucyBjb3VudCAtIDFcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKG5hbWUgPT09IFwibmFtZVwiKSB7XG4gICAgICB0aGlzLm9uTmFtZVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbk5hbWVWYWx1ZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICghbmV3VmFsdWUpIHJldHVybjtcbiAgICBpZiAobmV3VmFsdWUuaW5kZXhPZihcIi5cIikgPiAtMSkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlTmFtZSB8fCB0aGlzLmlzQ29ycmVjdGVkTmFtZUVxdWFsc1ZhbHVlTmFtZShvbGRWYWx1ZSkpXG4gICAgICAgIHRoaXMudmFsdWVOYW1lID0gbmV3VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIXRoaXMudmFsdWVOYW1lICYmIHRoaXMuaXNDb3JyZWN0ZWROYW1lRXF1YWxzVmFsdWVOYW1lKG9sZFZhbHVlKSkge1xuICAgICAgICB0aGlzLnZhbHVlTmFtZSA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q29ycmVjdGVkTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIG5hbWU7XG4gICAgd2hpbGUgKG5hbWUuaW5kZXhPZihcIi5cIikgPiAtMSkgbmFtZSA9IG5hbWUucmVwbGFjZShcIi5cIiwgXCIgXCIpO1xuICAgIHJldHVybiBuYW1lLnRyaW0oKTtcbiAgfVxuICBwcml2YXRlIGlzQ29ycmVjdGVkTmFtZUVxdWFsc1ZhbHVlTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS5pbmRleE9mKFwiLlwiKSA8IDAgfHwgIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdGVkTmFtZShuYW1lKSA9PSB0aGlzLnZhbHVlTmFtZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBtYXkgaGF2ZSBhIHRpdGxlIGxvY2F0ZWQgb24gdGhlIGxlZnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nIGFzIGl0IHJlcHJlc2VudHMgaW4gdGhlIGpzb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEgJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMucnVuQ29uZGl0aW9uKFxuICAgICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKVxuICAgICAgKTtcbiAgICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEEgcGFyZW50IGVsZW1lbnQuIEl0IGNhbiBiZSBwYW5lbCBvciBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBwYXJlbnQoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFyZW50KHZhbDogSVBhbmVsKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHF1ZXN0aW9uIGRvZXNuJ3QgaGF2ZSBhIHRpdGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZTogUXVlc3Rpb25IdG1sTW9kZWwsIG9yIHRpdGxlTG9jYXRpb24gcHJvcGVydHkgZXF1YWxzIHRvIFwiaGlkZGVuXCJcbiAgICogQHNlZSB0aXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSAhPT0gXCJoaWRkZW5cIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgZGlmZmVyZW50IGZyb20gXCJkZWZhdWx0XCIgdG8gc2V0IHRoZSBzcGVjaWZpYyBxdWVzdGlvbiB0aXRsZSBsb2NhdGlvbiBmb3IgdGhpcyBwYW5lbC9wYWdlLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIgaXNWaXNpYmlsaXR5Q2hhbmdlZCA9XG4gICAgICB0aGlzLnRpdGxlTG9jYXRpb24gPT0gXCJoaWRkZW5cIiB8fCB2YWx1ZSA9PSBcImhpZGRlblwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoaXNWaXNpYmlsaXR5Q2hhbmdlZCAmJiB0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0aXRsZSBsb2NhdGlvbiBiYXNlZCBvbiBxdWVzdGlvbiB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGFuZCBRdWVzdGlvblRpdGxlTG9jYXRpb24gb2YgaXQncyBwYXJlbnRzXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxCYXNlLlF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFN1cnZleU1vZGVsLlF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICB2YXIgbG9jYXRpb24gPSB0aGlzLmdldFRpdGxlTG9jYXRpb25Db3JlKCk7XG4gICAgaWYgKGxvY2F0aW9uID09PSBcImxlZnRcIiAmJiAhdGhpcy5pc0FsbG93VGl0bGVMZWZ0KSBsb2NhdGlvbiA9IFwidG9wXCI7XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBnZXRUaXRsZUxvY2F0aW9uQ29yZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRpdGxlTG9jYXRpb24gIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy50aXRsZUxvY2F0aW9uO1xuICAgIGlmICghIXRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlTG9jYXRpb247XG4gICAgcmV0dXJuIFwidG9wXCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcImxlZnRcIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZSAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJ0b3BcIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZSAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJib3R0b21cIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkxlZnRUb3AoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhhc1RpdGxlKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCk7XG4gICAgcmV0dXJuIGxvY2F0aW9uID09PSBcImxlZnRcIiB8fCBsb2NhdGlvbiA9PT0gXCJ0b3BcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVycm9yTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5xdWVzdGlvbkVycm9yTG9jYXRpb24gOiBcInRvcFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYW4gaW5wdXQgZWxlbWVudCwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0lucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJpXCI7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIHRpdGxlLiBVc2Ugc3VydmV5IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIHRpdGxlIHF1ZXN0aW9uIGlzIHJlbmRlcmVkLiBJZiBpdCBpcyBlbXB0eSwgdGhlbiBxdWVzdGlvbiBuYW1lIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdGhpcy5uYW1lKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTtcbiAgfVxuICAvKipcbiAgICogUXVlc3Rpb24gZGVzY3JpcHRpb24uIEl0IHJlbmRlcnMgdW5kZXIgcXVlc3Rpb24gdGl0bGUgYnkgdXNpbmcgc21hbGxlciBmb250LiBVbmxpa2UgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiBjYW4gYmUgZW1wdHkuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQgb3Igc2V0IHRoZSBjb21tZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21tZW50VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb21tZW50VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21tZW50VGV4dFwiKTtcbiAgfVxuICBwcml2YXRlIGdldCBsb2NUaXRsZUh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sO1xuICAgIHJldHVybiByZXMgPyByZXMgOiB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHF1ZXN0aW9uIGVycm9ycyBzdXJ2ZXkuIEZvciBzb21lIHF1ZXN0aW9ucyBsaWtlIG1hdHJpeCBhbmQgcGFuZWwgZHluYW1pYyBpdCBpbmNsdWRlcyB0aGUgZXJyb3JzIG9mIG5lc3RlZCBxdWVzdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLnNsaWNlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaW5rIHRvIHRoZSBjdXN0b20gd2lkZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXN0b21XaWRnZXQoKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGlmICghdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCAmJiAhdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSkge1xuICAgICAgdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXN0b21XaWRnZXRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0KCkge1xuICAgIHRoaXMuY3VzdG9tV2lkZ2V0VmFsdWUgPSBDdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1c3RvbVdpZGdldChcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZW5kcmVkIHF1ZXN0aW9uIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sO1xuICAgIHJldHVybiByZXMgPyByZXMgOiB0aGlzLm5hbWU7XG4gICAgLy9yZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRIdG1sKHRoaXMubG9jVGl0bGVIdG1sKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGl0bGUgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgcXVlc3Rpb24gdGVtcGxhdGUuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmNhbGNGdWxsVGl0bGUoKTtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gcmVzO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5nZXRVcGRhdGVkUXVlc3Rpb25UaXRsZSh0aGlzLCByZXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKSB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2spXG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjaygpO1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCkgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgY2FsY0Z1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHZhciB0aXRsZVRlbXBsYXRlID0gdGhpcy5nZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTtcbiAgICBpZiAodGl0bGVUZW1wbGF0ZSkge1xuICAgICAgaWYgKCF0aGlzLnRleHRQcmVQcm9jZXNzb3IpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24oXG4gICAgICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2VzcyhcbiAgICAgICAgdGl0bGVUZW1wbGF0ZSxcbiAgICAgICAgdGhpcy51c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHJlcXVpcmVUZXh0ID0gdGhpcy5yZXF1aXJlZFRleHQ7XG4gICAgaWYgKHJlcXVpcmVUZXh0KSByZXF1aXJlVGV4dCArPSBcIiBcIjtcbiAgICB2YXIgbm8gPSB0aGlzLm5vO1xuICAgIGlmIChubykgbm8gKz0gXCIuIFwiO1xuICAgIHJldHVybiBubyArIHJlcXVpcmVUZXh0ICsgdGhpcy5wcm9jZXNzZWRUaXRsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIFF1ZXN0aW9uIHJlbmRlcnMgb24gdGhlIG5ldyBsaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZmFsc2UsIHRoZSBxdWVzdGlvbiB0cmllcyB0byByZW5kZXIgb24gdGhlIHNhbWUgbGluZS9yb3cgd2l0aCBhIHByZXZpb3VzIHF1ZXN0aW9uL3BhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFydFdpdGhOZXdMaW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRXaXRoTmV3TGluZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zdGFydFdpdGhOZXdMaW5lID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbGwgY3NzIGNsYXNzZXMgdGhhdCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHF1ZXN0aW9uLiBZb3UgbWF5IHVzZSBzdXJ2ZXkudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzIGV2ZW50IHRvIG92ZXJyaWRlIGNzcyBjbGFzc2VzIGZvciBhIHF1ZXN0aW9uLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlc1xuICAgKi9cbiAgcHVibGljIGdldCBjc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgdmFyIHN1cnZleUNzcyA9IHRoaXMuY3NzO1xuICAgIHZhciBjbGFzc2VzID0geyBlcnJvcjoge30gfTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMsIHN1cnZleUNzcy5xdWVzdGlvbik7XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLmVycm9yLCBzdXJ2ZXlDc3MuZXJyb3IpO1xuICAgIHRoaXMudXBkYXRlQ3NzQ2xhc3NlcyhjbGFzc2VzLCBzdXJ2ZXlDc3MpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um9vdENzcyhjbGFzc2VzOiBhbnkpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5xdWVzdGlvbi5yb290O1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDc3NDbGFzc2VzKHJlczogYW55LCBzdXJ2ZXlDc3M6IGFueSkge1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgIGlmIChzdXJ2ZXlDc3MucXVlc3Rpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgcmVzLnJvb3QgKz0gXCIgXCIgKyBzdXJ2ZXlDc3MucXVlc3Rpb24ucmVxdWlyZWQ7XG4gICAgICB9XG4gICAgICBpZiAoc3VydmV5Q3NzLnF1ZXN0aW9uLnRpdGxlUmVxdWlyZWQpIHtcbiAgICAgICAgcmVzLnRpdGxlICs9IFwiIFwiICsgc3VydmV5Q3NzLnF1ZXN0aW9uLnRpdGxlUmVxdWlyZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvYmpDc3MgPSBzdXJ2ZXlDc3NbdGhpcy5nZXRUeXBlKCldO1xuICAgIGlmIChvYmpDc3MgPT09IHVuZGVmaW5lZCB8fCBvYmpDc3MgPT09IG51bGwpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG9iakNzcyA9PT0gXCJzdHJpbmdcIiB8fCBvYmpDc3MgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIHJlcy5yb290ID0gb2JqQ3NzO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqQ3NzKSB7XG4gICAgICAgIHJlc1trZXldID0gb2JqQ3NzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuZ2V0Q3NzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIHdpZHRoIHRvIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCB3aWR0aCBvZiB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbmRlcldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgZGlmZmVyZW50IGZyb20gMCB0byBpbmNyZWFzZSB0aGUgbGVmdCBwYWRkaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBpbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCBkaWZmZXJlbnQgZnJvbSAwIHRvIGluY3JlYXNlIHRoZSByaWdodCBwYWRkaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ0xlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGludExlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGludExlZnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ1JpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmdSaWdodFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ1JpZ2h0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBvbkluZGVudENoYW5nZWQoKSB7XG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nUmlnaHQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5yaWdodEluZGVudCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbmRlbnRTaXplKGluZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZW50IDwgMSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIGluZGVudCAqIHRoaXMuY3NzQ2xhc3Nlcy5pbmRlbnQgKyBcInB4XCI7XG4gIH1cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGZvY3VzIHRvIHRoZSBpbnB1dCBvZiB0aGlzIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gb25FcnJvciBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSwgdG8gZm9jdXMgdGhlIGlucHV0IHdpdGggdGhlIGZpcnN0IGVycm9yLCBvdGhlciB3aXNlIHRoZSBmaXJzdCBpbnB1dCB3aWxsIGJlIGZvY3VzZWQuXG4gICAqL1xuICBwdWJsaWMgZm9jdXMob25FcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgU3VydmV5RWxlbWVudC5TY3JvbGxFbGVtZW50VG9Ub3AodGhpcy5pZCk7XG4gICAgdmFyIGlkID0gIW9uRXJyb3JcbiAgICAgID8gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKClcbiAgICAgIDogdGhpcy5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgICBpZiAoU3VydmV5RWxlbWVudC5Gb2N1c0VsZW1lbnQoaWQpKSB7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmZvY3VzQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZmlyZUNhbGxiYWNrKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICB9XG4gIHB1YmxpYyBnZXRPdGhlcnNNYXhMZW5ndGgoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF4T3RoZXJzTGVuZ3RoID4gMCA/IHRoaXMuc3VydmV5Lm1heE90aGVyc0xlbmd0aCA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0SWQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSB7XG4gICAgdmFyIG5hbWUgPSB0ZXh0VmFsdWUubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9XG4gICAgICBPYmplY3Qua2V5cyhRdWVzdGlvbi5UZXh0UHJlcHJvY2Vzc29yVmFsdWVzTWFwKS5pbmRleE9mKG5hbWUpICE9PSAtMSB8fFxuICAgICAgKDxhbnk+dGhpcylbdGV4dFZhbHVlLm5hbWVdICE9PSB1bmRlZmluZWQ7XG4gICAgdGV4dFZhbHVlLnZhbHVlID0gKDxhbnk+dGhpcylbXG4gICAgICAoPGFueT5RdWVzdGlvbi5UZXh0UHJlcHJvY2Vzc29yVmFsdWVzTWFwKVtuYW1lXSB8fCB0ZXh0VmFsdWUubmFtZVxuICAgIF07XG4gIH1cbiAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgcXVlc3Rpb24gYSByZXF1aXJlZC4gSWYgYSB1c2VyIGRvZXNuJ3QgYW5zd2VyIHRoZSBxdWVzdGlvbiB0aGVuIGEgdmFsaWRhdGlvbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBhZGQgYSBjb21tZW50IGZvciB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzQ29tbWVudCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydENvbW1lbnQoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5oYXNDb21tZW50KSB0aGlzLmhhc090aGVyID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmljYXRvci4gSXQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpZFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaGFzT3RoZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHt9XG4gIC8qKlxuICAgKiBSZXR1bnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSBhIHF1ZXN0aW9uIHJlYWRvbmx5LlxuICAgKiBAc2VlIGVuYWJsZUlmXG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVhZE9ubHlcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVhZE9ubHlcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyByZWFkIG9ubHkgYW5kIGFuIGVuZC11c2VyIHdpbGwgbm90IGFibGUgdG8gYW5zd2VyIG9uIHRoZSBxdXN0aW9uLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gcmVhZE9ubHkgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biB2aXNpYmxlSWYgYW5kIGVuYWJsZUlmIGV4cHJlc3Npb25zLiBJZiB2aXNpYmxlSWYgb3IvYW5kIGVuYWJsZWRJZiBhcmUgbm90IGVtcHR5LCB0aGVuIHRoZSByZXN1bHRzIG9mIHBlcmZvcm1pbmcgdGhlIGV4cHJlc3Npb24gKHRydWUgb3IgZmFsc2UpIHNldCB0byB0aGUgdmlzaWJsZS9yZWFkT25seSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzIFR5cGljYWxseSBzdXJ2ZXkgcmVzdWx0c1xuICAgKiBAc2VlIHZpc2libGVcbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGVuYWJsZUlmXG4gICAqL1xuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZykge1xuICAgICAgdGhpcy5ydW5WaXNpYmxlSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgdGhpcy5ydW5FbmFibGVJZkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuVmlzaWJsZUlmQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVJZikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25kaXRpb25SdW5uZXIpXG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICB0aGlzLnZpc2libGUgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1bkVuYWJsZUlmQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5lbmFibGVJZjtcbiAgICB0aGlzLnJlYWRPbmx5ID0gIXRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52aXNpYmxlSW5kZXggPCAwKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgc3RhcnRJbmRleCA9IDE7XG4gICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCkge1xuICAgICAgc3RyID0gdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4O1xuICAgICAgaWYgKHBhcnNlSW50KHN0cikpIHN0YXJ0SW5kZXggPSBwYXJzZUludChzdHIpO1xuICAgICAgZWxzZSBpZiAoc3RyLmxlbmd0aCA9PSAxKSBpc051bWVyaWMgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpYykgcmV0dXJuICh0aGlzLnZpc2libGVJbmRleCArIHN0YXJ0SW5kZXgpLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoMCkgKyB0aGlzLnZpc2libGVJbmRleCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnN1cnZleUxvYWRDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICB0aGlzLm9uU3VydmV5VmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwcml2YXRlIGlzdmFsdWVDaGFuZ2VkQ2FsbGJhY2tGaXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEdldC9TZXQgdGhlIHF1ZXN0aW9uIHZhbHVlLlxuICAgKiBAc2VlIFN1cnZleU1vZGUuc2V0VmFsdWVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlLmdldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVGcm9tRGF0YSh0aGlzLmdldFZhbHVlQ29yZSgpKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICBpZiAodGhpcy5pc3ZhbHVlQ2hhbmdlZENhbGxiYWNrRmlyaW5nKSByZXR1cm47XG4gICAgdGhpcy5pc3ZhbHVlQ2hhbmdlZENhbGxiYWNrRmlyaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKTtcbiAgICB0aGlzLmlzdmFsdWVDaGFuZ2VkQ2FsbGJhY2tGaXJpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZSgpIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuICB9XG4gIHByaXZhdGUgY2FuQ2xlYXJWYWx1ZUFzSW52aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmlzUGFyZW50VmlzaWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5Lmhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMudmFsdWVOYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1BhcmVudFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmICghcGFyZW50LmlzVmlzaWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBpZiAodGhpcy5jYW5DbGVhclZhbHVlQXNJbnZpc2libGUoKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVZhbHVlXCIsIFwiXCIpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVEaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlWYWx1ZVwiLCB0aGlzLmdldERpc3BsYXlWYWx1ZSh0cnVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcXVlc3Rpb24gdmFsdWUgYXMgYSBkaXNwbGF5IHRleHQuIEZvciBleGFtcGxlLCBmb3IgZHJvcGRvd24sIGl0IHdvdWxkIHJldHVybiB0aGUgaXRlbSB0ZXh0IGluc3RlYWQgb2YgaXRlbSB2YWx1ZS5cbiAgICogQHBhcmFtIGtleXNBc1RleHQgU2V0IHRoaXMgdmFsdWUgdG8gdHJ1ZSwgdG8gcmV0dXJuIGtleSAoaW4gbWF0cmljZXMgcXVlc3Rpb25zKSBhcyBkaXNwbGF5IHRleHQgYXMgd2VsbC5cbiAgICovXG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dDogYm9vbGVhbik6IGFueSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tV2lkZ2V0KSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5jdXN0b21XaWRnZXQuZ2V0RGlzcGxheVZhbHVlKHRoaXMpO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0KTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uLiBJdCB3aWxsIGJlIGFzc2lnbiB0byB0aGUgcXVlc3Rpb24gb24gbG9hZGluZyB0aGUgc3VydmV5IGZyb20gSlNPTiBvciBhZGRpbmcgYSBxdWVzdGlvbiB0byB0aGUgc3VydmV5IG9yIG9uIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb3JyZWN0IGFuc3dlciBvbiB0aGUgcXVlc3Rpb24uIFNldCB0aGlzIHZhbHVlIGlmIHlvdSBhcmUgZG9pbmcgYSBxdWl6LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLmNvcnJlY3RBbnN3ZXJzXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuaW5Db3JyZWN0QW5zd2Vyc1xuICAgKi9cbiAgcHVibGljIGdldCBjb3JyZWN0QW5zd2VyKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvcnJlY3RBbnN3ZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb3JyZWN0QW5zd2VyKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29ycmVjdEFuc3dlclwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBpc0Fuc3dlckNvcnJlY3QoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpIHx8IHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlcikpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8XG4gICAgICAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmIHRoaXMuaXNEZWZhdWx0VmFsdWVFbXB0eSgpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmICF0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNEZWZhdWx0VmFsdWVFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBxdWVzdGlvbiBjb21tZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tbWVudCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhbmV3VmFsdWUpIG5ld1ZhbHVlID0gbmV3VmFsdWUudHJpbSgpO1xuICAgIGlmICh0aGlzLmNvbW1lbnQgPT0gbmV3VmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnNldENvbW1lbnQobmV3VmFsdWUpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29tbWVudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhICE9IG51bGxcbiAgICAgID8gdGhpcy5kYXRhLmdldENvbW1lbnQodGhpcy5nZXRWYWx1ZU5hbWUoKSlcbiAgICAgIDogdGhpcy5xdWVzdGlvbkNvbW1lbnQ7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TmV3Q29tbWVudChuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gdmFsdWUgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcXVlc3Rpb24gdmFsaWRhdG9ycy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsaWRhdG9yc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsaWRhdG9yc1wiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIG5hbWVzLnB1c2godGhpcy5uYW1lKTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUsXG4gICAgICBxdWVzdGlvbjogdGhpc1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gdGhpcy5nZXRUeXBlKCk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRpb24gZXJyb3IocykgaW4gdGhlIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlIHRvIHNob3cgYW4gZXJyb3IgaW4gVUkuXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5jaGVja0ZvckVycm9ycygpO1xuICAgIGlmIChmaXJlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGNvdW50LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50RXJyb3JDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoYXIvc3RyaW5nIGZvciBhIHJlcXVpcmVkIHF1ZXN0aW9uLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnJlcXVpcmVkVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgIT0gbnVsbCAmJiB0aGlzLmlzUmVxdWlyZWRcbiAgICAgID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0XG4gICAgICA6IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBlcnJvciBpbnRvIHRoZSBxdWVzdGlvbiBlcnJvciBsaXN0LlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBhZGRFcnJvcihlcnJvcjogU3VydmV5RXJyb3IpIHtcbiAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHFFcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICF0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuY29sbGVjdEVycm9ycyhxRXJyb3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIHFFcnJvcnM7XG4gIH1cbiAgcHJpdmF0ZSBjb2xsZWN0RXJyb3JzKHFFcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHRoaXMub25DaGVja0ZvckVycm9ycyhxRXJyb3JzKTtcbiAgICBpZiAocUVycm9ycy5sZW5ndGggPT0gMCkge1xuICAgICAgdmFyIGVycm9ycyA9IHRoaXMucnVuVmFsaWRhdG9ycygpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vdmFsaWRhdG9ycyBtYXkgY2hhbmdlIHRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICAgICAgcUVycm9ycy5sZW5ndGggPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHFFcnJvcnMucHVzaChlcnJvcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSAmJiBxRXJyb3JzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB2YXIgZXJyb3IgPSB0aGlzLmZpcmVTdXJ2ZXlWYWxpZGF0aW9uKCk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcUVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaXJlU3VydmV5VmFsaWRhdGlvbigpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKSByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2soKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS52YWxpZGF0ZVF1ZXN0aW9uKHRoaXMpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IEFuc3dlclJlcXVpcmVkRXJyb3IodGhpcy5yZXF1aXJlZEVycm9yVGV4dCkpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFzUmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHByb3RlY3RlZCBydW5WYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSdW5uZXIoKS5ydW4odGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZSk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVDaGFuZ2VkSW5TdXJ2ZXkpIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy52YWx1ZVRvRGF0YShuZXdWYWx1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlQ29yZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSAhPSBudWxsXG4gICAgICA/IHRoaXMuZGF0YS5nZXRWYWx1ZSh0aGlzLmdldFZhbHVlTmFtZSgpKVxuICAgICAgOiB0aGlzLnF1ZXN0aW9uVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1NldHRpbmdWYWx1ZUluRGF0YSA9IGZhbHNlO1xuICBwcml2YXRlIHNldFZhbHVlQ29yZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlSW5EYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YS5zZXRWYWx1ZSh0aGlzLmdldFZhbHVlTmFtZSgpLCBuZXdWYWx1ZSk7XG4gICAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlSW5EYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIHNldE5ld0NvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldENvbW1lbnQodGhpcy5nZXRWYWx1ZU5hbWUoKSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB0aGlzLnF1ZXN0aW9uQ29tbWVudCA9IG5ld1ZhbHVlO1xuICB9XG4gIC8vSVF1ZXN0aW9uXG4gIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IHRydWU7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YShuZXdWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLmlzU2V0dGluZ1ZhbHVlSW5EYXRhKSB7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbW1lbnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2VkSW5TdXJ2ZXkgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUgfHwgIXRoaXMuaGFzVGl0bGUpIHtcbiAgICAgIHZhbCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgICByZXR1cm4gdmFsIDwgMCA/IDAgOiAxO1xuICB9XG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcXVlc3Rpb24sIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge31cbiAgcHVibGljIGNsZWFyVW51c2VkVmFsdWVzKCkge31cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7fVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1cnZleSBsb2NhbGVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5sb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXG4gICAgICA6IHRoaXMubG9jT3duZXJcbiAgICAgICAgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpXG4gICAgICAgIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/IHRoaXMuc3VydmV5LmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0KVxuICAgICAgOiB0aGlzLmxvY093bmVyXG4gICAgICAgID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dClcbiAgICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGV4dFByb2Nlc3NvcilcbiAgICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQodGV4dCwgdGhpcy51c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSk7XG4gICAgaWYgKHRoaXMubG9jT3duZXIpIHJldHVybiB0aGlzLmxvY093bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCk7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICAvL0lWYWxpZGF0b3JPd25lclxuICBnZXRWYWxpZGF0b3JUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIHNldCB2YWxpZGF0ZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpIDogbnVsbDtcbiAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInF1ZXN0aW9uXCIsIFtcbiAgXCIhbmFtZVwiLFxuICB7IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICBcInZpc2libGVJZjpjb25kaXRpb25cIixcbiAgeyBuYW1lOiBcIndpZHRoXCIgfSxcbiAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJpbmRlbnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzXSB9LFxuICB7XG4gICAgbmFtZTogXCJwYWdlXCIsXG4gICAgaXNTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICB2YXIgc3VydmV5ID0gb2JqID8gb2JqLnN1cnZleSA6IG51bGw7XG4gICAgICByZXR1cm4gc3VydmV5XG4gICAgICAgID8gc3VydmV5LnBhZ2VzLm1hcCgocDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcC5uYW1lLCB0ZXh0OiBwLnRpdGxlIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gIHsgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiIH0sXG4gIHsgbmFtZTogXCJjb21tZW50VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIiB9LFxuICBcInZhbHVlTmFtZVwiLFxuICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICBcImRlZmF1bHRWYWx1ZTp2YWx1ZVwiLFxuICBcImNvcnJlY3RBbnN3ZXI6dmFsdWVcIixcbiAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiXG4gIH0sXG4gIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxuICB7XG4gICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLFxuICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwidGl0bGVMb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwiaGlkZGVuXCJdXG4gIH1cbl0pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRBbHRlck5hdGl2ZUNsYXNzTmFtZShcInF1ZXN0aW9uXCIsIFwicXVlc3Rpb25iYXNlXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBsb2NPd25lcik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT25lQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBsb2NPd25lcik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9ySW5QYW5lbFwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFJlcXVyZU51bWVyaWNFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBsb2NPd25lcik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJudW1lcmljRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBFeGNlZWRTaXplRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyLCBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIobnVsbCwgbG9jT3duZXIpO1xuICAgIHRoaXMubG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImV4Y2VlZE1heFNpemVcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLmdldFRleHRTaXplKCkpO1xuICB9XG4gIHByaXZhdGUgZ2V0VGV4dFNpemUoKSB7XG4gICAgdmFyIHNpemVzID0gW1wiQnl0ZXNcIiwgXCJLQlwiLCBcIk1CXCIsIFwiR0JcIiwgXCJUQlwiXTtcbiAgICB2YXIgZml4ZWQgPSBbMCwgMCwgMiwgMywgM107XG4gICAgaWYgKHRoaXMubWF4U2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiMCBCeXRlXCI7XG4gICAgfVxuICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyh0aGlzLm1heFNpemUpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubWF4U2l6ZSAvIE1hdGgucG93KDEwMjQsIGkpO1xuICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKGZpeGVkW2ldKSArIFwiIFwiICsgc2l6ZXNbaV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEN1c3RvbUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgbG9jT3duZXIpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXJyb3IudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1BhcnNlclwiO1xuaW1wb3J0IHsgRnVuY3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5cbmV4cG9ydCBjbGFzcyBPcGVyYW5kIHtcbiAgY29uc3RydWN0b3IocHVibGljIG9yaWdpb25hbFZhbHVlOiBhbnkpIHt9XG4gIHB1YmxpYyBnZXRWYWx1ZShwcm9jZXNzVmFsdWU6IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcmlnaW9uYWxWYWx1ZSkpIHtcbiAgICAgIGxldCByZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcmlnaW9uYWxWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgdmFsID0gbmV3IE9wZXJhbmQodGhpcy5vcmlnaW9uYWxWYWx1ZVtpXSk7XG4gICAgICAgIHJlcy5wdXNoKHZhbC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHZhciByZXMgPSB0aGlzLmdldFNpbXBsZVZhbHVlKHRoaXMub3JpZ2lvbmFsVmFsdWUpO1xuICAgIGlmIChyZXMuaXNTaW1wbGUpIHJldHVybiByZXMudmFsdWU7XG4gICAgdmFyIHZhbCA9IHRoaXMucmVtb3ZlUXVvdGVzQW5kRXNjYXBlcyh0aGlzLm9yaWdpb25hbFZhbHVlKTtcbiAgICBpZiAocHJvY2Vzc1ZhbHVlKSB7XG4gICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKHZhbCk7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBpZiAoIXByb2Nlc3NWYWx1ZS5oYXNWYWx1ZShuYW1lKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhbCA9IHByb2Nlc3NWYWx1ZS5nZXRWYWx1ZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2ltcGxlVmFsdWUodmFsKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQm9vbGVhbigpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Jvb2xlYW5WYWx1ZSh0aGlzLm9yaWdpb25hbFZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZmlsbFZhcmlhYmxlcyh2YXJzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZSh0aGlzLm9yaWdpb25hbFZhbHVlKTtcbiAgICBpZiAoISFuYW1lKSB7XG4gICAgICB2YXJzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciB2YWwgPSB0aGlzLm9yaWdpb25hbFZhbHVlO1xuICAgIGlmICh2YWwgJiYgKCF0aGlzLmlzTnVtZXJpYyh2YWwpICYmICF0aGlzLmlzQm9vbGVhblZhbHVlKHZhbCkpKVxuICAgICAgdmFsID0gXCInXCIgKyB2YWwgKyBcIidcIjtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUXVvdGVzQW5kRXNjYXBlcyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbC5sZW5ndGggPiAwICYmICh2YWxbMF0gPT0gXCInXCIgfHwgdmFsWzBdID09ICdcIicpKSB2YWwgPSB2YWwuc3Vic3RyKDEpO1xuICAgIHZhciBsZW4gPSB2YWwubGVuZ3RoO1xuICAgIGlmIChsZW4gPiAwICYmICh2YWxbbGVuIC0gMV0gPT0gXCInXCIgfHwgdmFsW2xlbiAtIDFdID09ICdcIicpKVxuICAgICAgdmFsID0gdmFsLnN1YnN0cigwLCBsZW4gLSAxKTtcbiAgICBpZiAodmFsKSB7XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZShcIlxcXFwnXCIsIFwiJ1wiKTtcbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdcXFxcXCInLCAnXCInKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlTmFtZSh2YWw6IGFueSkge1xuICAgIGlmICh2YWwubGVuZ3RoIDwgMyB8fCB2YWxbMF0gIT0gXCJ7XCIgfHwgdmFsW3ZhbC5sZW5ndGggLSAxXSAhPSBcIn1cIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB2YWwuc3Vic3RyKDEsIHZhbC5sZW5ndGggLSAyKTtcbiAgfVxuICBwcml2YXRlIGlzQm9vbGVhblZhbHVlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgJiZcbiAgICAgICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGlzTnVtZXJpYyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgJiZcbiAgICAgICh2YWx1ZS5pbmRleE9mKFwiLVwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIrXCIpID4gMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiKlwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCJeXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIi9cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiJVwiKSA+IC0xKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsID0gTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBpc0Zpbml0ZSh2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0U2ltcGxlVmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXMgPSB7IGlzU2ltcGxlOiBmYWxzZSwgdmFsdWU6IHZhbCB9O1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJlcy52YWx1ZSA9IG51bGw7XG4gICAgICByZXMuaXNTaW1wbGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCF2YWwgfHwgdHlwZW9mIHZhbCAhPSBcInN0cmluZ1wiKSB7XG4gICAgICByZXMuaXNTaW1wbGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNOdW1lcmljKHZhbCkpIHtcbiAgICAgIHJlcy5pc1NpbXBsZSA9IHRydWU7XG4gICAgICBpZiAodmFsLmluZGV4T2YoXCIweFwiKSA9PSAwKSB7XG4gICAgICAgIHJlcy52YWx1ZSA9IHBhcnNlSW50KHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXMudmFsdWUgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Jvb2xlYW5WYWx1ZSh2YWwpKSB7XG4gICAgICByZXMudmFsdWUgPSB2YWwudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIjtcbiAgICAgIHJlcy5pc1NpbXBsZSA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5leHBvcnQgY2xhc3MgRnVuY3Rpb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHB1YmxpYyBwYXJhbWV0ZXJzOiBBcnJheTxPcGVyYW5kPiA9IG5ldyBBcnJheTxPcGVyYW5kPigpO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3JpZ2lvbmFsVmFsdWU6IGFueSkge1xuICAgIHN1cGVyKG9yaWdpb25hbFZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlOiBQcm9jZXNzVmFsdWUpIHtcbiAgICB2YXIgcGFyYW1WYWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFyYW1WYWx1ZXMucHVzaCh0aGlzLnBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBGdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucnVuKFxuICAgICAgdGhpcy5vcmlnaW9uYWxWYWx1ZSxcbiAgICAgIHBhcmFtVmFsdWVzLFxuICAgICAgcHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXNcbiAgICApO1xuICB9XG4gIHB1YmxpYyBmaWxsVmFyaWFibGVzKHZhcnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzW2ldLmZpbGxWYXJpYWJsZXModmFycyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5vcmlnaW9uYWxWYWx1ZSArIFwiKFwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHJlcyArPSBcIiwgXCI7XG4gICAgICByZXMgKz0gdGhpcy5wYXJhbWV0ZXJzW2ldLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uT3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwdWJsaWMgbGVmdDogT3BlcmFuZDtcbiAgcHVibGljIHJpZ2h0OiBPcGVyYW5kO1xuICBwdWJsaWMgb3BlcmF0b3I6IHN0cmluZztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIobnVsbCk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICBpZiAoIXRoaXMubGVmdCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnJpZ2h0KSByZXR1cm4gdGhpcy5sZWZ0LmdldFZhbHVlKHByb2Nlc3NWYWx1ZSk7XG4gICAgdmFyIGwgPSB0aGlzLmxlZnQuZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlKTtcbiAgICB2YXIgciA9IHRoaXMucmlnaHQuZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlKTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkobCkpIGwgPSAwO1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShyKSkgciA9IDA7XG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT0gXCIrXCIpIHtcbiAgICAgIHJldHVybiBsICsgcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT0gXCItXCIpIHtcbiAgICAgIHJldHVybiBsIC0gcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBsICogcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT0gXCJeXCIpIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdyhsLCByKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT0gXCIvXCIpIHtcbiAgICAgIGlmICghcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gbCAvIHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09IFwiJVwiKSB7XG4gICAgICBpZiAoIXIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGwgJSByO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZmlsbFZhcmlhYmxlcyh2YXJzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgaWYgKCEhdGhpcy5sZWZ0KSB0aGlzLmxlZnQuZmlsbFZhcmlhYmxlcyh2YXJzKTtcbiAgICBpZiAoISF0aGlzLnJpZ2h0KSB0aGlzLnJpZ2h0LmZpbGxWYXJpYWJsZXModmFycyk7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHZhciByZXMgPSB0aGlzLmxlZnQgPyB0aGlzLmxlZnQudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgcmVzICs9IFwiIFwiICsgdGhpcy5vcGVyYXRvciArIFwiIFwiO1xuICAgIGlmICh0aGlzLnJpZ2h0KSByZXMgKz0gdGhpcy5yaWdodC50b1N0cmluZygpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHB1YmxpYyByb290OiBDb25kaXRpb25Ob2RlO1xuICBwcml2YXRlIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlO1xuICBjb25zdHJ1Y3Rvcihyb290OiBDb25kaXRpb25Ob2RlID0gbnVsbCkge1xuICAgIHN1cGVyKG51bGwpO1xuICAgIGlmIChyb290KSB0aGlzLnJvb3QgPSByb290O1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShwcm9jZXNzVmFsdWU6IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnJvb3QpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZTtcbiAgICByZXR1cm4gdGhpcy5ydW5Ob2RlKHRoaXMucm9vdCk7XG4gIH1cbiAgcHVibGljIGZpbGxWYXJpYWJsZXModmFyczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICghIXRoaXMucm9vdCkge1xuICAgICAgdGhpcy5yb290LmZpbGxWYXJpYWJsZXModmFycyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvb3QgPyB0aGlzLnJvb3QudG9TdHJpbmcoKSA6IFwiXCI7XG4gIH1cbiAgcHJpdmF0ZSBydW5Ob2RlKG5vZGU6IENvbmRpdGlvbk5vZGUpOiBib29sZWFuIHtcbiAgICB2YXIgb25GaXJzdEZhaWwgPSBub2RlLmNvbm5lY3RpdmUgPT0gXCJhbmRcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLnJ1bk5vZGVDb25kaXRpb24obm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICBpZiAoIXJlcyAmJiBvbkZpcnN0RmFpbCkgcmV0dXJuIG5vZGUuaXNOb3Q7XG4gICAgICBpZiAocmVzICYmICFvbkZpcnN0RmFpbCkgcmV0dXJuICFub2RlLmlzTm90O1xuICAgIH1cbiAgICByZXR1cm4gIW5vZGUuaXNOb3QgPyBvbkZpcnN0RmFpbCA6ICFvbkZpcnN0RmFpbDtcbiAgfVxuICBwcml2YXRlIHJ1bk5vZGVDb25kaXRpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZVtcImNoaWxkcmVuXCJdKSByZXR1cm4gdGhpcy5ydW5Ob2RlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVbXCJsZWZ0XCJdKSByZXR1cm4gdGhpcy5ydW5Db25kaXRpb24odmFsdWUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb25kaXRpb24ucGVyZm9ybUV4cGxpY2l0KFxuICAgICAgY29uZGl0aW9uLmxlZnQsXG4gICAgICBjb25kaXRpb24ucmlnaHQsXG4gICAgICB0aGlzLnByb2Nlc3NWYWx1ZVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbiB7XG4gIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XG4gIHN0YXRpYyBnZXQgb3BlcmF0b3JzKCkge1xuICAgIGlmIChDb25kaXRpb24ub3BlcmF0b3JzVmFsdWUgIT0gbnVsbCkgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNWYWx1ZTtcbiAgICBDb25kaXRpb24ub3BlcmF0b3JzVmFsdWUgPSB7XG4gICAgICBlbXB0eTogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KSB7XG4gICAgICAgIGlmIChsZWZ0ID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gIWxlZnQ7XG4gICAgICB9LFxuICAgICAgbm90ZW1wdHk6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSkge1xuICAgICAgICBpZiAobGVmdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAhIWxlZnQ7XG4gICAgICB9LFxuICAgICAgZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSkge1xuICAgICAgICByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGxlZnQsIHJpZ2h0LCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBub3RlcXVhbDogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KSB7XG4gICAgICAgIHJldHVybiAhSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGxlZnQsIHJpZ2h0LCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBjb250YWluczogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KSB7XG4gICAgICAgIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzVmFsdWUuY29udGFpbnNDb3JlKGxlZnQsIHJpZ2h0LCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBub3Rjb250YWluczogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KSB7XG4gICAgICAgIGlmICghbGVmdCAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNWYWx1ZS5jb250YWluc0NvcmUobGVmdCwgcmlnaHQsIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBjb250YWluc0NvcmU6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgaXNDb250YWluczogYW55KSB7XG4gICAgICAgIGlmICghbGVmdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgbGVmdCA9IGxlZnQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09IFwic3RyaW5nXCIgfHwgbGVmdCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICByaWdodCA9IHJpZ2h0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgdmFyIGZvdW5kID0gbGVmdC5pbmRleE9mKHJpZ2h0KSA+IC0xO1xuICAgICAgICAgIHJldHVybiBpc0NvbnRhaW5zID8gZm91bmQgOiAhZm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJpZ2h0QXJyYXkgPSBBcnJheS5pc0FycmF5KHJpZ2h0KSA/IHJpZ2h0IDogW3JpZ2h0XTtcbiAgICAgICAgZm9yICh2YXIgckluZGV4ID0gMDsgckluZGV4IDwgcmlnaHRBcnJheS5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgIHJpZ2h0ID0gcmlnaHRBcnJheVtySW5kZXhdO1xuICAgICAgICAgIGZvciAoOyBpIDwgbGVmdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxlZnRbaV0gPT0gcmlnaHQpIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PSBsZWZ0Lmxlbmd0aCkgcmV0dXJuICFpc0NvbnRhaW5zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0NvbnRhaW5zO1xuICAgICAgfSxcbiAgICAgIGdyZWF0ZXI6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSkge1xuICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgIH0sXG4gICAgICBsZXNzOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpIHtcbiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBsZWZ0IDwgcmlnaHQ7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcm9yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSkge1xuICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgICB9LFxuICAgICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSkge1xuICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29uZGl0aW9uLm9wZXJhdG9yc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0T3BlcmF0b3Iob3BOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzW29wTmFtZV07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXRPcGVyYXRvcihcbiAgICBvcE5hbWU6IHN0cmluZyxcbiAgICBmdW5jOiAobGVmdDogYW55LCByaWdodDogYW55KSA9PiBib29sZWFuXG4gICkge1xuICAgIENvbmRpdGlvbi5vcGVyYXRvcnNbb3BOYW1lXSA9IGZ1bmM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBpc0NvcnJlY3RPcGVyYXRvcihvcE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghb3BOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgb3BOYW1lID0gb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNbb3BOYW1lXSAhPSB1bmRlZmluZWQ7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBpc05vUmlnaHRPcGVyYXRpb24ob3A6IHN0cmluZykge1xuICAgIHJldHVybiBvcCA9PSBcImVtcHR5XCIgfHwgb3AgPT0gXCJub3RlbXB0eVwiO1xuICB9XG4gIHByaXZhdGUgb3BWYWx1ZTogc3RyaW5nID0gXCJlcXVhbFwiO1xuICBwcml2YXRlIGxlZnRWYWx1ZTogT3BlcmFuZCA9IG51bGw7XG4gIHByaXZhdGUgcmlnaHRWYWx1ZTogT3BlcmFuZCA9IG51bGw7XG4gIHB1YmxpYyBnZXQgbGVmdCgpOiBPcGVyYW5kIHtcbiAgICByZXR1cm4gdGhpcy5sZWZ0VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBsZWZ0KHZhbDogT3BlcmFuZCkge1xuICAgIHRoaXMubGVmdFZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmlnaHQoKTogT3BlcmFuZCB7XG4gICAgcmV0dXJuIHRoaXMucmlnaHRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJpZ2h0KHZhbDogT3BlcmFuZCkge1xuICAgIHRoaXMucmlnaHRWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3BWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghQ29uZGl0aW9uLm9wZXJhdG9yc1t2YWx1ZV0pIHJldHVybjtcbiAgICB0aGlzLm9wVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcGVyZm9ybShcbiAgICBsZWZ0OiBhbnkgPSBudWxsLFxuICAgIHJpZ2h0OiBhbnkgPSBudWxsLFxuICAgIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWxlZnQpIGxlZnQgPSB0aGlzLmxlZnQ7XG4gICAgaWYgKCFyaWdodCkgcmlnaHQgPSB0aGlzLnJpZ2h0O1xuICAgIHJldHVybiB0aGlzLnBlcmZvcm1FeHBsaWNpdChsZWZ0LCByaWdodCwgcHJvY2Vzc1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgcGVyZm9ybUV4cGxpY2l0KFxuICAgIGxlZnQ6IGFueSxcbiAgICByaWdodDogYW55LFxuICAgIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlXG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBsZWZ0VmFsdWUgPSBsZWZ0ID8gbGVmdC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpIDogbnVsbDtcbiAgICBpZiAoIXJpZ2h0ICYmIChsZWZ0VmFsdWUgPT09IHRydWUgfHwgbGVmdFZhbHVlID09PSBmYWxzZSkpIHJldHVybiBsZWZ0VmFsdWU7XG4gICAgdmFyIHJpZ2h0VmFsdWUgPSByaWdodCA/IHJpZ2h0LmdldFZhbHVlKHByb2Nlc3NWYWx1ZSkgOiBudWxsO1xuICAgIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzW3RoaXMub3BlcmF0b3JdKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGZpbGxWYXJpYWJsZXModmFyczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh0aGlzLmxlZnQpIHRoaXMubGVmdC5maWxsVmFyaWFibGVzKHZhcnMpO1xuICAgIGlmICh0aGlzLnJpZ2h0KSB0aGlzLnJpZ2h0LmZpbGxWYXJpYWJsZXModmFycyk7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJpZ2h0IHx8ICF0aGlzLm9wZXJhdG9yKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgbGVmdCA9IHRoaXMubGVmdC50b1N0cmluZygpO1xuICAgIHZhciByZXMgPSBsZWZ0ICsgXCIgXCIgKyB0aGlzLm9wZXJhdGlvblRvU3RyaW5nKCk7XG4gICAgaWYgKENvbmRpdGlvbi5pc05vUmlnaHRPcGVyYXRpb24odGhpcy5vcGVyYXRvcikpIHJldHVybiByZXM7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodC50b1N0cmluZygpO1xuICAgIHJldHVybiByZXMgKyBcIiBcIiArIHJpZ2h0O1xuICB9XG4gIHByaXZhdGUgb3BlcmF0aW9uVG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB2YXIgb3AgPSB0aGlzLm9wZXJhdG9yO1xuICAgIGlmIChvcCA9PSBcImVxdWFsXCIpIHJldHVybiBcIj1cIjtcbiAgICBpZiAob3AgPT0gXCJub3RlcXVhbFwiKSByZXR1cm4gXCIhPVwiO1xuICAgIGlmIChvcCA9PSBcImdyZWF0ZXJcIikgcmV0dXJuIFwiPlwiO1xuICAgIGlmIChvcCA9PSBcImxlc3NcIikgcmV0dXJuIFwiPFwiO1xuICAgIGlmIChvcCA9PSBcImdyZWF0ZXJvcmVxdWFsXCIpIHJldHVybiBcIj49XCI7XG4gICAgaWYgKG9wID09IFwibGVzc29yZXF1YWxcIikgcmV0dXJuIFwiPD1cIjtcbiAgICByZXR1cm4gb3A7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25Ob2RlIHtcbiAgcHJpdmF0ZSBjb25uZWN0aXZlVmFsdWU6IHN0cmluZyA9IFwiYW5kXCI7XG4gIHB1YmxpYyBpc05vdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2hpbGRyZW46IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIGdldCBjb25uZWN0aXZlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGl2ZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY29ubmVjdGl2ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsdWUgPT0gXCImXCIgfHwgdmFsdWUgPT0gXCImJlwiKSB2YWx1ZSA9IFwiYW5kXCI7XG4gICAgaWYgKHZhbHVlID09IFwifFwiIHx8IHZhbHVlID09IFwifHxcIikgdmFsdWUgPSBcIm9yXCI7XG4gICAgaWYgKHZhbHVlICE9IFwiYW5kXCIgJiYgdmFsdWUgIT0gXCJvclwiKSByZXR1cm47XG4gICAgdGhpcy5jb25uZWN0aXZlVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLmNvbm5lY3RpdmUgPSBcImFuZFwiO1xuICB9XG4gIHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHZhcnM6IEFycmF5PGFueT4gPSBbXTtcbiAgICB0aGlzLmZpbGxWYXJpYWJsZXModmFycyk7XG4gICAgcmV0dXJuIHZhcnM7XG4gIH1cbiAgcHVibGljIGZpbGxWYXJpYWJsZXModmFyczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jaGlsZHJlbltpXS5maWxsVmFyaWFibGVzKHZhcnMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICB2YXIgbm9kZVRleHQgPSBjaGlsZC50b1N0cmluZygpO1xuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZVRleHQgPSBcIihcIiArIG5vZGVUZXh0ICsgXCIpXCI7XG4gICAgICB9XG4gICAgICBpZiAobm9kZVRleHQpIHtcbiAgICAgICAgaWYgKHJlcykgcmVzICs9IFwiIFwiICsgdGhpcy5jb25uZWN0aXZlICsgXCIgXCI7XG4gICAgICAgIHJlcyArPSBub2RlVGV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25SdW5uZXIge1xuICBwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlO1xuICBwcml2YXRlIG9wZXJhbmQ6IE9wZXJhbmQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHRoaXMucHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3BlcmFuZCA9IG5ldyBDb25kaXRpb25zUGFyc2VyKCkucGFyc2VFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvblZhbHVlKTtcbiAgfVxuICBwdWJsaWMgY2FuUnVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMub3BlcmFuZDtcbiAgfVxuICBwdWJsaWMgcnVuKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBudWxsO1xuICAgIHRoaXMucHJvY2Vzc1ZhbHVlLnZhbHVlcyA9IHZhbHVlcztcbiAgICB0aGlzLnByb2Nlc3NWYWx1ZS5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICByZXR1cm4gdGhpcy5vcGVyYW5kLmdldFZhbHVlKHRoaXMucHJvY2Vzc1ZhbHVlKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIENvbmRpdGlvblJ1bm5lciB7XG4gIHByaXZhdGUgZXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcm9vdDogQ29uZGl0aW9uTm9kZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZykge1xuICAgIHRoaXMucm9vdCA9IG5ldyBDb25kaXRpb25Ob2RlKCk7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5leHByZXNzaW9uID09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5leHByZXNzaW9uVmFsdWUgPSB2YWx1ZTtcbiAgICBuZXcgQ29uZGl0aW9uc1BhcnNlcigpLnBhcnNlKHRoaXMuZXhwcmVzc2lvblZhbHVlLCB0aGlzLnJvb3QpO1xuICB9XG4gIHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb290ID8gdGhpcy5yb290LmdldFZhcmlhYmxlcygpIDogW107XG4gIH1cbiAgcHVibGljIHJ1bihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbk9wZXJhbmQodGhpcy5yb290KTtcbiAgICB2YXIgcHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgIHByb2Nlc3NWYWx1ZS52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgcHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIHJldHVybiA8Ym9vbGVhbj5jb25kaXRpb24uZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnMudHMiLCJpbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgSnNvbk9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogQXJyYXkgb2YgSXRlbVZhbHVlIGlzIHVzZWQgaW4gY2hlY2tveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgY2hvaWNlcywgbWF0cml4IGNvbHVtbnMgYW5kIHJvd3MuXG4gKiBJdCBoYXMgdHdvIG1haW4gcHJvcGVydGllczogdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHZhbHVlIGlzIHVzZWQgZm9yIGRpc3BsYXlpbmcuXG4gKiBUaGUgdGV4dCBwcm9wZXJ0eSBpcyBsb2NhbGl6YWJsZSBhbmQgc3VwcG9ydCBtYXJrZG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEl0ZW1WYWx1ZSBleHRlbmRzIEJhc2Uge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHVibGljIHN0YXRpYyBTZXBhcmF0b3IgPSBcInxcIjtcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVBcnJheShsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4gPSBbXTtcbiAgICBJdGVtVmFsdWUuc2V0dXBBcnJheShpdGVtcywgbG9jT3duZXIpO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldHVwQXJyYXkoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgbG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyXG4gICkge1xuICAgIGl0ZW1zLnB1c2ggPSBmdW5jdGlvbih2YWx1ZSk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IGxvY093bmVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGl0ZW1zLnVuc2hpZnQgPSBmdW5jdGlvbih2YWx1ZSk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IGxvY093bmVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGl0ZW1zLnNwbGljZSA9IGZ1bmN0aW9uKFxuICAgICAgc3RhcnQ/OiBudW1iZXIsXG4gICAgICBkZWxldGVDb3VudD86IG51bWJlcixcbiAgICAgIC4uLml0ZW1zOiBJdGVtVmFsdWVbXVxuICAgICk6IEl0ZW1WYWx1ZVtdIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBkZWxldGVDb3VudCxcbiAgICAgICAgLi4uaXRlbXNcbiAgICAgICk7XG4gICAgICBpZiAoIWl0ZW1zKSBpdGVtcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVtc1tpXS5sb2NPd25lciA9IGxvY093bmVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0RGF0YShpdGVtczogQXJyYXk8SXRlbVZhbHVlPiwgdmFsdWVzOiBBcnJheTxhbnk+KSB7XG4gICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgdmFyIGl0ZW07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpdGVtID0gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyh2YWx1ZS5nZXRUeXBlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgICBpdGVtLnNldERhdGEodmFsdWUpO1xuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbXNbaV0uZ2V0RGF0YSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldEl0ZW1CeVZhbHVlKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWw6IGFueSk6IEl0ZW1WYWx1ZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhpdGVtc1tpXS52YWx1ZSwgdmFsKSkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHZhbDogYW55XG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoaXRlbXMsIHZhbCk7XG4gICAgcmV0dXJuIGl0ZW0gIT09IG51bGwgPyBpdGVtLmxvY1RleHQudGV4dE9ySHRtbCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBsb2NTdHJzQ2hhbmdlZChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLmxvY1RleHQuc3RyQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBmaWx0ZXJlZEl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtc0NvcmUoXG4gICAgICBpdGVtcyxcbiAgICAgIGZpbHRlcmVkSXRlbXMsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBydW5FbmFibGVkQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtc0NvcmUoXG4gICAgICBpdGVtcyxcbiAgICAgIG51bGwsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIHJ1bkNvbmRpdGlvbnNGb3JJdGVtc0NvcmUoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgZmlsdGVyZWRJdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBydW5uZXI6IENvbmRpdGlvblJ1bm5lcixcbiAgICB2YWx1ZXM6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBhbnksXG4gICAgaXNWaXNpYmxlOiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICB2YWx1ZXMgPSB7fTtcbiAgICB9XG4gICAgdmFyIGl0ZW1WYWx1ZSA9IHZhbHVlc1tcIml0ZW1cIl07XG4gICAgdmFyIGNob2ljZVZhbHVlID0gdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIHZhciBoYXNDaGFuZGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtLnZhbHVlO1xuICAgICAgdmFsdWVzW1wiY2hvaWNlXCJdID0gaXRlbS52YWx1ZTtcbiAgICAgIHZhciBpdGVtUnVubmVyID0gISFpdGVtLmdldENvbmRpdGlvblJ1bm5lclxuICAgICAgICA/IGl0ZW0uZ2V0Q29uZGl0aW9uUnVubmVyKGlzVmlzaWJsZSlcbiAgICAgICAgOiBmYWxzZTtcbiAgICAgIGlmICghaXRlbVJ1bm5lcikge1xuICAgICAgICBpdGVtUnVubmVyID0gcnVubmVyO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gdHJ1ZTtcbiAgICAgIGlmIChpdGVtUnVubmVyKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXRlbVJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgIH1cbiAgICAgIGlmICghIWZpbHRlcmVkSXRlbXMgJiYgbmV3VmFsdWUpIHtcbiAgICAgICAgZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgICAgdmFyIG9sZFZhbHVlID0gaXNWaXNpYmxlID8gaXRlbS5pc1Zpc2libGUgOiBpdGVtLmlzRW5hYmxlZDtcbiAgICAgIGlmIChuZXdWYWx1ZSAhPSBvbGRWYWx1ZSkge1xuICAgICAgICBoYXNDaGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgICAgIGlmICghIWl0ZW0uc2V0SXNWaXNpYmxlKSBpdGVtLnNldElzVmlzaWJsZShuZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEhaXRlbS5zZXRJc0VuYWJsZWQpIGl0ZW0uc2V0SXNFbmFibGVkKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXRlbVZhbHVlKSB7XG4gICAgICB2YWx1ZXNbXCJpdGVtXCJdID0gaXRlbVZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzW1wiaXRlbVwiXTtcbiAgICB9XG4gICAgaWYgKGNob2ljZVZhbHVlKSB7XG4gICAgICB2YWx1ZXNbXCJjaG9pY2VcIl0gPSBjaG9pY2VWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlc1tcImNob2ljZVwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5kZWQ7XG4gIH1cbiAgcHJpdmF0ZSB2aXNpYmxlSWZWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBpdGVtVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBsb2NUZXh0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBwcml2YXRlIGlzVmlzaWJsZVZhbHVlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSB2aXNpYmxlQ29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgZW5hYmxlQ29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG5cbiAgY29uc3RydWN0b3IodmFsdWU6IGFueSwgdGV4dDogc3RyaW5nID0gbnVsbCwgcHJpdmF0ZSB0eXBlTmFtZSA9IFwiaXRlbXZhbHVlXCIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubG9jVGV4dFZhbHVlID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKG51bGwsIHRydWUpO1xuICAgIHRoaXMubG9jVGV4dFZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gdHh0ID0+IHtcbiAgICAgIHJldHVybiB0eHQgPyB0eHQgOiAhdGhpcy5pc1ZhbHVlSXRlbUVtcHR5ID8gdGhpcy52YWx1ZS50b1N0cmluZygpIDogbnVsbDtcbiAgICB9O1xuICAgIGlmICh0ZXh0KSB0aGlzLmxvY1RleHQudGV4dCA9IHRleHQ7XG4gICAgaWYgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLnNldERhdGEodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHB1YmxpYyBvbkNyZWF0aW5nKCk6IGFueSB7fVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGVOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dFZhbHVlO1xuICB9XG4gIHNldExvY1RleHQobG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpIHtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IGxvY1RleHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NPd25lcigpOiBJTG9jYWxpemFibGVPd25lciB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5vd25lcjtcbiAgfVxuICBwdWJsaWMgc2V0IGxvY093bmVyKHZhbHVlOiBJTG9jYWxpemFibGVPd25lcikge1xuICAgIHRoaXMubG9jVGV4dC5vd25lciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5pdGVtVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICBpZiAoIXRoaXMuaXRlbVZhbHVlKSByZXR1cm47XG4gICAgdmFyIHN0cjogc3RyaW5nID0gdGhpcy5pdGVtVmFsdWUudG9TdHJpbmcoKTtcbiAgICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZihJdGVtVmFsdWUuU2VwYXJhdG9yKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5pdGVtVmFsdWUgPSBzdHIuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgdGhpcy50ZXh0ID0gc3RyLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5oYXNUZXh0KSB7XG4gICAgICB0aGlzLmxvY1RleHQub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LnB1cmVUZXh0ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQudGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQobmV3VGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NUZXh0LnRleHQgPSBuZXdUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXREYXRhKCk6IGFueSB7XG4gICAgdmFyIGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgIGlmICghIWpzb25bXCJ2YWx1ZVwiXSAmJiAhIWpzb25bXCJ2YWx1ZVwiXVtcInBvc1wiXSkge1xuICAgICAgZGVsZXRlIGpzb25bXCJ2YWx1ZVwiXVtcInBvc1wiXTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGpzb24pLmxlbmd0aCA9PSAxICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShqc29uW1widmFsdWVcIl0pKVxuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIHRvSlNPTigpOiBhbnkge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICB2YXIgcHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyh0aGlzLmdldFR5cGUoKSk7XG4gICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMoXCJpdGVtdmFsdWVcIik7XG4gICAgfVxuICAgIHZhciBqc29PYmogPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAganNvT2JqLnZhbHVlVG9Kc29uKHRoaXMsIHJlcywgcHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEodmFsdWU6IGFueSkge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHZhbHVlLnZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB2YXIganNvbiA9IHZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS50b0pTT04gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBqc29uID0gKDxCYXNlPnZhbHVlKS50b0pTT04oKTtcbiAgICAgIH1cbiAgICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlSWZWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMudmlzaWJsZUlmVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldElzVmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVmlzaWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0VuYWJsZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldElzRW5hYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0VuYWJsZWRcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29uZGl0aW9uUnVubmVyKGlzVmlzaWJsZTogYm9vbGVhbikge1xuICAgIGlmIChpc1Zpc2libGUpIHJldHVybiB0aGlzLmdldFZpc2libGVDb25kaXRpb25SdW5uZXIoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRFbmFibGVDb25kaXRpb25SdW5uZXIoKTtcbiAgfVxuICBwcml2YXRlIGdldFZpc2libGVDb25kaXRpb25SdW5uZXIoKTogQ29uZGl0aW9uUnVubmVyIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIHRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy52aXNpYmxlSWY7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbmRpdGlvblJ1bm5lcjtcbiAgfVxuICBwcml2YXRlIGdldEVuYWJsZUNvbmRpdGlvblJ1bm5lcigpOiBDb25kaXRpb25SdW5uZXIge1xuICAgIGlmICghdGhpcy5lbmFibGVJZikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICB0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5lbmFibGVJZjtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVDb25kaXRpb25SdW5uZXI7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNWYWx1ZUl0ZW1FbXB0eSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXRlbVZhbHVlICYmIHRoaXMuaXRlbVZhbHVlICE9PSAwICYmIHRoaXMuaXRlbVZhbHVlICE9PSBmYWxzZTtcbiAgfVxufVxuXG5CYXNlLmNyZWF0ZUl0ZW1WYWx1ZSA9IGZ1bmN0aW9uKGRlc3Q6IGFueSk6IGFueSB7XG4gIHZhciBpdGVtID0gbnVsbDtcbiAgaWYgKHR5cGVvZiBkZXN0LmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwsIHVuZGVmaW5lZCwgZGVzdC5nZXRUeXBlKCkpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwpO1xuICB9XG4gIGl0ZW0uc2V0RGF0YShkZXN0KTtcbiAgcmV0dXJuIGl0ZW07XG59O1xuQmFzZS5pdGVtVmFsdWVMb2NTdHJDaGFuZ2VkID0gZnVuY3Rpb24oYXJyOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gIEl0ZW1WYWx1ZS5sb2NTdHJzQ2hhbmdlZChhcnIpO1xufTtcbkpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24odmFsOiBhbnkpOiBhbnkge1xuICB2YXIgcmVzID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgSXRlbVZhbHVlLnNldERhdGEocmVzLCB2YWwgfHwgW10pO1xuICByZXR1cm4gcmVzO1xufTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJpdGVtdmFsdWVcIixcbiAgW1xuICAgIFwidmFsdWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmOmNvbmRpdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9XG4gIF0sXG4gICh2YWx1ZTogYW55KSA9PiBuZXcgSXRlbVZhbHVlKHZhbHVlKVxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9pdGVtdmFsdWUudHMiLCJleHBvcnQgdmFyIHN1cnZleUNzczogYW55ID0ge1xuICBjdXJyZW50VHlwZTogXCJcIixcbiAgZ2V0Q3NzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50VHlwZSA/IHRoaXNbdGhpcy5jdXJyZW50VHlwZV0gOiBkZWZhdWx0U3RhbmRhcmRDc3M7XG4gICAgaWYgKCFsb2MpIGxvYyA9IGRlZmF1bHRTdGFuZGFyZENzcztcbiAgICByZXR1cm4gbG9jO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGRlZmF1bHRTdGFuZGFyZENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2RlZmF1bHRfY3NzXCIsXG4gIGhlYWRlcjogXCJzdl9oZWFkZXJcIixcbiAgYm9keTogXCJzdl9ib2R5XCIsXG4gIGZvb3RlcjogXCJzdl9uYXZcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJzdl9jb21wbGV0ZWRfcGFnZVwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwic3ZfY29tcGxldGVfYnRuXCIsXG4gICAgcHJldjogXCJzdl9wcmV2X2J0blwiLFxuICAgIG5leHQ6IFwic3ZfbmV4dF9idG5cIixcbiAgICBzdGFydDogXCJzdl9zdGFydF9idG5cIlxuICB9LFxuICBwcm9ncmVzczogXCJzdl9wcm9ncmVzc1wiLFxuICBwcm9ncmVzc0JhcjogXCJzdl9wcm9ncmVzc19iYXJcIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwic3ZfcF9yb290XCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfSxcbiAgLy8gVE9ETzogbW92ZSB0byB0aGUgcGFnZSBvYmplY3RcbiAgcGFnZVRpdGxlOiBcInN2X3BhZ2VfdGl0bGVcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcIlwiLFxuICByb3c6IFwic3Zfcm93XCIsXG4gIHF1ZXN0aW9uOiB7XG4gICAgbWFpblJvb3Q6IFwic3ZfcSBzdl9xc3RuXCIsXG4gICAgdGl0bGU6IFwic3ZfcV90aXRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2X3FfZGVzY3JpcHRpb25cIixcbiAgICBjb21tZW50OiBcIlwiLFxuICAgIHJlcXVpcmVkOiBcIlwiLFxuICAgIHRpdGxlUmVxdWlyZWQ6IFwiXCIsXG4gICAgaGFzRXJyb3I6IFwiXCIsXG4gICAgaW5kZW50OiAyMCxcbiAgICBmb290ZXI6IFwic3ZfcV9mb290ZXJcIlxuICB9LFxuICBwYW5lbDogeyB0aXRsZTogXCJzdl9wX3RpdGxlXCIsIGRlc2NyaXB0aW9uOiBcInN2X3BfZGVzY3JpcHRpb25cIiwgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIgfSxcbiAgZXJyb3I6IHsgcm9vdDogXCJzdl9xX2VyYm94XCIsIGljb246IFwiXCIsIGl0ZW06IFwiXCIgfSxcblxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIHN2X3FibG5cIixcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIHN2X3FjYnhcIixcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcbiAgICBsYWJlbDogXCJzdl9xX2NoZWNrYm94X2xhYmVsXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2l0ZW1cIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2xhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2hlY2tib3gtbWF0ZXJpYWxcIixcbiAgICBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfY2hlY2tib3hfb3RoZXJcIlxuICB9LFxuICBjb21tZW50OiBcIlwiLFxuICBkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgY29udHJvbDogXCJzdl9xX2Ryb3Bkb3duX2NvbnRyb2xcIixcbiAgICBzZWxlY3RXcmFwcGVyOiBcInN2X3NlbGVjdF93cmFwcGVyXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlclwiXG4gIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWxcIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZFwiLFxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwic3ZfcV9tYXRyaXhfZHJvcGRvd25cIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdl9xX21hdHJpeF9keW5hbWljXCIsXG4gICAgYnV0dG9uOiBcInN2X21hdHJpeF9keW5hbWljX2J1dHRvblwiLFxuICAgIGJ1dHRvbkFkZDogXCJcIixcbiAgICBidXR0b25SZW1vdmU6IFwiXCJcbiAgfSxcbiAgcGFuZWxkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdl9wYW5lbF9keW5hbWljXCIsXG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIGJ1dHRvbjogXCJcIixcbiAgICBidXR0b25QcmV2OiBcIlwiLFxuICAgIGJ1dHRvbk5leHQ6IFwiXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIlxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInN2X3FfbXRcIixcbiAgICBpdGVtVGl0bGU6IFwic3ZfcV9tdF90aXRsZVwiLFxuICAgIHJvdzogXCJzdl9xX210X3Jvd1wiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgc3ZfcV90ZXh0X3Jvb3RcIlxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIixcbiAgICBsYWJlbDogXCJzdl9xX3JhZGlvZ3JvdXBfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX3JhZGlvZ3JvdXBfY29udHJvbF9pdGVtXCIsXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNpcmNsZVwiLFxuICAgIG90aGVyOiBcInN2X3Ffb3RoZXIgc3ZfcV9yYWRpb2dyb3VwX290aGVyXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCJcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxuICAgIGl0ZW06IFwic3ZfcV9pbWdzZWxcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwic3ZfcV9yYXRpbmdcIixcbiAgICBpdGVtOiBcInN2X3FfcmF0aW5nX2l0ZW1cIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiXG4gIH0sXG4gIHRleHQ6IFwic3ZfcV90ZXh0X3Jvb3RcIixcbiAgZXhwcmVzc2lvbjogXCJcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwic3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2X3FfZmlsZV9pbnB1dFwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiXCIsXG4gICAgZXJyb3I6IFwiXCIsXG4gICAgc3VjY2VzczogXCJcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCJcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcbiAgICBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBidXR0b246IFwiXCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJcIlxuICAgIH1cbiAgfVxufTtcblxuc3VydmV5Q3NzW1wic3RhbmRhcmRcIl0gPSBkZWZhdWx0U3RhbmRhcmRDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQge1xuICBRdWVzdGlvblNlbGVjdEJhc2UsXG4gIFF1ZXN0aW9uQ2hlY2tib3hCYXNlXG59IGZyb20gXCIuLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBwcm90ZWN0ZWQgb25DcmVhdGVkKCkge31cbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuXG4gICAgdGhpcy5vbkNyZWF0ZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikuaXNPdGhlclNlbGVjdGVkO1xuICB9XG59XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29BZnRlclJlbmRlclwiXSA9IHRoaXMua29BZnRlclJlbmRlcjtcbiAgfVxuICBwcml2YXRlIGtvQWZ0ZXJSZW5kZXIoZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICB2YXIgdEVsID0gZWxbMF07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgICB0RWwgPSBlbFtlbC5sZW5ndGggLSAxXTtcbiAgICBpZiAodEVsLm5vZGVOYW1lID09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwiaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlQ29yZSB7XG4gIGhhc1ZhbHVlOiBib29sZWFuO1xuICB2YWx1ZTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgUHJvY2Vzc1ZhbHVlIHtcbiAgcHVibGljIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsO1xuICBwdWJsaWMgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsO1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBnZXRGaXJzdE5hbWUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoID0gdGV4dFtpXTtcbiAgICAgIGlmIChjaCA9PSBcIi5cIiB8fCBjaCA9PSBcIltcIikgYnJlYWs7XG4gICAgICByZXMgKz0gY2g7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGhhc1ZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlcykgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VmFsdWVDb3JlKHRleHQsIHZhbHVlcyk7XG4gICAgcmV0dXJuIHJlcy5oYXNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUodGV4dDogc3RyaW5nLCB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xuICAgIHJldHVybiByZXMudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUNvcmUodGV4dDogc3RyaW5nLCB2YWx1ZXM6IGFueSk6IGFueSB7XG4gICAgdmFyIHJlczogVmFsdWVDb3JlID0geyBoYXNWYWx1ZTogZmFsc2UsIHZhbHVlOiBudWxsIH07XG4gICAgdmFyIGN1clZhbHVlID0gdmFsdWVzO1xuICAgIGlmICghY3VyVmFsdWUpIHJldHVybiByZXM7XG4gICAgaWYgKFxuICAgICAgdGV4dCAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPiAtMSAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPT09IHRleHQubGVuZ3RoIC0gXCIubGVuZ3RoXCIubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXMudmFsdWUgPSAwO1xuICAgICAgcmVzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGlzRmlyc3QgPSB0cnVlO1xuICAgIHdoaWxlICh0ZXh0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGlzQXJyYXkgPSAhaXNGaXJzdCAmJiB0ZXh0WzBdID09IFwiW1wiO1xuICAgICAgaWYgKCFpc0FycmF5KSB7XG4gICAgICAgIGlmICghaXNGaXJzdCkgdGV4dCA9IHRleHQuc3Vic3RyKDEpO1xuICAgICAgICB2YXIgY3VyTmFtZSA9IHRoaXMuZ2V0Rmlyc3ROYW1lKHRleHQpO1xuICAgICAgICBpZiAoIWN1ck5hbWUpIHJldHVybiByZXM7XG4gICAgICAgIGN1clZhbHVlID0gdGhpcy5nZXRPYmplY3RWYWx1ZShjdXJWYWx1ZSwgY3VyTmFtZSk7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShjdXJWYWx1ZSkpIHJldHVybiByZXM7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cihjdXJOYW1lLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VyVmFsdWUpKSByZXR1cm4gcmVzO1xuICAgICAgICB2YXIgaW5kZXggPSAxO1xuICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGggJiYgdGV4dFtpbmRleF0gIT0gXCJdXCIpIHtcbiAgICAgICAgICBzdHIgKz0gdGV4dFtpbmRleF07XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gaW5kZXggPCB0ZXh0Lmxlbmd0aCA/IHRleHQuc3Vic3RyKGluZGV4ICsgMSkgOiBcIlwiO1xuICAgICAgICBpbmRleCA9IHRoaXMuZ2V0SW50VmFsdWUoc3RyKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjdXJWYWx1ZS5sZW5ndGgpIHJldHVybiByZXM7XG4gICAgICAgIGN1clZhbHVlID0gY3VyVmFsdWVbaW5kZXhdO1xuICAgICAgfVxuICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXMudmFsdWUgPSBjdXJWYWx1ZTtcbiAgICByZXMuaGFzVmFsdWUgPSB0cnVlO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRPYmplY3RWYWx1ZShvYmo6IGFueSwgbmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG5hbWUpKSByZXR1cm4gb2JqW25hbWVdO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIEEgPSBuYW1lWzBdO1xuICAgIHZhciBhID0gQS50b1VwcGVyQ2FzZSgpO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIHZhciBmaXJzdCA9IGtleVswXTtcbiAgICAgIGlmIChmaXJzdCA9PT0gYSB8fCBmaXJzdCA9PT0gQSkge1xuICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT0gbmFtZSkgcmV0dXJuIG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGdldEludFZhbHVlKHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PSBcIjBcIiB8fCAoKHN0ciB8IDApID4gMCAmJiBzdHIgJSAxID09IDApKSByZXR1cm4gTnVtYmVyKHN0cik7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uUHJvY2Vzc1ZhbHVlLnRzIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyB0aGUgc3RyaW5nIHRoYXQgc3VwcG9ydHMgbXVsdGktbGFuZ3VhZ2VzIGFuZCBtYXJrZG93bi5cbiAqIEl0IHVzZXMgaW4gYWxsIG9iamVjdHMgd2hlcmUgc3VwcG9ydCBmb3IgbXVsdGktbGFuZ3VhZ2VzIGFuZCBtYXJrZG93biBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsaXphYmxlU3RyaW5nIHtcbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0TG9jYWxlOiBzdHJpbmcgPSBcImRlZmF1bHRcIjtcbiAgcHJpdmF0ZSB2YWx1ZXMgPSB7fTtcbiAgcHJpdmF0ZSBodG1sVmFsdWVzID0ge307XG4gIHByaXZhdGUgcmVuZGVyZWRUZXh0OiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNhbGN1bGF0ZWRUZXh0OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgb25SZW5kZXJlZEh0bWxDYWxsYmFjazogKGh0bWw6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwdWJsaWMgb25HZXRUZXh0Q2FsbGJhY2s6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIG9uU3RyQ2hhbmdlZDogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG93bmVyOiBJTG9jYWxpemFibGVPd25lcixcbiAgICBwdWJsaWMgdXNlTWFya2Rvd246IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lciA/IHRoaXMub3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzdHJDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLnJlbmRlcmVkVGV4dCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsY3VsYXRlZFRleHQgPSB0aGlzLmNhbFRleHQoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlZFRleHQgIT09IHRoaXMuY2FsY3VsYXRlZFRleHQpIHtcbiAgICAgIHRoaXMub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHRoaXMucmVuZGVyZWRUZXh0ID1cbiAgICAgIHRoaXMuY2FsY3VsYXRlZFRleHQgIT09IG51bGwgPyB0aGlzLmNhbGN1bGF0ZWRUZXh0IDogdGhpcy5jYWxUZXh0KCk7XG4gICAgdGhpcy5jYWxjdWxhdGVkVGV4dCA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWRUZXh0O1xuICB9XG4gIHByaXZhdGUgY2FsVGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLnB1cmVUZXh0O1xuICAgIGlmIChcbiAgICAgIHJlcyAmJlxuICAgICAgdGhpcy5vd25lciAmJlxuICAgICAgdGhpcy5vd25lci5nZXRQcm9jZXNzZWRUZXh0ICYmXG4gICAgICByZXMuaW5kZXhPZihcIntcIikgPiAtMVxuICAgICkge1xuICAgICAgcmVzID0gdGhpcy5vd25lci5nZXRQcm9jZXNzZWRUZXh0KHJlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uR2V0VGV4dENhbGxiYWNrKSByZXMgPSB0aGlzLm9uR2V0VGV4dENhbGxiYWNrKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHB1cmVUZXh0KCkge1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICB2YXIgcmVzID0gKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gICAgaWYgKCFyZXMgJiYgbG9jID09IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGUpIHtcbiAgICAgIHJlcyA9ICg8YW55PnRoaXMpLnZhbHVlc1tzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZV07XG4gICAgfVxuICAgIGlmICghcmVzICYmIGxvYyAhPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSkge1xuICAgICAgcmVzID0gKDxhbnk+dGhpcykudmFsdWVzW0xvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGVdO1xuICAgIH1cbiAgICBpZiAoIXJlcykgcmVzID0gXCJcIjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSHRtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNIdG1sVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGh0bWwoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0h0bWwpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiB0aGlzLmdldEh0bWxWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dE9ySHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNIdG1sID8gdGhpcy5nZXRIdG1sVmFsdWUoKSA6IHRoaXMudGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkSHRtbCgpIHtcbiAgICB2YXIgcmVzID0gdGhpcy50ZXh0T3JIdG1sO1xuICAgIHJldHVybiB0aGlzLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2sgPyB0aGlzLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2socmVzKSA6IHJlcztcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxlVGV4dCh0aGlzLmxvY2FsZSwgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICB2YXIgcmVzID0gKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KGxvYykpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgbG9jICYmXG4gICAgICBsb2MgIT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSAmJlxuICAgICAgISg8YW55PnRoaXMpLnZhbHVlc1tsb2NdICYmXG4gICAgICB2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQoTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgaWYgKCFsb2MpIGxvYyA9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGU7XG4gICAgZGVsZXRlICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBpZiAoKDxhbnk+dGhpcykudmFsdWVzW2xvY10pIGRlbGV0ZSAoPGFueT50aGlzKS52YWx1ZXNbbG9jXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9jICE9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGUgJiZcbiAgICAgICAgICB2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQoTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KGxvYywgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKDxhbnk+dGhpcykudmFsdWVzW2xvY10gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAobG9jID09IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGhhc05vbkRlZmF1bHRUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID4gMSB8fCBrZXlzWzBdICE9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGU7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGtleXMubGVuZ3RoID09IDEgJiYga2V5c1swXSA9PSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlKVxuICAgICAgcmV0dXJuICg8YW55PnRoaXMpLnZhbHVlc1trZXlzWzBdXTtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdGhpcy5odG1sVmFsdWVzID0ge307XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChudWxsLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldExvY2FsZVRleHQoa2V5LCB2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGVxdWFscyhvYmo6IGFueSkge1xuICAgIGlmICghb2JqIHx8ICFvYmoudmFsdWVzKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlcywgb2JqLnZhbHVlcyk7XG4gIH1cbiAgcHVibGljIG9uQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5vblN0ckNoYW5nZWQpIHRoaXMub25TdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcml2YXRlIGhhc0h0bWxWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub3duZXIgfHwgIXRoaXMudXNlTWFya2Rvd24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdGV4dCA9IHRoaXMudGV4dDtcbiAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbG9jID0gdGhpcy5sb2NhbGU7XG4gICAgaWYgKCFsb2MpIGxvYyA9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGU7XG4gICAgKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdID0gdGhpcy5vd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCk7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldEh0bWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVWYWx1ZXNFcXVhbHNUb0RlZmF1bHQoZGVmYXVsdFZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChrZXlzW2ldID09IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGUpIGNvbnRpbnVlO1xuICAgICAgaWYgKCg8YW55PnRoaXMpLnZhbHVlc1trZXlzW2ldXSA9PSBkZWZhdWx0VmFsdWUpXG4gICAgICAgIGRlbGV0ZSAoPGFueT50aGlzKS52YWx1ZXNba2V5c1tpXV07XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemFibGVzdHJpbmcudHMiLCJpbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIElTdXJ2ZXlJbXBsIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBDaG9pY2VzUmVzdGZ1bGwgfSBmcm9tIFwiLi9jaG9pY2VzUmVzdGZ1bGxcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IHR1cmtpc2hTdXJ2ZXlTdHJpbmdzIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uL3R1cmtpc2hcIjtcblxuLyoqXG4gKiBJdCBpcyBhIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94LCBkcm9wZG93biBhbmQgcmFkaW9ncm91cCBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblNlbGVjdEJhc2UgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByaXZhdGUgZmlsdGVyZWRDaG9pY2VzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT4gPSBudWxsO1xuICBwcml2YXRlIGNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb21tZW50VmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBvdGhlckl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcIm90aGVyXCIpO1xuICBwcm90ZWN0ZWQgY2FjaGVkVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBjaG9pY2VzRnJvbVVybDogQXJyYXk8SXRlbVZhbHVlPiA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0czogYW55ID0gbnVsbDtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGZpbGwgdGhlIGNob2ljZXMgZnJvbSBhIHJlc3RmdWwgc2VydmljZS5cbiAgICogQHNlZSBjaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgY2hvaWNlc0J5VXJsOiBDaG9pY2VzUmVzdGZ1bGw7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNob2ljZXMgPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJjaG9pY2VzXCIpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjaG9pY2VzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzZWxmLmZpbHRlckl0ZW1zKCkpIHtcbiAgICAgICAgc2VsZi5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcImhpZGVJZkNob2ljZXNFbXB0eVwiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25DaG9pY2VzKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmlzaWJsZUNob2ljZXNcIik7XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwgPSB0aGlzLmNyZWF0ZVJlc3RmdWxsKCk7XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwub3duZXIgPSB0aGlzO1xuICAgIHZhciBsb2NPdGhlclRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlckVycm9yVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLnNldExvY1RleHQobG9jT3RoZXJUZXh0KTtcbiAgICBsb2NPdGhlclRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwuZ2V0UmVzdWx0Q2FsbGJhY2sgPSBmdW5jdGlvbihpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgICAgc2VsZi5vbkxvYWRDaG9pY2VzRnJvbVVybChpdGVtcyk7XG4gICAgfTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC51cGRhdGVSZXN1bHRDYWxsYmFjayA9IGZ1bmN0aW9uKFxuICAgICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgICBzZXJ2ZXJSZXN1bHQ6IGFueVxuICAgICk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgICAgaWYgKHNlbGYuc3VydmV5KSB7XG4gICAgICAgIHJldHVybiBzZWxmLnN1cnZleS51cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihzZWxmLCBpdGVtcywgc2VydmVyUmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvdGhlciBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzT3RoZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHVzZXIgc2VsZWN0IHRoZSAnb3RoZXInIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpXG4gICAgICA/IHRoaXMuZ2V0SGFzT3RoZXIodGhpcy52YWx1ZSlcbiAgICAgIDogdGhpcy5nZXRIYXNPdGhlcih0aGlzLmNhY2hlZFZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggY2hvaWNlcyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqIEBzZWUgY2hvaWNlc0VuYWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNWaXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1Zpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNWaXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzVmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJdCBydW5zIGFnYWluc3QgZWFjaCBjaG9pY2VzIGl0ZW0gYW5kIGlmIGZvciB0aGlzIGl0ZW0gaXQgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBpdGVtIGlzIGVuYWJsZWQgb3RoZXJ3aXNlIHRoZSBpdGVtIGJlY29tZXMgZGlzYWJsZWQuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIGNob2ljZXNWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc0VuYWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNFbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNFbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNFbmFibGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5JdGVtc0VuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmhhc090aGVyIHx8XG4gICAgICAhdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpIHx8XG4gICAgICAhdGhpcy5oYXNVbmtub3duVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUsIHRydWUpXG4gICAgKSB7XG4gICAgICBzdXBlci5zZXREZWZhdWx0VmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVXaXRoT3RoZXJzKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWVXaXRoT3RoZXJzKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICB0aGlzLmNvbW1lbnQgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgIXRoaXMuZGF0YSB8fFxuICAgICAgdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmdcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgcmV0dXJuIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB0aGlzLnNldENvbmRpdGlvbmFsQ2hvaWNlc1J1bm5lcigpO1xuICAgIHZhciBoYXNDaGFuZ2VzID0gdGhpcy5ydW5Db25kaXRpb25zRm9ySXRlbXModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgJiZcbiAgICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUubGVuZ3RoID09PSB0aGlzLmFjdGl2ZUNob2ljZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmICghIXRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlcztcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNFbmFibGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBhbnkge1xuICAgIHRoaXMuc2V0Q29uZGl0aW9uYWxFbmFibGVDaG9pY2VzUnVubmVyKCk7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuRW5hYmxlZENvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuYWN0aXZlQ2hvaWNlcyxcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuY2xlYXJEaXNhYmxlZFZhbHVlcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldENvbmRpdGlvbmFsQ2hvaWNlc1J1bm5lcigpIHtcbiAgICBpZiAodGhpcy5jaG9pY2VzVmlzaWJsZUlmKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKFxuICAgICAgICAgIHRoaXMuY2hvaWNlc1Zpc2libGVJZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmNob2ljZXNWaXNpYmxlSWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0Q29uZGl0aW9uYWxFbmFibGVDaG9pY2VzUnVubmVyKCkge1xuICAgIGlmICh0aGlzLmNob2ljZXNFbmFibGVJZikge1xuICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIoXG4gICAgICAgICAgdGhpcy5jaG9pY2VzRW5hYmxlSWZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmNob2ljZXNFbmFibGVJZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgPSBbXTtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuYWN0aXZlQ2hvaWNlcyxcbiAgICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzLFxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCA9PT0gdGhpcy5vdGhlckl0ZW0udmFsdWU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVUb0RhdGFDb3JlKHRoaXMudmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVSZXN0ZnVsbCgpOiBDaG9pY2VzUmVzdGZ1bGwge1xuICAgIHJldHVybiBuZXcgQ2hvaWNlc1Jlc3RmdWxsKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbW1lbnQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSByZXR1cm4gc3VwZXIuZ2V0Q29tbWVudCgpO1xuICAgIHJldHVybiB0aGlzLmNvbW1lbnRWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzU2V0dGluZ0NvbW1lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNldENvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHN1cGVyLnNldENvbW1lbnQobmV3VmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmlzU2V0dGluZ0NvbW1lbnQgJiYgbmV3VmFsdWUgIT0gdGhpcy5jb21tZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5pc1NldHRpbmdDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21tZW50VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXROZXdWYWx1ZUluRGF0YSh0aGlzLmNhY2hlZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuY2hvaWNlc0J5VXJsLmlzUnVubmluZyAmJlxuICAgICAgICAhdGhpcy5jaG9pY2VzQnlVcmwuaXNXYWl0aW5nRm9yUGFyYW1ldGVycykgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiBzdXBlci52YWx1ZUZyb21EYXRhKHZhbCk7XG4gICAgdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YUNvcmUodmFsKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiBzdXBlci52YWx1ZVRvRGF0YSh2YWwpO1xuICAgIHRoaXMuY2FjaGVkVmFsdWUgPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVUb0RhdGFDb3JlKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMuaGFzVW5rbm93blZhbHVlKHZhbCwgdHJ1ZSkpIHJldHVybiB2YWw7XG4gICAgdGhpcy5jb21tZW50ID0gdmFsO1xuICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlICYmIHRoaXMuZ2V0Q29tbWVudCgpKSB7XG4gICAgICB2YWwgPSB0aGlzLmdldENvbW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzVW5rbm93blZhbHVlKHZhbDogYW55LCBpbmNsdWRlT3RoZXI6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluY2x1ZGVPdGhlciAmJiB2YWwgPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuZmlsdGVyZWRDaG9pY2VzLCB2YWwpID09IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVEaXNhYmxlZCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBpdGVtVmFsdWUgPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5maWx0ZXJlZENob2ljZXMsIHZhbCk7XG4gICAgcmV0dXJuICEhaXRlbVZhbHVlICYmICFpdGVtVmFsdWUuaXNFbmFibGVkO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi5cbiAgICogQHNlZSBjaG9pY2VzQnlVcmxcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXMobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhpZGVJZkNob2ljZXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVJZkNob2ljZXNFbXB0eSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoaWRlSWZDaG9pY2VzRW1wdHlcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgZW50ZXJlZCB0ZXh0IGluIHRoZSBvdGhlcnMgaW5wdXQgaW4gdGhlIGNoZWNrYm94L3JhZGlvZ3JvdXAvZHJvcGRvd24gYXJlIHN0b3JlZCBhcyBcInF1ZXN0aW9uIG5hbWUgXCIgKyBcIi1Db21tZW50XCIuIFRoZSB2YWx1ZSBpdHNlbGYgaXMgXCJxdWVzdGlvbiBuYW1lXCI6IFwib3RoZXJzXCIuIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlLCB0byBzdG9yZSB0aGUgZW50ZXJlZCB0ZXh0IGRpcmVjdGx5IGluIHRoZSBcInF1ZXN0aW9uIG5hbWVcIiBrZXkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuc3RvcmVPdGhlcnNBc0NvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzT3RoZXJDaGFuZ2VkKCkge1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmVuZGVyIGl0ZW1zIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNPcmRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmNob2ljZXNPcmRlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3Igb3RoZXIgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG90aGVyVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJUZXh0XCIsIHZhbCk7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICB9XG4gIGdldCBsb2NPdGhlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IHNob3dzIHdoZW4gdGhlIG90aGVyIGl0ZW0gaXMgY2hvb3NlZCBieSB0aGUgb3RoZXIgaW5wdXQgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvdGhlckVycm9yVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVyUmVxdWlyZWRFcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlckVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGl0ZW1zIGFzIHRoZXkgd2lsbCBiZSByZW5kZXJlZC4gSWYgbmVlZGVkIGl0ZW1zIGFyZSBzb3J0ZWQgYW5kIHRoZSBvdGhlciBpdGVtIGlzIGFkZGVkLlxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqIEBzZWUgZW5hYmxlZENob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVDaG9pY2VzXCIsIFtdKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZW5hYmxlZCBpdGVtcyBhcyB0aGV5IHdpbGwgYmUgcmVuZGVyZWQuIFRoZSBkaXNhYmxlZCBpdGVtcyBhcmUgbm90IGluY2x1ZGVkXG4gICAqIEBzZWUgaGFzT3RoZXJcbiAgICogQHNlZSBjaG9pY2VzT3JkZXJcbiAgICogQHNlZSB2aXNpYmxlQ2hvaWNlc1xuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVkQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGl0ZW1zID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0uaXNFbmFibGVkKSByZXMucHVzaChpdGVtc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVZpc2libGVDaG9pY2VzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgICB2YXIgY2FsY1ZhbHVlID0gdGhpcy5jYWxjVmlzaWJsZUNob2ljZXMoKTtcbiAgICBpZiAoIWNhbGNWYWx1ZSkgY2FsY1ZhbHVlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxjVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2goY2FsY1ZhbHVlW2ldKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUNob2ljZXNcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY2FsY1Zpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIGlmICh0aGlzLmNhblVzZUZpbHRlcmVkQ2hvaWNlcygpKSByZXR1cm4gdGhpcy5maWx0ZXJlZENob2ljZXM7XG4gICAgdmFyIHJlcyA9IHRoaXMuc29ydFZpc2libGVDaG9pY2VzKHRoaXMuZmlsdGVyZWRDaG9pY2VzLnNsaWNlKCkpO1xuICAgIHRoaXMuYWRkVG9WaXNpYmxlQ2hvaWNlcyhyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblVzZUZpbHRlcmVkQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGFzT3RoZXIgJiYgdGhpcy5jaG9pY2VzT3JkZXIgPT0gXCJub25lXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFRvVmlzaWJsZUNob2ljZXMoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICBpZiAodGhpcy5oYXNPdGhlcikge1xuICAgICAgaXRlbXMucHVzaCh0aGlzLm90aGVySXRlbSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlbiByZXR1cm5zIGVtcHR5IHN0cmluZy4gSWYgJ290aGVyJyBpcyBzZWxlY3RlZCB0aGVuIHJldHVybnMgdGhlIHRleHQgZm9yIG90aGVyIHZhbHVlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbik6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzRGlzcGxheVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHRoaXMudmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDaG9pY2VzRGlzcGxheVZhbHVlKGl0ZW1zOiBJdGVtVmFsdWVbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWwgPT0gdGhpcy5vdGhlckl0ZW1WYWx1ZS52YWx1ZSlcbiAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQgPyB0aGlzLmNvbW1lbnQgOiB0aGlzLmxvY090aGVyVGV4dC50ZXh0T3JIdG1sO1xuICAgIHZhciBzdHIgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoaXRlbXMsIHZhbCk7XG4gICAgcmV0dXJuIHN0ciA9PSBcIlwiICYmIHZhbCA/IHZhbCA6IHN0cjtcbiAgfVxuICBwcml2YXRlIGdldCBmaWx0ZXJlZENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWVcbiAgICAgID8gdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZVxuICAgICAgOiB0aGlzLmFjdGl2ZUNob2ljZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgYWN0aXZlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzRnJvbVVybCA/IHRoaXMuY2hvaWNlc0Zyb21VcmwgOiB0aGlzLmNob2ljZXM7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKCF0aGlzLmhhc090aGVyIHx8ICF0aGlzLmlzT3RoZXJTZWxlY3RlZCB8fCB0aGlzLmNvbW1lbnQpIHJldHVybjtcbiAgICBlcnJvcnMucHVzaChuZXcgQ3VzdG9tRXJyb3IodGhpcy5vdGhlckVycm9yVGV4dCwgdGhpcykpO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5zdG9yZU90aGVyc0FzQ29tbWVudCAmJlxuICAgICAgICAodGhpcy5zdXJ2ZXkgIT0gbnVsbCA/IHRoaXMuc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IDogdHJ1ZSkpIHx8XG4gICAgICAoIXRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHkgJiYgIXRoaXMuY2hvaWNlc0Zyb21VcmwpXG4gICAgKTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgaWYgKG5hbWUgIT0gdGhpcy5nZXRWYWx1ZU5hbWUoKSkge1xuICAgICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBydW5DaG9pY2VzQnlVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmNob2ljZXNCeVVybCB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHByb2Nlc3NvciA9IHRoaXMuc3VydmV5SW1wbFxuICAgICAgPyB0aGlzLnN1cnZleUltcGwuZ2V0VGV4dFByb2Nlc3NvcigpXG4gICAgICA6IHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgICBpZiAoIXByb2Nlc3NvcikgcHJvY2Vzc29yID0gdGhpcy5zdXJ2ZXk7XG4gICAgaWYgKCFwcm9jZXNzb3IpIHJldHVybjtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5ydW4ocHJvY2Vzc29yKTtcbiAgfVxuICBwcml2YXRlIGlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgPSB0cnVlO1xuICBwcml2YXRlIG9uTG9hZENob2ljZXNGcm9tVXJsKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgdmFyIGVycm9ycyA9IFtdO1xuICAgIGlmICh0aGlzLmNob2ljZXNCeVVybCAmJiB0aGlzLmNob2ljZXNCeVVybC5lcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2godGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB2YXIgbmV3Q2hvaWNlcyA9IG51bGw7XG4gICAgdmFyIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZyA9IHRydWU7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsICYmXG4gICAgICAhdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzICYmXG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgICBjaGVja0NhY2hlZFZhbHVlc09uRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsID0gZmFsc2U7XG4gICAgdmFyIGNhY2hlZFZhbHVlcyA9IHRoaXMuY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyxcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZ1xuICAgICk7XG4gICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld0Nob2ljZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgICAgSXRlbVZhbHVlLnNldERhdGEobmV3Q2hvaWNlcywgYXJyYXkpO1xuICAgIH1cbiAgICB0aGlzLmNob2ljZXNGcm9tVXJsID0gbmV3Q2hvaWNlcztcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgaWYgKG5ld0Nob2ljZXMpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhjYWNoZWRWYWx1ZXMpO1xuICAgICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIGNoZWNrT25FeGlzdGluZzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YXIgcmVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLmNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHModmFsW2ldLCB0cnVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB2YXIgaXNFeGlzdHMgPSBjaGVja09uRXhpc3RpbmcgPyAhdGhpcy5oYXNVbmtub3duVmFsdWUodmFsKSA6IHRydWU7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbCwgaXNFeGlzdHM6IGlzRXhpc3RzIH07XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWxbaV0pO1xuICAgICAgICBpZiAodXBkYXRlZFZhbHVlICYmICF0aGlzLmlzVmFsdWVFbXB0eSh1cGRhdGVkVmFsdWUudmFsdWUpKSB7XG4gICAgICAgICAgcmVzLnB1c2godXBkYXRlZFZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlcyB9O1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPVxuICAgICAgdmFsLmlzRXhpc3RzICYmIHRoaXMuaGFzVW5rbm93blZhbHVlKHZhbC52YWx1ZSkgPyBudWxsIDogdmFsLnZhbHVlO1xuICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSB9O1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUNob2ljZXMoKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlCYXNlZE9uQ2hvaWNlcygpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eUJhc2VkT25DaG9pY2VzKCkge1xuICAgIGlmICh0aGlzLmhpZGVJZkNob2ljZXNFbXB0eSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMuZmlsdGVyZWRDaG9pY2VzIHx8IHRoaXMuZmlsdGVyZWRDaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5jaG9pY2VzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT0gXCJhc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAxKTtcbiAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gdGhpcy5yYW5kb21pemVBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICBpZiAoYS50ZXh0IDwgYi50ZXh0KSByZXR1cm4gLTEgKiBtdWx0O1xuICAgICAgaWYgKGEudGV4dCA+IGIudGV4dCkgcmV0dXJuIDEgKiBtdWx0O1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByYW5kb21pemVBcnJheShhcnJheTogQXJyYXk8SXRlbVZhbHVlPik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PEl0ZW1WYWx1ZT4oYXJyYXkpO1xuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuc3VydmV5ICYmXG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodGhpcy5nZXRWYWx1ZU5hbWUoKSkgPiAxXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXNDb3JlKCk7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckRpc2FibGVkVmFsdWVzKCkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMuc3VydmV5LmNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcykgcmV0dXJuO1xuICAgIHRoaXMuY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDb3JlKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICh0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwsIHRydWUpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyRGlzYWJsZWRWYWx1ZXNDb3JlKCkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVEaXNhYmxlZCh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHN1cGVyLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiAhdGhpcy5oYXNDb21tZW50KSB7XG4gICAgICB0aGlzLmNvbW1lbnQgPSBcIlwiO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94IGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy4gSXQgaW50cm9kdWNlZCBhIGNvbENvdW50IHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveEJhc2UgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBjb2xDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94IHF1ZXN0aW9ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA1KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsdWUpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInNlbGVjdGJhc2VcIixcbiAgW1xuICAgIFwiaGFzQ29tbWVudDpib29sZWFuXCIsXG4gICAgXCJoYXNPdGhlcjpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZVtdXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJhc2NcIiwgXCJkZXNjXCIsIFwicmFuZG9tXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNCeVVybDpyZXN0ZnVsbFwiLFxuICAgICAgY2xhc3NOYW1lOiBcIkNob2ljZXNSZXN0ZnVsbFwiLFxuICAgICAgb25HZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG9iai5jaG9pY2VzQnlVcmwuZ2V0RGF0YSgpO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG9iai5jaG9pY2VzQnlVcmwuc2V0RGF0YSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBcImhpZGVJZkNob2ljZXNFbXB0eTpib29sZWFuXCIsXG4gICAgXCJjaG9pY2VzVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwiY2hvaWNlc0VuYWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY090aGVyVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcIm90aGVyRXJyb3JUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlckVycm9yVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9XG4gIF0sXG4gIG51bGwsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjaGVja2JveGJhc2VcIixcbiAgW3sgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMSwgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdIH1dLFxuICBudWxsLFxuICBcInNlbGVjdGJhc2VcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwiaW1wb3J0IHtcbiAgSnNvbk9iamVjdCxcbiAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24sXG4gIEpzb25PYmplY3RQcm9wZXJ0eVxufSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbCB9IGZyb20gXCIuL21hcnRpeEJhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIEJhc2UsXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5LFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIFN1cnZleUVycm9yXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFRleHRQcmVQcm9jZXNzb3IsIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgb25Sb3dDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIG5ld1Jvd1ZhbHVlOiBhbnlcbiAgKTogdm9pZDtcbiAgZ2V0Um93SW5kZXgocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IG51bWJlcjtcbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3I7XG4gIGNvbHVtbnM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPjtcbiAgY3JlYXRlUXVlc3Rpb24oXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uO1xuICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeENvbHVtbk93bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRSZXF1aXJlZFRleHQoKTogc3RyaW5nO1xuICBvbkNvbHVtblByb3BlcnRpZXNDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiB2b2lkO1xuICBnZXRDZWxsVHlwZSgpOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihcbiAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2UsXG4gIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBkYXRhOiBhbnlcbikge1xuICBpZiAoY2VsbFF1ZXN0aW9uLmhhc090aGVyKSB7XG4gICAgY2VsbFF1ZXN0aW9uLnN0b3JlT3RoZXJzQXNDb21tZW50ID0gZmFsc2U7XG4gIH1cbiAgaWYgKFxuICAgICghY2VsbFF1ZXN0aW9uLmNob2ljZXMgfHwgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09IDApICYmXG4gICAgY2VsbFF1ZXN0aW9uLmNob2ljZXNCeVVybC5pc0VtcHR5XG4gICkge1xuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzID0gcXVlc3Rpb24uY2hvaWNlcztcbiAgfVxuICBpZiAoIWNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwuaXNFbXB0eSkge1xuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwucnVuKGRhdGEpO1xuICB9XG59XG5leHBvcnQgdmFyIG1hdHJpeERyb3Bkb3duQ29sdW1uVHlwZXMgPSB7XG4gIGRyb3Bkb3duOiB7XG4gICAgcHJvcGVydGllczogW1xuICAgICAgXCJjaG9pY2VzXCIsXG4gICAgICBcImNob2ljZXNPcmRlclwiLFxuICAgICAgXCJjaG9pY2VzQnlVcmxcIixcbiAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgIFwib3RoZXJUZXh0XCJcbiAgICBdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XG4gICAgICBpZiAoIWNlbGxRdWVzdGlvbi5vcHRpb25zQ2FwdGlvbilcbiAgICAgICAgY2VsbFF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uID0gcXVlc3Rpb24ub3B0aW9uc0NhcHRpb247XG4gICAgfVxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHByb3BlcnRpZXM6IFtcImNob2ljZXNcIiwgXCJjaG9pY2VzT3JkZXJcIiwgXCJjaG9pY2VzQnlVcmxcIiwgXCJvdGhlclRleHRcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7XG4gICAgICBvblVwZGF0ZVNlbGVjdEJhc2VDZWxsUXVlc3Rpb24oY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKTtcbiAgICAgIGNlbGxRdWVzdGlvbi5jb2xDb3VudCA9XG4gICAgICAgIGNvbHVtbi5jb2xDb3VudCA+IC0xID8gY29sdW1uLmNvbENvdW50IDogcXVlc3Rpb24uY29sdW1uQ29sQ291bnQ7XG4gICAgfVxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcHJvcGVydGllczogW1wiY2hvaWNlc1wiLCBcImNob2ljZXNPcmRlclwiLCBcImNob2ljZXNCeVVybFwiLCBcIm90aGVyVGV4dFwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgY2VsbFF1ZXN0aW9uLmNvbENvdW50ID1cbiAgICAgICAgY29sdW1uLmNvbENvdW50ID4gLTEgPyBjb2x1bW4uY29sQ291bnQgOiBxdWVzdGlvbi5jb2x1bW5Db2xDb3VudDtcbiAgICB9XG4gIH0sXG4gIHRleHQ6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJwbGFjZUhvbGRlclwiLCBcImlucHV0VHlwZVwiLCBcIm1heExlbmd0aFwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHt9XG4gIH0sXG4gIGNvbW1lbnQ6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJwbGFjZUhvbGRlclwiLCBcInJvd3NcIiwgXCJtYXhMZW5ndGhcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7fVxuICB9LFxuICBib29sZWFuOiB7XG4gICAgcHJvcGVydGllczogW1wiZGVmYXVsdFZhbHVlXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgY2VsbFF1ZXN0aW9uLnNob3dUaXRsZSA9IHRydWU7XG4gICAgfVxuICB9LFxuICBleHByZXNzaW9uOiB7XG4gICAgcHJvcGVydGllczogW1wiZXhwcmVzc2lvblwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHt9XG4gIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkNvbHVtbiBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJTG9jYWxpemFibGVPd25lciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKSB7XG4gICAgICByZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgdGVtcGxhdGVRdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgcHJpdmF0ZSBjb2xPd25lclZhbHVlOiBJTWF0cml4Q29sdW1uT3duZXIgPSBudWxsO1xuICBwcml2YXRlIGluZGV4VmFsdWUgPSAtMTtcbiAgcHJpdmF0ZSBfaXNWaXNpYmxlID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIGlmICh0aXRsZSkgdGhpcy50aXRsZSA9IHRpdGxlO1xuICB9XG4gIGdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjZWxsVHlwZVwiO1xuICB9XG4gIGdldER5bmFtaWNUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgfVxuICBnZXREeW5hbWljUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIHFEZWZpbml0aW9uID0gKDxhbnk+bWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcylbcVR5cGVdO1xuICAgIGlmIChxRGVmaW5pdGlvbikgcmV0dXJuIHFEZWZpbml0aW9uLnByb3BlcnRpZXM7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sT3duZXIoKTogSU1hdHJpeENvbHVtbk93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lclZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sT3duZXIodmFsdWU6IElNYXRyaXhDb2x1bW5Pd25lcikge1xuICAgIHRoaXMuY29sT3duZXJWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMubG9jVGl0bGUuc3RyQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmluZGV4VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgdmFsKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlUXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cbiAgcHVibGljIHNldElzVmlzaWJsZShuZXdWYWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc1Zpc2libGUgPSBuZXdWYWw7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnRpdGxlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEZ1bGxUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHB1YmxpYyBnZXRGdWxsVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3RyKSBzdHIgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgdmFyIHJlcXVpcmVUZXh0ID0gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0UmVxdWlyZWRUZXh0KCkgOiBcIlwiO1xuICAgICAgaWYgKHJlcXVpcmVUZXh0KSByZXF1aXJlVGV4dCArPSBcIiBcIjtcbiAgICAgIHN0ciA9IHJlcXVpcmVUZXh0ICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRFcnJvclRleHQgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmxvY1JlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZWFkT25seTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZWFkT25seSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc090aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaGFzT3RoZXI7XG4gIH1cbiAgcHVibGljIHNldCBoYXNPdGhlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaGFzT3RoZXIgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnZpc2libGVJZjtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlSWYgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZW5hYmxlSWY7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5lbmFibGVJZiA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5XaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBjb2xDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiA0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHVibGljIGNyZWF0ZUNlbGxRdWVzdGlvbihkYXRhOiBhbnkpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHFUeXBlID0gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICAgIHZhciBjZWxsUXVlc3Rpb24gPSA8UXVlc3Rpb24+dGhpcy5jcmVhdGVOZXdRdWVzdGlvbihxVHlwZSk7XG4gICAgdGhpcy51cGRhdGVDZWxsUXVlc3Rpb24oY2VsbFF1ZXN0aW9uLCBkYXRhKTtcbiAgICByZXR1cm4gY2VsbFF1ZXN0aW9uO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDZWxsUXVlc3Rpb24oY2VsbFF1ZXN0aW9uOiBRdWVzdGlvbiwgZGF0YTogYW55KSB7XG4gICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMoY2VsbFF1ZXN0aW9uKTtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIHFEZWZpbml0aW9uID0gKDxhbnk+bWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcylbcVR5cGVdO1xuICAgIGlmIChxRGVmaW5pdGlvbiAmJiBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKSB7XG4gICAgICBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKFxuICAgICAgICBjZWxsUXVlc3Rpb24sXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMuY29sT3duZXIsXG4gICAgICAgIGRhdGFcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGRlZmF1bHRDZWxsVHlwZUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbGNDZWxsUXVlc3Rpb25UeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY2VsbFR5cGUgIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy5jZWxsVHlwZTtcbiAgICBpZiAodGhpcy5jb2xPd25lcikgcmV0dXJuIHRoaXMuY29sT3duZXIuZ2V0Q2VsbFR5cGUoKTtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCkge1xuICAgIHZhciBwcmV2Q2VsbFR5cGUgPSB0aGlzLnRlbXBsYXRlUXVlc3Rpb25cbiAgICAgID8gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmdldFR5cGUoKVxuICAgICAgOiBcIlwiO1xuICAgIHZhciBjdXJDZWxsVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgICBpZiAoY3VyQ2VsbFR5cGUgPT09IHByZXZDZWxsVHlwZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydGllcyhwcmV2Q2VsbFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTmV3UXVlc3Rpb24oY3VyQ2VsbFR5cGUpO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NPd25lciA9IHRoaXM7XG4gICAgdGhpcy5hZGRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmxvY1RpdGxlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0RnVsbFRpdGxlKHRleHQpO1xuICAgIH07XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdRdWVzdGlvbihjZWxsVHlwZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5Kc29uT2JqZWN0Lm1ldGFEYXRhLmNyZWF0ZUNsYXNzKGNlbGxUeXBlKTtcbiAgICB0aGlzLnNldFF1ZXN0aW9uUHJvcGVydGllcyhxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVRdWVzdGlvbikge1xuICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzLnRlbXBsYXRlUXVlc3Rpb24sIHRydWUpO1xuICAgICAganNvbi50eXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBxdWVzdGlvbik7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMuZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5jb2xPd25lciAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmNvbE93bmVyLm9uQ29sdW1uUHJvcGVydGllc0NoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHFEZWYgPSAoPGFueT5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKVtjdXJDZWxsVHlwZV07XG4gICAgaWYgKCFxRGVmIHx8ICFxRGVmLnByb3BlcnRpZXMpIHJldHVybiBbXTtcbiAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YS5maW5kUHJvcGVydGllcyhjdXJDZWxsVHlwZSwgcURlZi5wcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZykge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGRlbGV0ZSAoPGFueT50aGlzKVtwcm9wLm5hbWVdO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIGRlbGV0ZSAoPGFueT50aGlzKVtwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3AubmFtZSwgZmFsc2UpO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eShcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBpc1JlYWRPbmx5OiBib29sZWFuXG4gICkge1xuICAgIHZhciBkZXNjID0ge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKVtwcm9wTmFtZV07XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICg8YW55PmRlc2MpW1wic2V0XCJdID0gZnVuY3Rpb24odjogYW55KSB7XG4gICAgICAgICg8YW55PnF1ZXN0aW9uKVtwcm9wTmFtZV0gPSB2O1xuICAgICAgfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BOYW1lLCBkZXNjKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgcHJpdmF0ZSBxdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcHVibGljIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKSB7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlID0gZGF0YS5jcmVhdGVRdWVzdGlvbih0aGlzLnJvdywgdGhpcy5jb2x1bW4pO1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZS52YWxpZGF0ZVZhbHVlQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkYXRhLnZhbGlkYXRlQ2VsbChyb3csIGNvbHVtbi5uYW1lLCByb3cudmFsdWUpO1xuICAgIH07XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uZ2V0UHJvcGVydGllcyhjb2x1bW4uZ2V0VHlwZSgpKS5mb3JFYWNoKFxuICAgICAgcHJvcGVydHkgPT4ge1xuICAgICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZTtcbiAgICAgICAgaWYgKCg8YW55PmNvbHVtbilbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5xdWVzdGlvblZhbHVlW3Byb3BlcnR5TmFtZV0gPSAoPGFueT5jb2x1bW4pW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZS51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMucXVlc3Rpb24ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gIGltcGxlbWVudHMgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsLCBJTG9jYWxpemFibGVPd25lciwgSVRleHRQcm9jZXNzb3Ige1xuICBwdWJsaWMgc3RhdGljIFJvd1ZhcmlhYmxlTmFtZSA9IFwicm93XCI7XG4gIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInJvd0luZGV4XCI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyOiBudW1iZXIgPSAxO1xuICBwcml2YXRlIHN0YXRpYyBnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNyb3dfXCIgKyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5pZENvdW50ZXIrKztcbiAgfVxuICBwcm90ZWN0ZWQgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YTtcbiAgcHJpdmF0ZSByb3dWYWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0ge307XG4gIHByaXZhdGUgaXNTZXR0aW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcblxuICBwdWJsaWMgY2VsbHM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ2VsbD4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICApIHtcbiAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnJvd1ZhbHVlcywgdGhpcy5kYXRhLmNvbHVtbnNbaV0ubmFtZSkgPT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnJvd1ZhbHVlcywgdGhpcy5kYXRhLmNvbHVtbnNbaV0ubmFtZSwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaWRWYWx1ZSA9IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmdldElkKCk7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIHZhbHVlTmFtZSBpbiB0aGlzLnJvd1ZhbHVlcykge1xuICAgICAgcmVzdWx0W3ZhbHVlTmFtZV0gPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy5yb3dWYWx1ZXMsIHZhbHVlTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgYWxsVmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICB2YXIgdmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0geyByb3c6IGFsbFZhbHVlcyB9O1xuICAgIGZvciAodmFyIGtleSBpbiBhbGxWYWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gYWxsVmFsdWVzW2tleV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgZm9yICh2YXIgdmFsdWVOYW1lIGluIHRoaXMucm93VmFsdWVzKSB7XG4gICAgICB0aGlzLmRlbGV0ZURhdGFWYWx1ZUNvcmUodGhpcy5yb3dWYWx1ZXMsIHZhbHVlTmFtZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMucm93VmFsdWVzLCBrZXksIHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUodGhpcy5jZWxsc1tpXS5jb2x1bW4ubmFtZSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgaWYgKCEhc3VydmV5KSB7XG4gICAgICByZXR1cm4gKDxhbnk+c3VydmV5KS5nZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2gsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZXNIYXNoW2tleV07XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgICg8YW55PnN1cnZleSkuc2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVzSGFzaFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkZWxldGVEYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgICg8YW55PnN1cnZleSkuZGVsZXRlRGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzSGFzaFtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy5yb3dWYWx1ZXMsIG5hbWUpO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1NldHRpbmdWYWx1ZSkgcmV0dXJuO1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gXCJcIikgbmV3VmFsdWUgPSBudWxsO1xuICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnNldERhdGFWYWx1ZUNvcmUodGhpcy5yb3dWYWx1ZXMsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVEYXRhVmFsdWVDb3JlKHRoaXMucm93VmFsdWVzLCBuYW1lKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhLm9uUm93Q2hhbmdlZCh0aGlzLCBuYW1lLCB0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uQW55VmFsdWVDaGFuZ2VkKE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZSk7XG4gIH1cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5nZXRWYWx1ZShuYW1lICsgQmFzZS5jb21tZW50UHJlZml4KTtcbiAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUgKyBCYXNlLmNvbW1lbnRQcmVmaXgsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWxba2V5XSAhPT0gdW5kZWZpbmVkICYmIHZhbFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT0gY29sdW1uKSByZXR1cm4gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNlbGxzW2ldLmNvbHVtbi5uYW1lID09IGNvbHVtbk5hbWUpXG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIG5ld1ZhbCA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUoa2V5KTtcbiAgICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgICB2YXIgcVZhbCA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICBxdWVzdGlvbi5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhxVmFsLCBxdWVzdGlvbi52YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgcXVlc3Rpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB2YWx1ZXNbTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuUm93VmFyaWFibGVOYW1lXSA9IHRoaXMudmFsdWU7XG4gICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLkluZGV4VmFyaWFibGVOYW1lXSA9IHRoaXMucm93SW5kZXg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRDZWxscygpIHtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMuZGF0YS5jb2x1bW5zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNbaV07XG4gICAgICBpZiAoY29sdW1uLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVDZWxsKGNvbHVtbikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ2VsbChjb2x1bW4sIHRoaXMsIHRoaXMuZGF0YSk7XG4gIH1cbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCByb3dJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRSb3dJbmRleCh0aGlzKSArIDEgOiAtMTtcbiAgfVxuICAvL0lUZXh0UHJvY2Vzc29yXG4gIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSB7XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUodGV4dFZhbHVlLm5hbWUpO1xuICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9XG4gICAgICBmaXJzdE5hbWUgPT0gTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuUm93VmFyaWFibGVOYW1lO1xuICAgIHRleHRWYWx1ZS5jYW5Qcm9jZXNzID0gdGV4dFZhbHVlLmlzRXhpc3RzO1xuICAgIGlmICghdGV4dFZhbHVlLmlzRXhpc3RzKSByZXR1cm47XG4gICAgdmFyIHZhbHVlcyA9IHsgcm93OiB0aGlzLnZhbHVlIH07XG4gICAgdGV4dFZhbHVlLnZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lLCB2YWx1ZXMpO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB0ZXh0ID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2V0U3VydmV5KCkpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IGFueSB7XG4gICAgdGV4dCA9IHRoaXMucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2V0U3VydmV5KCkpIHJldHVybiB0ZXh0O1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSk7XG4gICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9XG4gICAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuICYmIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBtYXRyaXggZHJvcGRvd24gYW5kIG1hdHJpeCBkeW5hbWljIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2VcbiAgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbDxcbiAgICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBNYXRyaXhEcm9wZG93bkNvbHVtblxuICA+XG4gIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHB1YmxpYyBzdGF0aWMgYWRkRGVmYXVsdENvbHVtbnMobWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgdmFyIGNvbE5hbWVzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xOYW1lcy5sZW5ndGg7IGkrKykgbWF0cml4LmFkZENvbHVtbihjb2xOYW1lc1tpXSk7XG4gIH1cbiAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByaXZhdGUgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBjb2x1bW5zQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICB1cGRhdGVDZWxsc0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb2x1bW5MYXlvdXRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbHVtblZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdBcnJheShcImNvbHVtbnNcIiwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaXRlbS5jb2xPd25lciA9IHRoaXM7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY2hvaWNlc1ZhbHVlID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY2hvaWNlc1wiKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbHVtbnNcIiwgZnVuY3Rpb24oXG4gICAgICBuZXdDb2x1bW5zOiBhbnlcbiAgICApIHtcbiAgICAgIHNlbGYudXBkYXRlQ29sdW1uc0luZGV4ZXMobmV3Q29sdW1ucyk7XG4gICAgICBzZWxmLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sdW1uc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiY29sdW1uTGF5b3V0XCIsIFwiYWRkUm93TG9jYXRpb25cIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2x1bW5MYXlvdXRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNlbGxUeXBlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25iYXNlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1Jvd3NEeW5hbWljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IGNvbHVtbkxheW91dCB0byAndmVydGljYWwnIHRvIHBsYWNlIGNvbHVtbnMgdmVydGljYWxseSBhbmQgcm93cyBob3Jpem9udGFsbHkuIEl0IG1ha2VzIHNlbnNlIHdoZW4gd2UgaGF2ZSBtYW55IGNvbHVtbnMgYW5kIGZldyByb3dzLlxuICAgKiBAc2VlIGNvbHVtbnNcbiAgICogQHNlZSByb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5MYXlvdXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uTGF5b3V0XCIsIFwiaG9yaXpvbnRhbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbkxheW91dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkxheW91dFwiLCB2YWwpO1xuICB9XG4gIGdldCBjb2x1bW5zTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQ7XG4gIH1cbiAgc2V0IGNvbHVtbnNMb2NhdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY29sdW1uTGF5b3V0ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY29sdW1ucyBhcmUgbG9jYXRlZCBob3Jpem9udGFsbHlcbiAgICogQHNlZSBjb2x1bW5MYXlvdXRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbkxheW91dCAhPSBcInZlcnRpY2FsXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93VmFsdWU6IHJvdy52YWx1ZSxcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uOiA8YW55Pm51bGwsXG4gICAgICBjb2x1bW5OYW1lOiA8YW55Pm51bGwsXG4gICAgICBjZWxsOiA8YW55Pm51bGwsXG4gICAgICBjZWxsUXVlc3Rpb246IDxhbnk+bnVsbCxcbiAgICAgIHZhbHVlOiA8YW55Pm51bGxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgb3B0aW9ucy5jb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICBvcHRpb25zLmNvbHVtbk5hbWUgPSBvcHRpb25zLmNvbHVtbi5uYW1lO1xuICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbaV07XG4gICAgICBvcHRpb25zLmNlbGwgPSBjZWxsO1xuICAgICAgb3B0aW9ucy5jZWxsUXVlc3Rpb24gPSBjZWxsLnF1ZXN0aW9uO1xuICAgICAgb3B0aW9ucy52YWx1ZSA9IGNlbGwudmFsdWU7XG4gICAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsQ3JlYXRlZCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjZWxsIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIFwiZHJvcGRvd25cIik7XG4gIH1cbiAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0aGlzLmNlbGxUeXBlID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zQ2VsbFR5cGUoKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uc0NlbGxUeXBlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNvbHVtbnNbaV0uZGVmYXVsdENlbGxUeXBlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnNJbmRleGVzKGNvbHM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xuICAgICAgY29sc1tpXS5zZXRJbmRleChpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNvbHVtbiBjb3VudCBmb3IgcmFkaW9ncm91cCBhbmQgY2hlY2tib3ggIGNlbGwgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uQ29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uQ29sQ291bnRcIiwgdmFsdWUpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudXBkYXRlQ2VsbHNDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgbWltaW11bSBjb2x1bW4gd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbk1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbk1pbldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uTWluV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgdGhlIGhvcml6b250YWwgc2Nyb2xsLlxuICAgKi9cbiAgcHVibGljIGdldCBob3Jpem9udGFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJob3Jpem9udGFsU2Nyb2xsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhvcml6b250YWxTY3JvbGwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCB2YWwpO1xuICB9XG5cbiAgcHVibGljIGdldFJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dCA6IFwiXCI7XG4gIH1cbiAgb25Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyb3cuY2VsbHNbal0uY29sdW1uICE9PSBjb2x1bW4pIGNvbnRpbnVlO1xuICAgICAgICBjb2x1bW4udXBkYXRlQ2VsbFF1ZXN0aW9uKHJvdy5jZWxsc1tqXS5xdWVzdGlvbiwgcm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldENlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgY29sdW1uTmFtZSA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChwYXRoW2ldID09IFwiLlwiKSBicmVhaztcbiAgICAgIGNvbHVtbk5hbWUgPSBwYXRoW2ldICsgY29sdW1uTmFtZTtcbiAgICB9XG4gICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKG51bGwpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5DZWxsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBydW5DZWxsc0NvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBuZXdWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgIH1cbiAgICBuZXdWYWx1ZXNbXCJyb3dcIl0gPSB7fTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm47XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb2x1bW5zW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29sdW1uIGJ5IGl0J3MgbmFtZS4gUmV0dW5zIG51bGwgaWYgYSBjb2x1bW4gd2l0aCB0aGlzIG5hbWUgZG9lc24ndCBleGlzdC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnNbaV0ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jb2x1bW5zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbldpZHRoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4ubWluV2lkdGggPyBjb2x1bW4ubWluV2lkdGggOiB0aGlzLmNvbHVtbk1pbldpZHRoO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjaG9pY2VzIGZvciBkcm9wZG93biwgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgY2VsbCB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzKHZhbDogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgb3B0aW9ucyBjYXB0aW9uIGZvciBkcm9wZG93biBjZWxsIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3B0aW9uc0NhcHRpb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY09wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGFkZENvbHVtbihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTWF0cml4RHJvcGRvd25Db2x1bW4ge1xuICAgIHZhciBjb2x1bW4gPSBuZXcgTWF0cml4RHJvcGRvd25Db2x1bW4obmFtZSwgdGl0bGUpO1xuICAgIHRoaXMuY29sdW1uc1ZhbHVlLnB1c2goY29sdW1uKTtcbiAgICByZXR1cm4gY29sdW1uO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4ge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gdGhpcy5nZW5lcmF0ZVJvd3MoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuZm9yRWFjaChyb3cgPT4gdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KSk7XG4gICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0geyBzdXJ2ZXk6IHRoaXMuc3VydmV5IH07XG4gICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24odGhpcy5kYXRhLmdldEFsbFZhbHVlcygpLCBwcm9wZXJ0aWVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlLCB0byBoaWRlIHRhYmxlIGhlYWRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0hlYWRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0hlYWRlclwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dIZWFkZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0hlYWRlclwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zSW5kZXhlcyh0aGlzLmNvbHVtbnMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgdmFsdWUuIElmIHRoZSByb3cgdmFsdWUgaXMgZW1wdHksIHRoZSBvYmplY3QgaXMgZW1wdHk6IHt9LlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93VmFsdWUocm93SW5kZXg6IG51bWJlcikge1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93VmFsdWVDb3JlKHZpc1Jvd3Nbcm93SW5kZXhdLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgcm93IHZhbHVlLlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqIEBwYXJhbSByb3dWYWx1ZSBhbiBvYmplY3Qge1wiY29sdW1uIG5hbWVcIjogY29sdW1uVmFsdWUsLi4uIH1cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyLCByb3dWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmlzUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd0luZGV4ID49IHZpc1Jvd3MubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLm9uUm93Q2hhbmdlZCh2aXNSb3dzW3Jvd0luZGV4XSwgXCJcIiwgcm93VmFsdWUpO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKGN1clZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiAhY3VyVmFsdWUgPyB7fSA6IGN1clZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSb3dWYWx1ZUNvcmUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBxdWVzdGlvblZhbHVlOiBhbnksXG4gICAgY3JlYXRlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gPyBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA6IG51bGw7XG4gICAgaWYgKCFyZXN1bHQgJiYgY3JlYXRlKSB7XG4gICAgICByZXN1bHQgPSB7fTtcbiAgICAgIHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdID0gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXRSb3dEaXNwbGF5VmFsdWUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICBpZiAocm93VmFsdWVbY29sdW1uLm5hbWVdKSB7XG4gICAgICAgIHJvd1ZhbHVlW2NvbHVtbi5uYW1lXSA9IHJvdy5jZWxsc1tpXS5xdWVzdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVWYWx1ZUNoYW5nZWQodmFsOiBhbnkpIHt9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgdGhpcy5vbkJlZm9yZVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZUNvcmUocm93LCB2YWwpO1xuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChcbiAgICAgICAgICBxdWVzdGlvbiAmJlxuICAgICAgICAgICghcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB8fCAhcXVlc3Rpb24udmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvc0luQ29sdW1ucyA9IHRoaXMuaGFzRXJyb3JJbkNvbHVtbnMoZmlyZUNhbGxiYWNrKTtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJbkNvbHVtbnM7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlcnJvcnMgPSByb3cuY2VsbHNbal0ucXVlc3Rpb24uZ2V0QWxsRXJyb3JzKCk7XG4gICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Db2x1bW5zKGZpcmVDYWxsYmFjazogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxscyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0uY2VsbHM7XG4gICAgICBpZiAoIWNlbGxzKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFjZWxsc1tjb2xJbmRleF0pIGNvbnRpbnVlO1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIHJlcyA9XG4gICAgICAgICAgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uLnZpc2libGUgJiYgcXVlc3Rpb24uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykpIHx8XG4gICAgICAgICAgcmVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdENlbGxRdWVzdGlvbihmYWxzZSk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uID8gcXVlc3Rpb24uaW5wdXRJZCA6IHN1cGVyLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdENlbGxRdWVzdGlvbih0cnVlKTtcbiAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0Q2VsbFF1ZXN0aW9uKG9uRXJyb3I6IGJvb2xlYW4pOiBRdWVzdGlvbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxscyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0uY2VsbHM7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGlmICghb25FcnJvcikgcmV0dXJuIGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbi5jdXJyZW50RXJyb3JDb3VudCA+IDApXG4gICAgICAgICAgcmV0dXJuIGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy9JTWF0cml4RHJvcGRvd25EYXRhXG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXN0aW9uQ29yZShyb3csIGNvbHVtbik7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVF1ZXN0aW9uQ29yZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbiA9IGNvbHVtbi5jcmVhdGVDZWxsUXVlc3Rpb24ocm93KTtcbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seSA9IHRydWU7XG4gICAgfVxuICAgIHF1ZXN0aW9uLnNldFN1cnZleUltcGwocm93KTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIGRlbGV0ZSBuZXdWYWx1ZVtyb3cucm93TmFtZV07XG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3QobmV3VmFsdWUpICYmIE9iamVjdC5rZXlzKG5ld1ZhbHVlKS5sZW5ndGggPT0gMFxuICAgICAgPyBudWxsXG4gICAgICA6IG5ld1ZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgIHRoaXMuaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkIHx8XG4gICAgICAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgdGhpcy5pc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNPYmplY3QodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2VsbFZhbHVlQ2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGdldFF1ZXN0aW9uID0gZnVuY3Rpb24oY29sTmFtZTogYW55KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgc2VsZi5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLmNvbHVtbnNbaV0ubmFtZSA9PT0gY29sTmFtZSkge1xuICAgICAgICAgIHJldHVybiByb3cuY2VsbHNbaV0ucXVlc3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICByb3dWYWx1ZTogcm93VmFsdWUsXG4gICAgICB2YWx1ZTogcm93VmFsdWVbY29sdW1uTmFtZV0sXG4gICAgICBnZXRDZWxsUXVlc3Rpb246IGdldFF1ZXN0aW9uXG4gICAgfTtcbiAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIHZhbGlkYXRlQ2VsbChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IFN1cnZleUVycm9yIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93OiByb3csXG4gICAgICBjb2x1bW5OYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgcm93VmFsdWU6IHJvd1ZhbHVlLFxuICAgICAgdmFsdWU6IHJvd1ZhbHVlW2NvbHVtbk5hbWVdXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbFZhbGlkYXRlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55XG4gICkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgaWYgKHRoaXMuaXNNYXRyaXhWYWx1ZUVtcHR5KG9sZFZhbHVlKSkgb2xkVmFsdWUgPSBudWxsO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZUNvcmUocm93LCBuZXdWYWx1ZSwgdHJ1ZSk7XG4gICAgaWYgKCFyb3dWYWx1ZSkgcm93VmFsdWUgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIGRlbGV0ZSByb3dWYWx1ZVtrZXldO1xuICAgIGlmIChuZXdSb3dWYWx1ZSkge1xuICAgICAgbmV3Um93VmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5ld1Jvd1ZhbHVlKSk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gbmV3Um93VmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eShuZXdSb3dWYWx1ZVtrZXldKSkge1xuICAgICAgICAgIHJvd1ZhbHVlW2tleV0gPSBuZXdSb3dWYWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzT2JqZWN0KHJvd1ZhbHVlKSAmJiBPYmplY3Qua2V5cyhyb3dWYWx1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuZGVsZXRlUm93VmFsdWUobmV3VmFsdWUsIHJvdyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHRoaXMub25DZWxsVmFsdWVDaGFuZ2VkKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIH1cbiAgfVxuICBnZXRSb3dJbmRleChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5pbmRleE9mKHJvdyk7XG4gIH1cbiAgcHJpdmF0ZSBpc01hdHJpeFZhbHVlRW1wdHkodmFsOiBhbnkpIHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0KHZhbFtpXSkgJiYgT2JqZWN0LmtleXModmFsW2ldKS5sZW5ndGggPiAwKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsKS5sZW5ndGggPT0gMDtcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5O1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIixcbiAgW1xuICAgIFwiIW5hbWVcIixcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgdmFyIHJlcyA9IE1hdHJpeERyb3Bkb3duQ29sdW1uLmdldENvbHVtblR5cGVzKCk7XG4gICAgICAgIHJlcy5zcGxpY2UoMCwgMCwgXCJkZWZhdWx0XCIpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNvbENvdW50XCIsIGRlZmF1bHQ6IC0xLCBjaG9pY2VzOiBbLTEsIDAsIDEsIDIsIDMsIDRdIH0sXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiXG4gICAgfSxcbiAgICBcImhhc090aGVyOmJvb2xlYW5cIixcbiAgICBcInJlYWRPbmx5OmJvb2xlYW5cIixcbiAgICBcIm1pbldpZHRoXCIsXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJcbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Db2x1bW4oXCJcIik7XG4gIH1cbik7XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbnM6bWF0cml4ZHJvcGRvd25jb2x1bW5zXCIsXG4gICAgICBjbGFzc05hbWU6IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIlxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5MYXlvdXRcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJjb2x1bW5zTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgY2hvaWNlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCJdXG4gICAgfSxcbiAgICBcImhvcml6b250YWxTY3JvbGw6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVbXVwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcImRyb3Bkb3duXCIsXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBNYXRyaXhEcm9wZG93bkNvbHVtbi5nZXRDb2x1bW5UeXBlcygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNvbHVtbkNvbENvdW50XCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0XSB9LFxuICAgIFwiY29sdW1uTWluV2lkdGhcIixcbiAgICB7IG5hbWU6IFwic2hvd0hlYWRlcjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4YmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZS50cyIsImV4cG9ydCBjbGFzcyBUZXh0UHJlUHJvY2Vzc29ySXRlbSB7XG4gIHB1YmxpYyBzdGFydDogbnVtYmVyO1xuICBwdWJsaWMgZW5kOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0UHJlUHJvY2Vzc29yVmFsdWUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0V4aXN0cyA9IGZhbHNlO1xuICAgIHRoaXMuY2FuUHJvY2VzcyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHZhbHVlOiBhbnk7XG4gIHB1YmxpYyBpc0V4aXN0czogYm9vbGVhbjtcbiAgcHVibGljIGNhblByb2Nlc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0UHJlUHJvY2Vzc29yIHtcbiAgcHJpdmF0ZSBoYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgb25Qcm9jZXNzOiAodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIHByb2Nlc3MoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSB0cnVlO1xuICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgaWYgKCF0aGlzLm9uUHJvY2VzcykgcmV0dXJuIHRleHQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyh0ZXh0KTtcbiAgICBmb3IgKHZhciBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZSh0ZXh0LnN1YnN0cmluZyhpdGVtLnN0YXJ0ICsgMSwgaXRlbS5lbmQpKTtcbiAgICAgIGlmICghbmFtZSkgY29udGludWU7XG4gICAgICB2YXIgdGV4dFZhbHVlID0gbmV3IFRleHRQcmVQcm9jZXNzb3JWYWx1ZShuYW1lLCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgICAgdGhpcy5vblByb2Nlc3ModGV4dFZhbHVlKTtcbiAgICAgIGlmICghdGV4dFZhbHVlLmlzRXhpc3RzKSB7XG4gICAgICAgIGlmICh0ZXh0VmFsdWUuY2FuUHJvY2Vzcykge1xuICAgICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGV4dFZhbHVlLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXBsYWNlZFZhbHVlID0gISF0ZXh0VmFsdWUudmFsdWUgPyB0ZXh0VmFsdWUudmFsdWUgOiBcIlwiO1xuICAgICAgaWYgKGRvRW5jb2RpbmcpIHtcbiAgICAgICAgcmVwbGFjZWRWYWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudChyZXBsYWNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRleHQgPVxuICAgICAgICB0ZXh0LnN1YnN0cigwLCBpdGVtLnN0YXJ0KSArIHJlcGxhY2VkVmFsdWUgKyB0ZXh0LnN1YnN0cihpdGVtLmVuZCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0FsbFZhbHVlc09uTGFzdFJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldEl0ZW1zKHRleHQ6IHN0cmluZyk6IEFycmF5PFRleHRQcmVQcm9jZXNzb3JJdGVtPiB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuICAgIHZhciBzdGFydCA9IC0xO1xuICAgIHZhciBjaCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY2ggPSB0ZXh0W2ldO1xuICAgICAgaWYgKGNoID09IFwie1wiKSBzdGFydCA9IGk7XG4gICAgICBpZiAoY2ggPT0gXCJ9XCIpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBUZXh0UHJlUHJvY2Vzc29ySXRlbSgpO1xuICAgICAgICAgIGl0ZW0uc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICBpdGVtLmVuZCA9IGk7XG4gICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydCA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgcmV0dXJuIG5hbWUudHJpbSgpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdGV4dFByZVByb2Nlc3Nvci50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbXBsZW1lbnRvckJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBkb0l0ZXJhdGVQcm9wZXJ0aWVzKGhhc2g6IGFueSwga2V5OiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWwgPSBoYXNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZUFycmF5KHZhbCk7XG4gICAgICAoPGFueT52YWwpW1wib25BcnJheUNoYW5nZWRcIl0gPSAoKSA9PiBoYXNoW2tleV0ubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSh2YWwpO1xuICAgIH1cbiAgfVxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogQmFzZSkge1xuICAgIGVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIEltcGxlbWVudG9yQmFzZS5kb0l0ZXJhdGVQcm9wZXJ0aWVzKGhhc2gsIGtleSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSAoaGFzaCwga2V5KSA9PiB7XG4gICAgICBpZiAoaGFzaFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtvLnVud3JhcChoYXNoW2tleV0pO1xuICAgIH07XG4gICAgZWxlbWVudC5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSAoaGFzaCwga2V5LCB2YWwpID0+XG4gICAgICBoYXNoW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGhhc2hba2V5XSh2YWwpXG4gICAgICAgIDogKGhhc2hba2V5XSA9IGtvLm9ic2VydmFibGUodmFsKSk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb2Jhc2UudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHsgSVBhZ2UsIElRdWVzdGlvbiwgRXZlbnQsIFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gXCIuL2tvcGFnZVwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4uL3BhZ2VcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQgeyBrb1RlbXBsYXRlLCBTdXJ2ZXlUZW1wbGF0ZVRleHQgfSBmcm9tIFwiLi90ZW1wbGF0ZVRleHRcIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0LFxuICBDdXN0b21XaWRnZXRDb2xsZWN0aW9uXG59IGZyb20gXCIuLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcblxuQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5vbkN1c3RvbVdpZGdldEFkZGVkLmFkZChjdXN0b21XaWRnZXQgPT4ge1xuICBpZiAoY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyKSByZXR1cm47XG4gIGlmICghY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSlcbiAgICBjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlID1cbiAgICAgIFwiPGRpdj4naHRtbFRlbXBsYXRlJyBhdHRyaWJ1dGUgaXMgbWlzc2VkLjwvZGl2PlwiO1xuICBuZXcgU3VydmV5VGVtcGxhdGVUZXh0KCkucmVwbGFjZVRleHQoXG4gICAgY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSxcbiAgICBcIndpZGdldFwiLFxuICAgIGN1c3RvbVdpZGdldC5uYW1lXG4gICk7XG59KTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleSBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgY3NzVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuY3VycmVudFR5cGU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgY3NzVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VydmV5Q3NzLmN1cnJlbnRUeXBlID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJlZEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAvL1RPRE8gcmVtb3ZlIGl0LCBzaW5jZSB0aGVyZSBpcyBvbkFmdGVyUmVuZGVyU3VydmV5XG4gIHB1YmxpYyBvblJlbmRlcmVkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVuZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBtb3VzZURvd25QYWdlOiBhbnkgPSBudWxsO1xuXG4gIGtvQ3VycmVudFBhZ2U6IGFueTtcbiAga29Jc0ZpcnN0UGFnZTogYW55O1xuICBrb0lzTGFzdFBhZ2U6IGFueTtcbiAga29Jc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyA9IGtvLm9ic2VydmFibGU8Ym9vbGVhbj4odHJ1ZSk7XG4gIGR1bW15T2JzZXJ2YWJsZTogYW55O1xuICBrb1N0YXRlOiBhbnk7XG4gIGtvUHJvZ3Jlc3M6IGFueTtcbiAga29Qcm9ncmVzc1RleHQ6IGFueTtcbiAga29BZnRlclJlbmRlclBhZ2U6IGFueTtcbiAga29Db21wbGV0ZWRTdGF0ZTogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlVGV4dDogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlQ3NzOiBhbnk7XG4gIGtvVGltZXJJbmZvVGV4dDogYW55O1xuXG4gIHB1YmxpYyBnZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWVzSGFzaFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlc0hhc2hba2V5XSA9IGtvLm9ic2VydmFibGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtvLnVud3JhcCh2YWx1ZXNIYXNoW2tleV0pO1xuICB9XG4gIHB1YmxpYyBzZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHZhbHVlc0hhc2hba2V5XSkpIHtcbiAgICAgIHZhbHVlc0hhc2hba2V5XSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlc0hhc2hba2V5XSA9IGtvLm9ic2VydmFibGUodmFsdWUpO1xuICAgICAgLy8gaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyAgIHZhbHVlc0hhc2hba2V5XSA9IGtvLm9ic2VydmFibGVBcnJheSh2YWx1ZSk7XG4gICAgICAvLyAgICg8YW55PnZhbHVlKVtcIm9uQXJyYXlDaGFuZ2VkXCJdID0gKCkgPT5cbiAgICAgIC8vICAgICB2YWx1ZXNIYXNoW2tleV0ubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIHZhbHVlc0hhc2hba2V5XSA9IGtvLm9ic2VydmFibGUodmFsdWUpO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZGVsZXRlRGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSh2YWx1ZXNIYXNoW2tleV0pKSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0odW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlc0hhc2hba2V5XTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBqc29uT2JqOiBhbnkgPSBudWxsLFxuICAgIHJlbmRlcmVkRWxlbWVudDogYW55ID0gbnVsbCxcbiAgICBjc3M6IGFueSA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoanNvbk9iaik7XG4gICAgbmV3IEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbiAgICBpZiAodHlwZW9mIGtvID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia25vY2tvdXRqcyBsaWJyYXJ5IGlzIG5vdCBsb2FkZWQuXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyB0aGlzLml0ZXJhdGVEYXRhVmFsdWVzSGFzaCgoaGFzaDogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgIC8vICAgdmFyIHZhbCA9IGhhc2hba2V5XTtcbiAgICAvLyAgIGlmICgha28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHZhbCkpIHtcbiAgICAvLyAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSh2YWwpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICAgIGlmIChjc3MpIHtcbiAgICAgIHRoaXMuY3NzID0gY3NzO1xuICAgIH1cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudDtcbiAgICB9XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInRpbWVTcGVudFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25UaW1lU3BlbnRDaGFuZ2VkKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbmRlcihyZW5kZXJlZEVsZW1lbnQpO1xuICB9XG4gIHB1YmxpYyBuZXh0UGFnZVVJQ2xpY2soKSB7XG4gICAgaWYgKCEhdGhpcy5tb3VzZURvd25QYWdlICYmIHRoaXMubW91c2VEb3duUGFnZSAhPT0gdGhpcy5jdXJyZW50UGFnZSkgcmV0dXJuO1xuICAgIHRoaXMubW91c2VEb3duUGFnZSA9IG51bGw7XG4gICAgdGhpcy5uZXh0UGFnZSgpO1xuICB9XG4gIHB1YmxpYyBuZXh0UGFnZU1vdXNlRG93bigpIHtcbiAgICB0aGlzLm1vdXNlRG93blBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIHZhciBlbCA9IDxhbnk+ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAoISFlbCAmJiAhIWVsLmJsdXIpIGVsLmJsdXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25Db21wbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24uY29tcGxldGVcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblByZXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLnByZXZcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5zdGFydFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uTmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24ubmV4dFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjb21wbGV0ZWRDc3MoKSB7XG4gICAgdmFyIGNzcyA9IHN1cnZleUNzcy5nZXRDc3MoKTtcbiAgICByZXR1cm4gY3NzLmJvZHkgKyBcIiBcIiArIGNzcy5jb21wbGV0ZWRQYWdlO1xuICB9XG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkNzcyhtYWluOiBzdHJpbmcsIGJ0bjogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKG1haW4pIHJlcyA9IG1haW47XG4gICAgaWYgKGJ0bikgcmVzICs9IFwiIFwiICsgYnRuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3NzKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm1lcmdlVmFsdWVzKHZhbHVlLCB0aGlzLmNzcyk7XG4gIH1cbiAgcHVibGljIHJlbmRlcihlbGVtZW50OiBhbnkgPSBudWxsKSB7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gICAgdGhpcy51cGRhdGVDdXN0b21XaWRnZXRzKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSB0aGlzLnJlbmRlcmVkRWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBlbGVtZW50LmlubmVySFRNTCA9IHRoaXMuZ2V0SHRtbFRlbXBsYXRlKCk7XG4gICAgc2VsZi5zdGFydFRpbWVyRnJvbVVJKCk7XG4gICAgc2VsZi5hcHBseUJpbmRpbmcoKTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoY2xlYXJEYXRhOiBib29sZWFuID0gdHJ1ZSwgZ290b0ZpcnN0UGFnZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5jbGVhcihjbGVhckRhdGEsIGdvdG9GaXJzdFBhZ2UpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHB1YmxpYyBrb0V2ZW50QWZ0ZXJSZW5kZXIoZWxlbWVudDogYW55LCBzdXJ2ZXk6IGFueSkge1xuICAgIHN1cnZleS5vblJlbmRlcmVkLmZpcmUoc2VsZiwge30pO1xuICAgIHN1cnZleS5hZnRlclJlbmRlclN1cnZleShlbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIHJlbmRlcmVkRWxlbWVudDogYW55ID0gbnVsbFxuICApIHtcbiAgICBpZiAocmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudDtcbiAgICB9XG4gICAgc3VwZXIubG9hZFN1cnZleUZyb21TZXJ2aWNlKHN1cnZleUlkLCBjbGllbnRJZCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZCgpIHtcbiAgICBzdXBlci5zZXRDb21wbGV0ZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmIChuYW1lID09PSBcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiKSB7XG4gICAgICB0aGlzLmtvSXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcodGhpcy5pc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGFydCgpIHtcbiAgICBzdXBlci5zdGFydCgpO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYWdlKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUGFnZShuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SHRtbFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtvVGVtcGxhdGU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmVmb3JlQ3JlYXRpbmcoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICB0aGlzLmtvQ3VycmVudFBhZ2UgPSBrby5vYnNlcnZhYmxlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHRoaXMua29Jc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyA9IGtvLm9ic2VydmFibGUoXG4gICAgICB0aGlzLmlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nXG4gICAgKTtcbiAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSgpO1xuICAgICAgdGhpcy5rb0lzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nKHRoaXMuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcpO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0ZpcnN0UGFnZSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UGFnZTtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNMYXN0UGFnZSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5pc0xhc3RQYWdlO1xuICAgIH0pO1xuICAgIHRoaXMua29Qcm9ncmVzc1RleHQgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3NUZXh0O1xuICAgIH0pO1xuICAgIHRoaXMua29Qcm9ncmVzcyA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9ncmVzcygpO1xuICAgIH0pO1xuICAgIHRoaXMua29TdGF0ZSA9IGtvLm9ic2VydmFibGUodGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGVUZXh0ID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGVDc3MgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29UaW1lckluZm9UZXh0ID0ga28ub2JzZXJ2YWJsZSh0aGlzLnRpbWVySW5mb1RleHQpO1xuICAgIHRoaXMua29BZnRlclJlbmRlclBhZ2UgPSBmdW5jdGlvbihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICAgIGlmIChlbCkgc2VsZi5hZnRlclJlbmRlclBhZ2UoZWwpO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gICAgc3VwZXIuY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLmlzRGVzaWduTW9kZSkgdGhpcy5zY3JvbGxUb1RvcE9uUGFnZUNoYW5nZSgpO1xuICB9XG4gIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBzdXBlci5wYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZSwgdGV4dCk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlKHRoaXMuY29tcGxldGVkU3RhdGUpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZVRleHQodGhpcy5jb21wbGV0ZWRTdGF0ZVRleHQpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZUNzcyhcbiAgICAgIHRoaXMuY29tcGxldGVkU3RhdGUgIT09IFwiXCIgPyB0aGlzLmNzcy5zYXZlRGF0YVt0aGlzLmNvbXBsZXRlZFN0YXRlXSA6IFwiXCJcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvblRpbWVTcGVudENoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1RpbWVySW5mb1RleHQodGhpcy50aW1lckluZm9UZXh0KTtcbiAgfVxuICBwcml2YXRlIGFwcGx5QmluZGluZygpIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZWRFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gICAga28uY2xlYW5Ob2RlKHRoaXMucmVuZGVyZWRFbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuaXNGaXJzdFJlbmRlcikge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50UGFnZVF1ZXN0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLmlzRmlyc3RSZW5kZXIgPSBmYWxzZTtcbiAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMsIHRoaXMucmVuZGVyZWRFbGVtZW50KTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUtvQ3VycmVudFBhZ2UoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSh0aGlzLmR1bW15T2JzZXJ2YWJsZSgpICsgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IHRoaXMua29DdXJyZW50UGFnZSgpKSB7XG4gICAgICB0aGlzLmtvQ3VycmVudFBhZ2UodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgfVxuICAgIHRoaXMua29TdGF0ZSh0aGlzLnN0YXRlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRQYWdlUXVlc3Rpb25zKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmN1cnJlbnRQYWdlID8gdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnMgOiBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAocS52aXNpYmxlKSBxW1widXBkYXRlUXVlc3Rpb25cIl0oKTtcbiAgICB9XG4gIH1cbn1cblxuTG9jYWxpemFibGVTdHJpbmcucHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMua29SZVJlbmRlciA9IGtvLm9ic2VydmFibGUoMCk7XG4gIHRoaXMua29SZW5kZXJlZEh0bWwgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5rb1JlUmVuZGVyKCk7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZWRIdG1sO1xuICB9KTtcbn07XG5cbkl0ZW1WYWx1ZS5wcm90b3R5cGVbXCJvbkNyZWF0aW5nXCJdID0gZnVuY3Rpb24oKSB7XG4gIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG59O1xuXG5Mb2NhbGl6YWJsZVN0cmluZy5wcm90b3R5cGVbXCJvbkNoYW5nZWRcIl0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5rb1JlUmVuZGVyKHRoaXMua29SZVJlbmRlcigpICsgMSk7XG59O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiBmdW5jdGlvbihwYXJhbXMsIGNvbXBvbmVudEluZm8pIHtcbiAgICAgIHZhciBzdXJ2ZXk6IFN1cnZleSA9IGtvLnVud3JhcChwYXJhbXMuc3VydmV5KTtcbiAgICAgIHN1cnZleS5yZW5kZXIoKTtcbiAgICAgIHJldHVybiBwYXJhbXMuc3VydmV5O1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IGtvVGVtcGxhdGVcbn0pO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbXCJzdXJ2ZXlQcm9wXCJdID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IpIHtcbiAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfHwge307XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YXIgcHJvcFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZVtwcm9wTmFtZV0pO1xuICAgICAgICBlbGVtZW50W3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5TdXJ2ZXlNb2RlbC5wbGF0Zm9ybSA9IFwia25vY2tvdXRcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3N1cnZleS50cyIsImltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBCYXNlLFxuICBJU3VydmV5SW1wbCxcbiAgSVBhZ2UsXG4gIElQYW5lbCxcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSVN1cnZleSxcbiAgSVN1cnZleURhdGEsXG4gIElFbGVtZW50LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlFcnJvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQgeyBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wSW5mbyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzb3VyY2U6IElFbGVtZW50LFxuICAgIHB1YmxpYyB0YXJnZXQ6IElFbGVtZW50LFxuICAgIHB1YmxpYyBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMVxuICApIHt9XG4gIHB1YmxpYyBkZXN0aW5hdGlvbjogSVN1cnZleUVsZW1lbnQ7XG4gIHB1YmxpYyBpc0JvdHRvbTogYm9vbGVhbjtcbiAgcHVibGljIGlzRWRnZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUm93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52aXNpYmxlID0gcGFuZWwuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlbGVtZW50c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImVsZW1lbnRzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVWaXNpYmxlKCkge1xuICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY2FsY1Zpc2libGUoKTtcbiAgICB0aGlzLnNldFdpZHRoKCk7XG4gIH1cbiAgcHVibGljIGFkZEVsZW1lbnQocTogSUVsZW1lbnQpIHtcbiAgICB0aGlzLmVsZW1lbnRzLnB1c2gocSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhbmVsLnJvd3MuaW5kZXhPZih0aGlzKTtcbiAgfVxuICBwcml2YXRlIHNldFdpZHRoKCkge1xuICAgIHZhciB2aXNDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZUNvdW50KCk7XG4gICAgaWYgKHZpc0NvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgdmFyIHEgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBxLnJlbmRlcldpZHRoID0gcS53aWR0aCA/IHEud2lkdGggOiAoMTAwIC8gdmlzQ291bnQpLnRvRml4ZWQoNikgKyBcIiVcIjtcbiAgICAgICAgcS5yaWdodEluZGVudCA9IGNvdW50ZXIgPCB2aXNDb3VudCAtIDEgPyAxIDogMDtcbiAgICAgICAgY291bnRlcisrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbGVtZW50c1tpXS5yZW5kZXJXaWR0aCA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0VmlzaWJsZUNvdW50KCk6IG51bWJlciB7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJlcysrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY2FsY1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZUNvdW50KCkgPiAwO1xuICB9XG59XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhIFBhbmVsIGFuZCBQYWdlIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsQmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIsIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFuZWxDb3VudGVyID0gMTAwO1xuICBwcml2YXRlIHN0YXRpYyBnZXRQYW5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3BfXCIgKyBQYW5lbE1vZGVsQmFzZS5wYW5lbENvdW50ZXIrKztcbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudHNWYWx1ZTogQXJyYXk8SUVsZW1lbnQ+O1xuICBwcml2YXRlIGlzUXVlc3Rpb25zUmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBxdWVzdGlvbnNWYWx1ZTogQXJyYXk8UXVlc3Rpb24+ID0gbmV3IEFycmF5PFF1ZXN0aW9uPigpO1xuICBhZGRFbGVtZW50Q2FsbGJhY2s6IChlbGVtZW50OiBJRWxlbWVudCkgPT4gdm9pZDtcbiAgcmVtb3ZlRWxlbWVudENhbGxiYWNrOiAoZWxlbWVudDogSUVsZW1lbnQpID0+IHZvaWQ7XG4gIG9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uOiAoKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicm93c1wiKTtcbiAgICB0aGlzLmVsZW1lbnRzVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFxuICAgICAgXCJlbGVtZW50c1wiLFxuICAgICAgdGhpcy5vbkFkZEVsZW1lbnQuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMub25SZW1vdmVFbGVtZW50LmJpbmQodGhpcylcbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLFxuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkLmJpbmQodGhpcylcbiAgICApO1xuICAgIHRoaXMuaWQgPSBQYW5lbE1vZGVsQmFzZS5nZXRQYW5lbElkKCk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBQYW5lbE1vZGVsIG9yIFBhZ2VNb2RlbCB0aXRsZSBwcm9wZXJ0eS5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIFBhbmVsTW9kZWwgb3IgUGFnZU1vZGVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LiBJdCByZW5kZXJzIHVuZGVyIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIG9uIHJlcXVpcmVkIGVycm9yLiBVc2UgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNob3cgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NSZXF1aXJlZEVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXG4gICAgICA6IFwiXCI7XG4gIH1cbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0KSA6IG51bGw7XG4gIH1cbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3JcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHRleHQsIHRydWUpXG4gICAgICA6IHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIEEgcGFyZW50IGVsZW1lbnQuIEl0IGlzIGFsd2F5cyBudWxsIGZvciB0aGUgUGFnZSBvYmplY3QgYW5kIGFsd2F5cyBub3QgbnVsbCBmb3IgdGhlIFBhbmVsIG9iamVjdC4gUGFuZWwgb2JqZWN0IG1heSBjb250YWluIFF1ZXN0aW9ucyBhbmQgb3RoZXIgUGFuZWxzLlxuICAgKi9cbiAgcHVibGljIGdldCBwYXJlbnQoKTogUGFuZWxNb2RlbEJhc2Uge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgbnVsbCk7XG4gIH1cbiAgcHVibGljIHNldCBwYXJlbnQodmFsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgZGVwdGgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmRlcHRoICsgMTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBQYW5lbCBiZWNvbWVzIHZpc2libGUgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UgdGhlIFBhbmVsIGJlY29tZXMgaW52aXNpYmxlLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gdmlzaWJsZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHZpc2libGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3NlcygpOiBhbnkge1xuICAgIHZhciBjbGFzc2VzID0geyBlcnJvcjoge30gfTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMsIHRoaXMuY3NzKTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMuZXJyb3IsIHRoaXMuY3NzLmVycm9yKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZVBhbmVsQ3NzQ2xhc3Nlcyh0aGlzLCBjbGFzc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3NzKCk6IGFueSB7XG4gICAgcmV0dXJuIHN1cnZleUNzcy5nZXRDc3MoKTtcbiAgfVxuICAvKipcbiAgICogQSB1bmlxdWUgZWxlbWVudCBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvYmplY3QgaXMgUGFuZWwuIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgKGEgcm9vdCBQYW5lbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgbG9jYXRlZCBpbiB0aGUgUGFuZWwvUGFnZSwgaW5jbHVkaW5nIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmlzUXVlc3Rpb25zUmVhZHkpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAgIHZhciBxcyA9ICg8UGFuZWxNb2RlbD5lbCkucXVlc3Rpb25zO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaCg8UXVlc3Rpb24+ZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzUXVlc3Rpb25zUmVhZHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1ZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWVzdGlvbiBieSBpdHMgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSB0aGUgcXVlc3Rpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gcXVlc3Rpb25zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dW5zIHRoZSBlbGVtZW50IGJ5IGl0cyBuYW1lLiBJdCB3b3JrcyByZWN1cnNpdmVseS5cbiAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRCeU5hbWUobmFtZTogc3RyaW5nKTogSUVsZW1lbnQge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwubmFtZSA9PSBuYW1lKSByZXR1cm4gZWw7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmdldEVsZW1lbnRCeU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpID09IHZhbHVlTmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHZhciBkYXRhID0ge307XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKHEuaXNFbXB0eSgpKSBjb250aW51ZTtcbiAgICAgICg8YW55PmRhdGEpW3EuZ2V0VmFsdWVOYW1lKCldID0gcVtcInZhbHVlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbiBjb21tZW50cyBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tbWVudHMoKTogYW55IHtcbiAgICB2YXIgY29tbWVudHMgPSB7fTtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIGNvbW1lbnRzO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgY29tbWVudCA9IHRoaXMuZGF0YS5nZXRDb21tZW50KHEuZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAoPGFueT5jb21tZW50cylbcS5nZXRWYWx1ZU5hbWUoKV0gPSBjb21tZW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UvcGFuZWwsIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsZWFyIHZhbHVlcyBmb3IgaW52aXNpYmxlIHF1ZXN0aW9ucyBvciB2YWx1ZXMgdGhhdCBkb2Vzbid0IGFzc29jaWF0ZWQgd2l0aCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBtYXJrUXVlc3Rpb25MaXN0RGlydHkoKSB7XG4gICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucGFyZW50KSB0aGlzLnBhcmVudC5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIG9iamVjdCwgUGFuZWwvUGFnZS4gRWxlbWVudHMgY2FuIGJlIHF1ZXN0aW9ucyBvciBwYW5lbHMuIFRoZSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBlbGVtZW50cyBpbiB0aGUgbmVzdGVkIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIFBhbmVsL1BhZ2UuIEl0IGxvb2tzIGluIG5lc3RlZCBQYW5lbHMgYXMgd2VsbC5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWw6IGFueSA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICBpZiAoKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmNvbnRhaW5zRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gcmVxdWlyZSB0aGUgYW5zd2VyIGF0IGxlYXN0IGluIG9uZSBxdWVzdGlvbiBpbiB0aGUgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhpcyBQYWdlIG9yIGluc2lkZSB0aGUgY3VycmVudCBQYW5lbFxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlLCB0byBzaG93IGVycm9ycyBpbiBVSVxuICAgKiBAcGFyYW0gZm9jdXNlT25GaXJzdEVycm9yIHNldCBpdCB0byB0cnVlIHRvIGZvY3VzZSBvbiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBkb2Vzbid0IHBhc3MgdGhlIHZhbGlkYXRpb25cbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSxcbiAgICBmb2N1c2VPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICB2YXIgcmVjID0ge1xuICAgICAgZmlyZUNhbGxiYWNrOiBmaXJlQ2FsbGJhY2ssXG4gICAgICBmb2N1c2VPbkZpcnN0RXJyb3I6IGZvY3VzZU9uRmlyc3RFcnJvcixcbiAgICAgIGZpcnN0RXJyb3JRdWVzdGlvbjogPGFueT5udWxsLFxuICAgICAgcmVzdWx0OiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5oYXNFcnJvcnNDb3JlKHJlYyk7XG4gICAgaWYgKHJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZWMucmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JzSW5QYW5lbHMocmVjOiBhbnkpIHtcbiAgICB2YXIgZXJyb3JzID0gPEFycmF5PGFueT4+W107XG4gICAgdGhpcy5oYXNSZXF1aXJlZEVycm9yKHJlYywgZXJyb3JzKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBjdXN0b21FcnJvciA9IHRoaXMuc3VydmV5LnZhbGlkYXRlUGFuZWwodGhpcyk7XG4gICAgICBpZiAoY3VzdG9tRXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goY3VzdG9tRXJyb3IpO1xuICAgICAgICByZWMucmVzdWx0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhcmVjLmZpcmVDYWxsYmFjaykge1xuICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFzUmVxdWlyZWRFcnJvcihyZWM6IGFueSwgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCkgcmV0dXJuO1xuICAgIHZhciB2aXNRdWVzdGlvbnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNRdWVzdGlvbnMsIHRydWUpO1xuICAgIGlmICh2aXNRdWVzdGlvbnMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1F1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF2aXNRdWVzdGlvbnNbaV0uaXNFbXB0eSgpKSByZXR1cm47XG4gICAgfVxuICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgIGVycm9ycy5wdXNoKG5ldyBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yKHRoaXMucmVxdWlyZWRFcnJvclRleHQpKTtcbiAgICBpZiAoIXJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24gPSB2aXNRdWVzdGlvbnNbMF07XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYXNFcnJvcnNDb3JlKHJlYzogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuZWxlbWVudHNbaV0uaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT50aGlzLmVsZW1lbnRzW2ldKSkuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPnRoaXMuZWxlbWVudHNbaV07XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSBjb250aW51ZTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmhhc0Vycm9ycyhyZWMuZmlyZUNhbGxiYWNrKSkge1xuICAgICAgICAgIGlmIChyZWMuZm9jdXNlT25GaXJzdEVycm9yICYmIHJlYy5maXJzdEVycm9yUXVlc3Rpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWMucmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmhhc0Vycm9yc0luUGFuZWxzKHJlYyk7XG4gIH1cbiAgdXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgKDxCYXNlPig8YW55PmVsKSkuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCBlbC5pc1Zpc2libGUpO1xuICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHdpdGhFcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogUXVlc3Rpb24ge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoIWVsLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKFxuICAgICAgICAgIHdpdGhFcnJvclxuICAgICAgICApO1xuICAgICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbj5lbDtcbiAgICAgICAgaWYgKHEuaGFzSW5wdXQgJiYgKCF3aXRoRXJyb3IgfHwgcS5jdXJyZW50RXJyb3JDb3VudCA+IDApKSByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEZpbGwgbGlzdCBhcnJheSB3aXRoIHRoZSBxdWVzdGlvbnMuXG4gICAqIEBwYXJhbSBsaXN0XG4gICAqIEBwYXJhbSB2aXNpYmxlT25seSBzZXQgaXQgdG8gdHJ1ZSB0byBnZXQgdmlzaWJsZSBxdWVzdGlvbnMgb25seVxuICAgKi9cbiAgcHVibGljIGFkZFF1ZXN0aW9uc1RvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUXVlc3Rpb24+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QobGlzdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogRmlsbCBsaXN0IGFycmF5IHdpdGggdGhlIHBhbmVscy5cbiAgICogQHBhcmFtIGxpc3RcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbHNJbnRvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUGFuZWw+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgICA8QXJyYXk8SUVsZW1lbnQ+Pig8QXJyYXk8YW55Pj5saXN0KSxcbiAgICAgIHZpc2libGVPbmx5LFxuICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgbGlzdDogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sXG4gICAgaXNQYW5lbDogYm9vbGVhblxuICApIHtcbiAgICBpZiAodmlzaWJsZU9ubHkgJiYgIXRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgbGlzdCxcbiAgICAgIHRoaXMuZWxlbWVudHMsXG4gICAgICB2aXNpYmxlT25seSxcbiAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICBpc1BhbmVsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICBsaXN0OiBBcnJheTxJRWxlbWVudD4sXG4gICAgZWxlbWVudHM6IEFycmF5PElFbGVtZW50PixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbixcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuLFxuICAgIGlzUGFuZWw6IGJvb2xlYW5cbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAodmlzaWJsZU9ubHkgJiYgIWVsLnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgaWYgKChpc1BhbmVsICYmIGVsLmlzUGFuZWwpIHx8ICghaXNQYW5lbCAmJiAhZWwuaXNQYW5lbCkpIHtcbiAgICAgICAgbGlzdC5wdXNoKGVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgICg8UGFuZWxNb2RlbD5lbCkuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5lbGVtZW50cyxcbiAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgICAgIGlzUGFuZWxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpbmNsdWRpbmdEZXNpZ25UaW1lKSB7XG4gICAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICAgICAgICBsaXN0LFxuICAgICAgICAgICAgKDxTdXJ2ZXlFbGVtZW50Pig8YW55PmVsKSkuZ2V0RWxlbWVudHNJbkRlc2lnbihmYWxzZSksXG4gICAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICAgICAgICBpc1BhbmVsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBQYWdlIGFuZCBpdCBpcyB0aGUgY3VycmVudCBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0FjdGl2ZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5IHx8IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlID09IHRoaXMucm9vdDtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0udXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgZGlmZmVyZW50IGZyb20gXCJkZWZhdWx0XCIgdG8gc2V0IHRoZSBzcGVjaWZpYyBxdWVzdGlvbiB0aXRsZSBsb2NhdGlvbiBmb3IgdGhpcyBwYW5lbC9wYWdlLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKVxuICAgICAgcmV0dXJuIHRoaXMub25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvblRpdGxlTG9jYXRpb24gIT0gXCJkZWZhdWx0XCIpXG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvblRpdGxlTG9jYXRpb247XG4gICAgaWYgKHRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uIDogXCJ0b3BcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHJvb3QoKTogUGFuZWxNb2RlbEJhc2Uge1xuICAgIHZhciByZXMgPSA8UGFuZWxNb2RlbEJhc2U+dGhpcztcbiAgICB3aGlsZSAocmVzLnBhcmVudCkgcmVzID0gcmVzLnBhcmVudDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBjaGlsZFZpc2liaWxpdHlDaGFuZ2VkKCkge1xuICAgIHZhciBuZXdJc1Zpc2libGVWYWx1ZSA9IHRoaXMuZ2V0SXNQYWdlVmlzaWJsZShudWxsKTtcbiAgICB2YXIgb2xkSXNWaXNpYmxlVmFsdWUgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdHJ1ZSk7XG4gICAgaWYgKG5ld0lzVmlzaWJsZVZhbHVlICE9PSBvbGRJc1Zpc2libGVWYWx1ZSkge1xuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVSb3coKTogUXVlc3Rpb25Sb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJvd01vZGVsKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgICB0aGlzLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIGdldCByb3dzKCk6IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCB0aGlzLmJ1aWxkUm93cygpKTtcbiAgfVxuICBwcml2YXRlIG9uQWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGVsZW1lbnQuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgIGVsZW1lbnQucGFyZW50ID0gdGhpcztcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgIHRoaXMudXBkYXRlUm93c09uRWxlbWVudEFkZGVkKGVsZW1lbnQsIGluZGV4KTtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB2YXIgcCA9IDxQYW5lbE1vZGVsPmVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkucGFuZWxBZGRlZChwLCBpbmRleCwgdGhpcywgdGhpcy5yb290KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uPmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQWRkZWQocSwgaW5kZXgsIHRoaXMsIHRoaXMucm9vdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXRoaXMuYWRkRWxlbWVudENhbGxiYWNrKSB0aGlzLmFkZEVsZW1lbnRDYWxsYmFjayhlbGVtZW50KTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInN0YXJ0V2l0aE5ld0xpbmVcIixcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBvblJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICBlbGVtZW50LnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICAoPEJhc2U+KDxhbnk+ZWxlbWVudCkpLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcInZpc2libGVcIiwgXCJpc1Zpc2libGVcIiwgXCJzdGFydFdpdGhOZXdMaW5lXCJdLFxuICAgICAgdGhpcy5pZFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVSb3dzT25FbGVtZW50UmVtb3ZlZChlbGVtZW50KTtcbiAgICBpZiAoIWVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5xdWVzdGlvblJlbW92ZWQoPFF1ZXN0aW9uPmVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LnBhbmVsUmVtb3ZlZChlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5yZW1vdmVFbGVtZW50Q2FsbGJhY2spIHRoaXMucmVtb3ZlRWxlbWVudENhbGxiYWNrKGVsZW1lbnQpO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBvbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZChlbGVtZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1Zpc2liaWxpdHkoZWxlbWVudCk7XG4gICAgdGhpcy5jaGlsZFZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gICAgaWYgKCEhdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50Lm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUm93c1Zpc2liaWxpdHkoZWxlbWVudDogYW55KSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGlmIChyb3cuZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KSA+IC0xKSB7XG4gICAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGJ1aWxkUm93cygpOiBBcnJheTxRdWVzdGlvblJvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxRdWVzdGlvblJvd01vZGVsPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgIHZhciBpc05ld1JvdyA9IGkgPT0gMCB8fCBlbC5zdGFydFdpdGhOZXdMaW5lO1xuICAgICAgdmFyIHJvdyA9IGlzTmV3Um93ID8gdGhpcy5jcmVhdGVSb3coKSA6IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoaXNOZXdSb3cpIHJlc3VsdC5wdXNoKHJvdyk7XG4gICAgICByb3cuYWRkRWxlbWVudChlbCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0udXBkYXRlVmlzaWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUm93c09uRWxlbWVudEFkZGVkKGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgZHJhZ0Ryb3BJbmZvID0gbmV3IERyYWdEcm9wSW5mbyhudWxsLCBlbGVtZW50KTtcbiAgICBkcmFnRHJvcEluZm8udGFyZ2V0ID0gZWxlbWVudDtcbiAgICBkcmFnRHJvcEluZm8uaXNFZGdlID0gdGhpcy5lbGVtZW50cy5sZW5ndGggPiAxO1xuICAgIGlmICh0aGlzLmVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IGluZGV4ID4gMDtcbiAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXMuZWxlbWVudHNbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPSB0aGlzLmVsZW1lbnRzW2luZGV4IC0gMV07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb1JvdyhkcmFnRHJvcEluZm8sIG51bGwpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUm93c09uRWxlbWVudFJlbW92ZWQoZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuZmluZFJvd0J5RWxlbWVudChlbGVtZW50KVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhcbiAgICBlbGVtZW50OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKSB7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5wYW5lbCkgcmV0dXJuO1xuICAgIHZhciBlbEluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGVsSW5kZXggPCAwKSByZXR1cm47XG4gICAgcm93LmVsZW1lbnRzLnNwbGljZShlbEluZGV4LCAxKTtcbiAgICBpZiAocm93LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaW5kZXggPj0gMCkge1xuICAgICAgICByb3cucGFuZWwucm93cy5zcGxpY2Uocm93LmluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaW5kUm93QnlFbGVtZW50KGVsOiBJRWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd3NbaV0uZWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGVsKTtcbiAgICBpZiAoISFyb3cpIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlbmRlcmVkIHRpdGxlIHRleHQgb3IgaHRtbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yICE9IG51bGxcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHN0ciwgdHJ1ZSlcbiAgICAgIDogc3RyO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcgfHwgdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXSA9PSBleGNlcHRpb25RdWVzdGlvbikgY29udGludWU7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlIHx8IGluZGV4IDwgMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgc3RhcnRJbmRleCA9IGluZGV4O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaW5kZXggKz0gdGhpcy5lbGVtZW50c1tpXS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggLSBzdGFydEluZGV4O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1bnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSBhIHBhbmVsL3BhZ2UgcmVhZG9ubHkuXG4gICAqIEBzZWUgZW5hYmxlSWZcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbC9QYWdlIGJlY29tZXMgcmVhZCBvbmx5IGFuZCBhbiBlbmQtdXNlciB3aWxsIG5vdCBhYmxlIHRvIGFuc3dlciBvbiBxdXN0aW9ucyBpbnNpZGUgaXQuXG4gICAqIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiByZWFkT25seSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGFuIGVsZW1lbW50IGludG8gUGFuZWwgb3IgUGFnZS5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlciA9IC0xKSB7XG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDAsIGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQWRkIGEgcXVlc3Rpb24gaW50byBQYW5lbCBvciBQYWdlLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25cbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uLCBpbmRleDogbnVtYmVyID0gLTEpIHtcbiAgICB0aGlzLmFkZEVsZW1lbnQocXVlc3Rpb24sIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFuZWwgaW50byBQYW5lbCBvciBQYWdlLlxuICAgKiBAcGFyYW0gcGFuZWxcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgIHRoaXMuYWRkRWxlbWVudChwYW5lbCwgaW5kZXgpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHF1ZXN0aW9uIGFuZCBhZGRzIGl0IGludG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uVHlwZSB0aGUgcG9zc2libGUgdmFsdWVzIGFyZTogXCJ0ZXh0XCIsIFwiY2hlY2tib3hcIiwgXCJkcm9wZG93blwiLCBcIm1hdHJpeFwiLCBcImh0bWxcIiwgXCJtYXRyaXhkeW5hbWljXCIsIFwibWF0cml4ZHJvcGRvd25cIiBhbmQgc28gb24uXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1F1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBudWxsKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbiA9IFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGUsIG5hbWUpO1xuICAgIHRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwYW5lbCBhbmQgYWRkcyBpdCBpbnRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFuZWwgbmFtZVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1BhbmVsKG5hbWU6IHN0cmluZyA9IG51bGwpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld1BhbmVsKG5hbWUpO1xuICAgIHRoaXMuYWRkUGFuZWwocGFuZWwpO1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwobmFtZTogc3RyaW5nKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKG5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZWxlbWVudCAoUGFuZWwgb3IgUXVlc3Rpb24pIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgcXVlc3Rpb24gIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAc2VlIGVsZW1lbnRzXG4gICAqIEBzZWUgcmVtb3ZlRWxlbWVudFxuICAgKi9cbiAgcHVibGljIHJlbW92ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHRoaXMucmVtb3ZlRWxlbWVudChxdWVzdGlvbik7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25WZXJzaW9uID0gLTE7XG4gIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZXMuY29uZGl0aW9uVmVyc2lvbiA8IHRoaXMuY29uZGl0aW9uVmVyc2lvbikgcmV0dXJuO1xuICAgIHRoaXMuY29uZGl0aW9uVmVyc2lvbiA9IHZhbHVlcy5jb25kaXRpb25WZXJzaW9uO1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHMuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWVzLmNvbmRpdGlvblZlcnNpb24gPCB0aGlzLmNvbmRpdGlvblZlcnNpb24pIHJldHVybjtcbiAgICAgIGVsZW1lbnRzW2ldLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWVzLmNvbmRpdGlvblZlcnNpb24gPCB0aGlzLmNvbmRpdGlvblZlcnNpb24pIHJldHVybjtcbiAgICBpZiAoIXRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKSB7XG4gICAgICB0aGlzLnJ1blZpc2libGVDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgdGhpcy5ydW5FbmFibGVDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIHRoaXMudmlzaWJsZSA9IGNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1bkVuYWJsZUNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5lbmFibGVJZikgcmV0dXJuO1xuICAgIHZhciBjb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMucmVhZE9ubHkgPSAhY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRyYWdEcm9wQWRkVGFyZ2V0KGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKSB7XG4gICAgdmFyIHByZXZSb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyhkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICBpZiAodGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgcHJldlJvdykpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KGRyYWdEcm9wSW5mby50YXJnZXQsIHByZXZSb3cpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZHJhZ0Ryb3BGaW5kUm93KGZpbmRFbGVtZW50OiBJU3VydmV5RWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIGlmICghZmluZEVsZW1lbnQgfHwgZmluZEVsZW1lbnQuaXNQYWdlKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZWxlbWVudCA9IDxJRWxlbWVudD5maW5kRWxlbWVudDtcbiAgICB2YXIgcm93cyA9IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyb3dzW2ldLmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBubCA9IHRoaXMuZWxlbWVudHNbaV0uZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghcG5sKSBjb250aW51ZTtcbiAgICAgIHZhciByb3cgPSAoPFBhbmVsTW9kZWxCYXNlPnBubCkuZHJhZ0Ryb3BGaW5kUm93KGVsZW1lbnQpO1xuICAgICAgaWYgKCEhcm93KSByZXR1cm4gcm93O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9Sb3coXG4gICAgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm8sXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWwoZHJhZ0Ryb3BJbmZvKSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGRlc3QgPSBkcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgdmFyIGRlc3RSb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyhkZXN0KTtcbiAgICBpZiAoIWRlc3RSb3cpIHJldHVybiB0cnVlO1xuICAgIGlmICghZHJhZ0Ryb3BJbmZvLnRhcmdldC5zdGFydFdpdGhOZXdMaW5lKVxuICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgICAgICBkcmFnRHJvcEluZm8sXG4gICAgICAgIGRlc3RSb3csXG4gICAgICAgIHByZXZSb3dcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb05ld1JvdyhkcmFnRHJvcEluZm8sIGRlc3RSb3csIHByZXZSb3cpO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWwoZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm8pOiBib29sZWFuIHtcbiAgICBpZiAoZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uLmlzUGFnZSkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvRW1wdHlQYW5lbENvcmUoXG4gICAgICAgIHRoaXMucm9vdCxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBkZXN0ID0gPElFbGVtZW50PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoZGVzdC5pc1BhbmVsICYmICFkcmFnRHJvcEluZm8uaXNFZGdlKSB7XG4gICAgICB2YXIgcGFuZWwgPSA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+ZGVzdCk7XG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEcm9wSW5mby5uZXN0ZWRQYW5lbERlcHRoIDwgMCB8fFxuICAgICAgICBkcmFnRHJvcEluZm8ubmVzdGVkUGFuZWxEZXB0aCA+PSBwYW5lbC5kZXB0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgICAgICAgIDxQYW5lbE1vZGVsQmFzZT4oPGFueT5kZXN0KSxcbiAgICAgICAgICBkcmFnRHJvcEluZm8udGFyZ2V0LFxuICAgICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIGRlc3RSb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgaW5kZXggPSBkZXN0Um93LmVsZW1lbnRzLmluZGV4T2YoPElFbGVtZW50PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbik7XG4gICAgaWYgKFxuICAgICAgaW5kZXggPT0gMCAmJlxuICAgICAgIWRyYWdEcm9wSW5mby5pc0JvdHRvbSAmJlxuICAgICAgZGVzdFJvdy5lbGVtZW50c1swXS5zdGFydFdpdGhOZXdMaW5lXG4gICAgKSB7XG4gICAgICBpZiAoZGVzdFJvdy5pbmRleCA+IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gdHJ1ZTtcbiAgICAgICAgZGVzdFJvdyA9IGRlc3RSb3cucGFuZWwucm93c1tkZXN0Um93LmluZGV4IC0gMV07XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9XG4gICAgICAgICAgZGVzdFJvdy5lbGVtZW50c1tkZXN0Um93LmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvRXhpc3RpbmdSb3coXG4gICAgICAgICAgZHJhZ0Ryb3BJbmZvLFxuICAgICAgICAgIGRlc3RSb3csXG4gICAgICAgICAgcHJldlJvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb05ld1JvdyhkcmFnRHJvcEluZm8sIGRlc3RSb3csIHByZXZSb3cpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcHJldlJvd0luZGV4ID0gLTE7XG4gICAgaWYgKHByZXZSb3cgPT0gZGVzdFJvdykge1xuICAgICAgcHJldlJvd0luZGV4ID0gZGVzdFJvdy5lbGVtZW50cy5pbmRleE9mKGRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgIH1cbiAgICBpZiAoZHJhZ0Ryb3BJbmZvLmlzQm90dG9tKSBpbmRleCsrO1xuICAgIHZhciBzcmNSb3cgPSB0aGlzLmZpbmRSb3dCeUVsZW1lbnQoZHJhZ0Ryb3BJbmZvLnNvdXJjZSk7XG4gICAgaWYgKFxuICAgICAgc3JjUm93ID09IGRlc3RSb3cgJiZcbiAgICAgIHNyY1Jvdy5lbGVtZW50cy5pbmRleE9mKGRyYWdEcm9wSW5mby5zb3VyY2UpID09IGluZGV4XG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA9PSBwcmV2Um93SW5kZXgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocHJldlJvd0luZGV4ID4gLTEpIHtcbiAgICAgIGRlc3RSb3cuZWxlbWVudHMuc3BsaWNlKHByZXZSb3dJbmRleCwgMSk7XG4gICAgICBpZiAocHJldlJvd0luZGV4IDwgaW5kZXgpIGluZGV4LS07XG4gICAgfVxuICAgIGRlc3RSb3cuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICBkZXN0Um93LnVwZGF0ZVZpc2libGUoKTtcbiAgICByZXR1cm4gcHJldlJvd0luZGV4IDwgMDtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coXG4gICAgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm8sXG4gICAgZGVzdFJvdzogUXVlc3Rpb25Sb3dNb2RlbCxcbiAgICBwcmV2Um93OiBRdWVzdGlvblJvd01vZGVsXG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciB0YXJnZXRSb3cgPSBkZXN0Um93LnBhbmVsLmNyZWF0ZVJvdygpO1xuICAgIHRhcmdldFJvdy5hZGRFbGVtZW50KGRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgIHZhciBpbmRleCA9IGRlc3RSb3cuaW5kZXg7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgLy9zYW1lIHJvd1xuICAgIGlmICghIXByZXZSb3cgJiYgcHJldlJvdy5wYW5lbCA9PSB0YXJnZXRSb3cucGFuZWwgJiYgcHJldlJvdy5pbmRleCA9PSBpbmRleClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgICEhc3JjUm93ICYmXG4gICAgICBzcmNSb3cucGFuZWwgPT0gdGFyZ2V0Um93LnBhbmVsICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMubGVuZ3RoID09IDEgJiZcbiAgICAgIHNyY1Jvdy5pbmRleCA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBkZXN0Um93LnBhbmVsLnJvd3Muc3BsaWNlKGluZGV4LCAwLCB0YXJnZXRSb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSxcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuXG4gICkge1xuICAgIHZhciB0YXJnZXRSb3cgPSBwYW5lbC5jcmVhdGVSb3coKTtcbiAgICB0YXJnZXRSb3cuYWRkRWxlbWVudCh0YXJnZXQpO1xuICAgIGlmIChwYW5lbC5lbGVtZW50cy5sZW5ndGggPT0gMCB8fCBpc0JvdHRvbSkge1xuICAgICAgcGFuZWwucm93cy5wdXNoKHRhcmdldFJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVsLnJvd3Muc3BsaWNlKDAsIDAsIHRhcmdldFJvdyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgZWxlbWVudCwgc2ltaWxhciB0byB0aGUgUGFnZSBvYmplY3RzLiBIb3dldmVyLCB1bmxpa2UgdGhlIFBhZ2UsIFBhbmVsIGNhbid0IGJlIGEgcm9vdC5cbiAqIEl0IG1heSBjb250YWluIHF1ZXN0aW9ucyBhbmQgb3RoZXIgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWxCYXNlIGltcGxlbWVudHMgSUVsZW1lbnQge1xuICBzdGF0ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInN0YXRlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGVDaGFuZ2VkQ2FsbGJhY2spIHNlbGYuc3RhdGVDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwid2lkdGhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoISFzZWxmLnBhcmVudCkge1xuICAgICAgICBzZWxmLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHNlbGYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImluZGVudFwiLCBcImlubmVySW5kZW50XCIsIFwicmlnaHRJbmRlbnRcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxcIjtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhZ2Ugd2hlcmUgdGhlIHBhbmVsIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2UoKTogSVBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UodGhpcy5wYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZSh2YWw6IElQYWdlKSB7XG4gICAgdGhpcy5zZXRQYWdlKHRoaXMucGFyZW50LCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcImNvbGxhcHNlZFwiIHRvIHJlbmRlciBvbmx5IFBhbmVsIHRpdGxlIGFuZCBleHBhbmRlZCBidXR0b24gYW5kIHRvIFwiZXhwYW5kZWRcIiB0byByZW5kZXIgdGhlIGNvbGxhcHNlZCBidXR0b24gaW4gdGhlIFBhbmVsIGNhcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhdGVcIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGF0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFBhbmVsIGlzIGluIHRoZSBjb2xsYXBzZWQgc3RhdGVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGNvbGxhcHNlXG4gICAqIEBzZWUgaXNFeHBhbmRlZFxuICAgKi9cbiAgcHVibGljIGdldCBpc0NvbGxhcHNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBcImNvbGxhcHNlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFBhbmVsIGlzIGluIHRoZSBleHBhbmRlZCBzdGF0ZVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgZXhwYW5kXG4gICAqIEBzZWUgaXNDb2xsYXBzZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBcImV4cGFuZGVkXCI7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSBQYW5lbFxuICAgKiBAc2VlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdGhpcy5zdGF0ZSA9IFwiY29sbGFwc2VkXCI7XG4gIH1cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgUGFuZWxcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGV4cGFuZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gXCJleHBhbmRlZFwiO1xuICB9XG4gIHByb3RlY3RlZCBoYXNFcnJvcnNDb3JlKHJlYzogYW55KSB7XG4gICAgc3VwZXIuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkICYmIHJlYy5yZXN1bHQgJiYgcmVjLmZpcmVDYWxsYmFjaykge1xuICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3RyKSB7XG4gICAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCB0aGlzLmlzRXhwYW5kZWQpIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiBcIltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuZ2V0UmVuZGVyZWRUaXRsZShzdHIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUGFuZWwgd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgd2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGVmdCBpbmRlbnQuIFNldCB0aGlzIHByb3BlcnR5IHRvIGluY3JlYXNlIHRoZSBwYW5lbCBsZWZ0IGluZGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5uZXIgaW5kZW50LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBpbmNyZWFzZSB0aGUgcGFuZWwgY29udGVudCBtYXJnaW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlubmVySW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlubmVySW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5uZXJJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbm5lckluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiKTtcbiAgfVxuICBzZXQgcmVuZGVyV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUGFuZWwgcmVuZGVycyBvbiB0aGUgbmV3IGxpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBmYWxzZSwgdGhlIHBhbmVsIHRyaWVzIHRvIHJlbmRlciBvbiB0aGUgc2FtZSBsaW5lL3JvdyB3aXRoIGEgcHJldmlvdXMgcXVlc3Rpb24vcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0V2l0aE5ld0xpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFdpdGhOZXdMaW5lKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByaWdodCBpbmRlbnQgb2YgdGhlIFBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ0xlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ0xlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ0xlZnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgaW5uZXJQYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbm5lclBhZGRpbmdMZWZ0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBpbm5lclBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJQYWRkaW5nTGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nUmlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nUmlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIG9uSW5kZW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLmlubmVyUGFkZGluZ0xlZnQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5pbm5lckluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nUmlnaHQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5yaWdodEluZGVudCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbmRlbnRTaXplKGluZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZW50IDwgMSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBcIlwiO1xuICAgIHZhciBjc3MgPSAoPGFueT50aGlzKS5zdXJ2ZXlbXCJjc3NcIl07XG4gICAgaWYgKCFjc3MpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBpbmRlbnQgKiBjc3MucXVlc3Rpb24uaW5kZW50ICsgXCJweFwiO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICh0aGlzLnN1cnZleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwicGFuZWxiYXNlXCIsXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcImVsZW1lbnRzXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInZpc2libGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcInJlYWRPbmx5OmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcImhpZGRlblwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbEJhc2UoKTtcbiAgfVxuKTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJwYW5lbFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJzdGF0ZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiY29sbGFwc2VkXCIsIFwiZXhwYW5kZWRcIl1cbiAgICB9LFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImlubmVySW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7IG5hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhZ2VcIixcbiAgICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICAgIGNob2ljZXM6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHN1cnZleVxuICAgICAgICAgID8gc3VydmV5LnBhZ2VzLm1hcCgocDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBwLm5hbWUsIHRleHQ6IHAudGl0bGUgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9LFxuICBcInBhbmVsYmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhbmVsLnRzIiwiaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciwgUmVxdXJlTnVtZXJpY0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogYW55LCBwdWJsaWMgZXJyb3I6IFN1cnZleUVycm9yID0gbnVsbCkge31cbn1cbi8qKlxuICogQmFzZSBTdXJ2ZXlKUyB2YWxpZGF0b3IgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0ZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0ZXh0XCIsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGVBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRleHRcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEVycm9yVGV4dChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRleHQpIHJldHVybiB0aGlzLnRleHQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGVBbGxWYWx1ZXMoXG4gICAgdmFsdWU6IGFueSxcbiAgICB2YWx1ZXM6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ3VzdG9tRXJyb3IobmFtZTogc3RyaW5nKTogU3VydmV5RXJyb3Ige1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSksIHRoaXMubG9jT3duZXIpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElWYWxpZGF0b3JPd25lciB7XG4gIHZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj47XG4gIHZhbGlkYXRlZFZhbHVlOiBhbnk7XG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZztcbiAgZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk6IGFueTtcbiAgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnk7XG59XG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUnVubmVyIHtcbiAgcHVibGljIHJ1bihvd25lcjogSVZhbGlkYXRvck93bmVyKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvd25lci52YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsaWRhdG9yUmVzdWx0ID0gbnVsbDtcbiAgICAgIHZhciB2YWxpZGF0b3IgPSBvd25lci52YWxpZGF0b3JzW2ldO1xuICAgICAgaWYgKCF2YWxpZGF0b3IuaXNWYWxpZGF0ZUFsbFZhbHVlcykge1xuICAgICAgICB2YWxpZGF0b3JSZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUoXG4gICAgICAgICAgb3duZXIudmFsaWRhdGVkVmFsdWUsXG4gICAgICAgICAgb3duZXIuZ2V0VmFsaWRhdG9yVGl0bGUoKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yLnZhbGlkYXRlQWxsVmFsdWVzKFxuICAgICAgICAgIG93bmVyLnZhbGlkYXRlZFZhbHVlLFxuICAgICAgICAgIG93bmVyLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgICAgIG93bmVyLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKSxcbiAgICAgICAgICBvd25lci5nZXRWYWxpZGF0b3JUaXRsZSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoISF2YWxpZGF0b3JSZXN1bHQgJiYgISF2YWxpZGF0b3JSZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmVzLnB1c2godmFsaWRhdG9yUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSBudW1lcmljIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWVyaWNWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluVmFsdWU6IG51bWJlciA9IG51bGwsIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJudW1lcmljdmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIG5ldyBSZXF1cmVOdW1lcmljRXJyb3IoKSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1pblZhbHVlID4gcmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4VmFsdWUgIT09IG51bGwgJiYgdGhpcy5tYXhWYWx1ZSA8IHJlc3VsdC52YWx1ZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyBudWxsIDogcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHZhciB2TmFtZSA9IG5hbWUgPyBuYW1lIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInZhbHVlXCIpO1xuICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsICYmIHRoaXMubWF4VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNaW5NYXhcIilcbiAgICAgICAgW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAgIC5nZXRTdHJpbmcoXCJudW1lcmljTWluXCIpXG4gICAgICAgICAgW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1pblZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNYXhcIilcbiAgICAgICAgW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1heFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHRleHQgdmFsdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1pbkxlbmd0aDogbnVtYmVyID0gMCxcbiAgICBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgPSAwLFxuICAgIHB1YmxpYyBhbGxvd0RpZ2l0cyA9IHRydWVcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRleHR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHZhbHVlICE9PSBcIlwiICYmIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmFsbG93RGlnaXRzKSB7XG4gICAgICB2YXIgcmVnID0gL15bQS1aYS16XFxzXSokLztcbiAgICAgIGlmICghcmVnLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4TGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdGhpcy5tYXhMZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbk1heExlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgsIHRoaXMubWF4TGVuZ3RoKTtcbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbkxlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgpO1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWF4TGVuZ3RoXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhMZW5ndGgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbnN3ZXJDb3VudFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtaW5Db3VudDogbnVtYmVyID0gbnVsbCwgcHVibGljIG1heENvdW50OiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yICE9IEFycmF5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY291bnQgPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKHRoaXMubWluQ291bnQgJiYgY291bnQgPCB0aGlzLm1pbkNvdW50KSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtaW5TZWxlY3RFcnJvclwiKVxuICAgICAgICAgICAgW1wiZm9ybWF0XCJdKHRoaXMubWluQ291bnQpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heENvdW50ICYmIGNvdW50ID4gdGhpcy5tYXhDb3VudCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuZ2V0U3RyaW5nKFwibWF4U2VsZWN0RXJyb3JcIilcbiAgICAgICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1heENvdW50KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxufVxuLyoqXG4gKiBVc2UgaXQgdG8gdmFsaWRhdGUgdGhlIHRleHQgYnkgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2V4VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlZ2V4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJlZ2V4dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICghdGhpcy5yZWdleCB8fCAhdmFsdWUpIHJldHVybiBudWxsO1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAodGhpcy5yZWdleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmhhc0Vycm9yKHJlLCB2YWx1ZVtpXSwgbmFtZSk7XG4gICAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc0Vycm9yKHJlLCB2YWx1ZSwgbmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvcihyZTogUmVnRXhwLCB2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmIChyZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIGUtbWFpbCBhZGRyZXNzIGluIHRoZSB0ZXh0IGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIHByaXZhdGUgcmUgPSAvXigoW148PigpXFxbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdK1xcLikrW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXXsyLH0pJC9pO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1haWx2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucmUudGVzdCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImludmFsaWRFbWFpbFwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgZXJyb3IgaWYgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIHB1YmxpYyBleHByZXNzaW9uOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJleHByZXNzaW9udmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRlQWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZUFsbFZhbHVlcyhcbiAgICB2YWx1ZTogYW55LFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb24pIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy5jb25kaXRpb25SdW5uZXIpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgIHZhciByZXMgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoIXJlcykge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwiaW52YWxpZEV4cHJlc3Npb25cIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLmV4cHJlc3Npb24pO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgW1xuICB7IG5hbWU6IFwidGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGV4dFwiIH1cbl0pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJudW1lcmljdmFsaWRhdG9yXCIsXG4gIFtcIm1pblZhbHVlOm51bWJlclwiLCBcIm1heFZhbHVlOm51bWJlclwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOdW1lcmljVmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInRleHR2YWxpZGF0b3JcIixcbiAgW1wibWluTGVuZ3RoOm51bWJlclwiLCBcIm1heExlbmd0aDpudW1iZXJcIiwgXCJhbGxvd0RpZ2l0czpib29sZWFuXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRleHRWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIixcbiAgW1wibWluQ291bnQ6bnVtYmVyXCIsIFwibWF4Q291bnQ6bnVtYmVyXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEFuc3dlckNvdW50VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInJlZ2V4dmFsaWRhdG9yXCIsXG4gIFtcInJlZ2V4XCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlZ2V4VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImVtYWlsdmFsaWRhdG9yXCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEVtYWlsVmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiZXhwcmVzc2lvbnZhbGlkYXRvclwiLFxuICBbXCJleHByZXNzaW9uOmNvbmRpdGlvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdmFsaWRhdG9yLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCwgSUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUm93IGV4dGVuZHMgUXVlc3Rpb25Sb3dNb2RlbCB7XG4gIGtvR2V0VHlwZTogYW55O1xuICBrb0VsZW1lbnRBZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgc3VwZXIocGFuZWwpO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29HZXRUeXBlID0gZnVuY3Rpb24oZWw6IGFueSkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0RWxlbWVudFR5cGUoZWwpO1xuICAgIH07XG4gICAgdGhpcy5rb0VsZW1lbnRBZnRlclJlbmRlciA9IGZ1bmN0aW9uKGVsOiBhbnksIGNvbjogYW55KSB7XG4gICAgICByZXR1cm4gc2VsZi5lbGVtZW50QWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudFR5cGUoZWw6IGFueSkge1xuICAgIHJldHVybiBlbC5pc1BhbmVsID8gXCJzdXJ2ZXktcGFuZWxcIiA6IFwic3VydmV5LXF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGtvQWZ0ZXJSZW5kZXIoZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdEVsID0gZWxbaV07XG4gICAgICB2YXIgbk5hbWUgPSB0RWwubm9kZU5hbWU7XG4gICAgICBpZiAobk5hbWUgPT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZWxlbWVudEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnBhbmVsIHx8ICF0aGlzLnBhbmVsLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIHZhciBlbGVtZW50ID0gPElFbGVtZW50PmNvbjtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB0aGlzLnBhbmVsLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKGNvbiwgZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhbmVsLnN1cnZleS5hZnRlclJlbmRlclF1ZXN0aW9uKGNvbiwgZWwpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuZWxJbXBsZW1lbnRvckJhc2UgZXh0ZW5kcyBJbXBsZW1lbnRvckJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgc3VwZXIocGFuZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYW5lbCBleHRlbmRzIFBhbmVsTW9kZWwge1xuICBrb0VsZW1lbnRUeXBlOiBhbnk7XG4gIGtvQ3NzOiBhbnk7XG4gIGtvSXNFeHBhbmRlZDogYW55O1xuICBrb0lzQ29sbGFwc2VkOiBhbnk7XG4gIGRvRXhwYW5kOiBhbnk7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUGFuZWxJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29FbGVtZW50VHlwZSA9IGtvLm9ic2VydmFibGUoXCJzdXJ2ZXktcGFuZWxcIik7XG4gICAgdGhpcy5rb0NzcyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzZWxmLmNzc0NsYXNzZXM7XG4gICAgfSk7XG4gICAgdGhpcy5rb0lzQ29sbGFwc2VkID0ga28ub2JzZXJ2YWJsZSh0aGlzLmlzQ29sbGFwc2VkKTtcbiAgICB0aGlzLmtvSXNFeHBhbmRlZCA9IGtvLm9ic2VydmFibGUodGhpcy5pc0V4cGFuZGVkKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uU3RhdGVDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLmRvRXhwYW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmNoYW5nZUV4cGFuZGVkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3codGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgb25TdGF0ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5rb0lzQ29sbGFwc2VkKHRoaXMuaXNDb2xsYXBzZWQpO1xuICAgIHRoaXMua29Jc0V4cGFuZGVkKHRoaXMuaXNFeHBhbmRlZCk7XG4gIH1cbiAgcHJpdmF0ZSBjaGFuZ2VFeHBhbmRlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNDb2xsYXBzZWQgJiYgIXRoaXMuaXNFeHBhbmRlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbGxhcHNlKCk7XG4gICAgfVxuICB9XG4gIGdldFRpdGxlU3R5bGUoKSB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZTtcbiAgICBpZiAodGhpcy5rb0lzQ29sbGFwc2VkKCkgfHwgdGhpcy5rb0lzRXhwYW5kZWQoKSkge1xuICAgICAgcmVzdWx0ICs9IFwiIHN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2VkKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhZ2UgZXh0ZW5kcyBQYWdlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFBhbmVsSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVSb3coKTogUXVlc3Rpb25Sb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJvdyh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwobmFtZTogc3RyaW5nKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbChuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJvdGVjdGVkIG9uTnVtQ2hhbmdlZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcInBhbmVsXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFBhbmVsKCk7XG59KTtcbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwicGFnZVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBQYWdlKCk7XG59KTtcblxuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJFbGVtZW50KFwicGFuZWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUGFuZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3BhZ2UudHMiLCJpbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgSVBhZ2UsXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElTdXJ2ZXlFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIFN1cnZleUVsZW1lbnRcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbmZvLCBQYW5lbE1vZGVsQmFzZSwgUXVlc3Rpb25Sb3dNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5cbi8qKlxuICogVGhlIHBhZ2Ugb2JqZWN0LiBJdCBoYXMgZWxlbWVudHMgY29sbGVjdGlvbiwgdGhhdCBjb250YWlucyBxdWVzdGlvbnMgYW5kIHBhbmVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWxCYXNlIGltcGxlbWVudHMgSVBhZ2Uge1xuICBwcml2YXRlIGhhc1Nob3duVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5sb2NUaXRsZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgaWYgKHNlbGYubnVtID4gMCkgcmV0dXJuIHNlbGYubnVtICsgXCIuIFwiICsgdGV4dDtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYWdlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICBpZiAodGhpcy53YXNTaG93bikgcmV0dXJuO1xuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHZpc2libGUgaW5kZXggb2YgdGhlIHBhZ2UuIEl0IGhhcyB2YWx1ZXMgZnJvbSAwIHRvIHZpc2libGUgcGFnZSBjb3VudCAtIDEuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwudmlzaWJsZVBhZ2VzXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGUgcGFnZSBpcyBzdGFydGVkIHBhZ2UgaW4gdGhlIHN1cnZleS4gSXQgY2FuIGJlIHNob3duIG9uIHRoZSBzdGFydCBvbmx5IGFuZCB0aGUgZW5kLXVzZXIgY291bGQgbm90IGNvbWViYWNrIHRvIGl0IGFmdGVyIGl0IHBhc3NlZCBpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc1BhZ2VTdGFydGVkKHRoaXMpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3RhcnRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBzdXBlci5nZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG51bSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG51bSh2YWw6IG51bWJlcikge1xuICAgIGlmICh0aGlzLm51bSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJudW1cIiwgdmFsKTtcbiAgICB0aGlzLm9uTnVtQ2hhbmdlZCh2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcImhpZGVcIiB0byBtYWtlIFwiUHJldlwiLCBcIk5leHRcIiBhbmQgXCJDb21wbGV0ZVwiIGJ1dHRvbnMgYXJlIGludmlzaWJsZSBmb3IgdGhpcyBwYWdlLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcInNob3dcIiB0byBtYWtlIHRoZXNlIGJ1dHRvbnMgdmlzaWJsZSwgZXZlbiBpZiBzdXJ2ZXkgc2hvd05hdmlnYXRpb25CdXR0b25zIHByb3BlcnR5IGlzIGZhbHNlLlxuICAgKiBAc2VlIFN1cnZleU1vZGUuc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIiwgXCJpbmhlcml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gc2hvd24gdG8gdGhlIGVuZC11c2VyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNTaG93blZhbHVlO1xuICB9XG4gIGdldCBoYXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53YXNTaG93bjtcbiAgfVxuICBwdWJsaWMgc2V0V2FzU2hvd24odmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmhhc1Nob3duVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmhhc1Nob3duVmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKHZhbCA9PSB0cnVlICYmIHRoaXMuYXJlUXVlc3Rpb25zUmFuZG9taXplZCkge1xuICAgICAgdGhpcy5yYW5kb21pemVFbGVtZW50cygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzUmFuZG9taXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByYW5kb21pemVFbGVtZW50cygpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1JhbmRvbWl6aW5nID0gdHJ1ZTtcbiAgICB2YXIgb2xkRWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgICB2YXIgbmV3RWxlbWVudHMgPSBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PElFbGVtZW50PihvbGRFbGVtZW50cyk7XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoMCwgdGhpcy5lbGVtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChuZXdFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSYW5kb21pemluZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgcmV0dXJucyB0cnVlLCBpZiB0aGUgZWxlbWVudHMgYXJlIHJhbmRvbWl6ZWQgb24gdGhlIHBhZ2VcbiAgICogQHNlZSBoYXNTaG93blxuICAgKiBAc2VlIHF1ZXN0aW9uc09yZGVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJlUXVlc3Rpb25zUmFuZG9taXplZCgpOiBib29sZWFuIHtcbiAgICB2YXIgb3JkZXIgPVxuICAgICAgdGhpcy5xdWVzdGlvbnNPcmRlciA9PSBcImRlZmF1bHRcIiAmJiB0aGlzLnN1cnZleVxuICAgICAgICA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uc09yZGVyXG4gICAgICAgIDogdGhpcy5xdWVzdGlvbnNPcmRlcjtcbiAgICByZXR1cm4gb3JkZXIgPT0gXCJyYW5kb21cIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gU2V0IGl0IHRvICdyYW5kb20nIHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMsICdpbml0aWFsJyB0byBrZWVwIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIgb3IgJ2RlZmF1bHQnIHRvIHVzZSB0aGUgU3VydmV5IHF1ZXN0aW9uc09yZGVyIHByb3BlcnR5XG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICogQHNlZSBhcmVRdWVzdGlvbnNSYW5kb21pemVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9uIHRoZSBmaXJzdCBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcSA9IHRoaXMuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoKTtcbiAgICBpZiAoISFxKSB7XG4gICAgICBxLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBoYXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgdmFyIHEgPSB0aGlzLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHRydWUpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gc2Nyb2xsIHRvIHRoZSBwYWdlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcbiAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLmlkKTtcbiAgfVxuICAvKipcbiAgICogVGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW50IG9uIHRoaXMgcGFnZVxuICAgKi9cbiAgcHVibGljIGdldCB0aW1lU3BlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZVNwZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhbmVscyBpbiB0aGUgcGFnZVxuICAgKi9cbiAgcHVibGljIGdldFBhbmVscyhcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxJUGFuZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElQYW5lbD4oKTtcbiAgICB0aGlzLmFkZFBhbmVsc0ludG9MaXN0KHJlc3VsdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZC11c2VyIGhhcyB0byBjb21wbGV0ZSB0aGUgcGFnZS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgdGhlIGVuZC11c2VyIGhhcyB1bmxpbWl0ZWQgbnVtYmVyIG9mIHRpbWUgdG8gZmluaXNoIHRoZSBwYWdlLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHt9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzUmFuZG9taXppbmcpIHJldHVybjtcbiAgICBzdXBlci5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm87XG4gIHB1YmxpYyBkcmFnRHJvcFN0YXJ0KFxuICAgIHNyYzogSUVsZW1lbnQsXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMVxuICApIHtcbiAgICB0aGlzLmRyYWdEcm9wSW5mbyA9IG5ldyBEcmFnRHJvcEluZm8oc3JjLCB0YXJnZXQsIG5lc3RlZFBhbmVsRGVwdGgpO1xuICB9XG4gIHB1YmxpYyBkcmFnRHJvcE1vdmVUbyhcbiAgICBkZXN0aW5hdGlvbjogSVN1cnZleUVsZW1lbnQsXG4gICAgaXNCb3R0b206IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpc0VkZ2U6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BJbmZvKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IGlzQm90dG9tO1xuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSA9IGlzRWRnZTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wU291cmNlKCkgfHwgIXRoaXMuZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKSkge1xuICAgICAgaWYgKCEhdGhpcy5kcmFnRHJvcEluZm8uc291cmNlKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsIHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXQodGhpcy5kcmFnRHJvcEluZm8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgdmFyIGRlc3QgPSB0aGlzLmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoIWRlc3QgfHwgIXRoaXMuc3VydmV5KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgaW5zZXJ0QmVmb3JlOiBJRWxlbWVudCA9IG51bGw7XG4gICAgdmFyIGluc2VydEFmdGVyOiBJRWxlbWVudCA9IG51bGw7XG4gICAgdmFyIHBhcmVudCA9XG4gICAgICBkZXN0LmlzUGFnZSB8fCAoIXRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSAmJiAoPElFbGVtZW50PmRlc3QpLmlzUGFuZWwpXG4gICAgICAgID8gZGVzdFxuICAgICAgICA6ICg8SUVsZW1lbnQ+ZGVzdCkucGFyZW50O1xuICAgIGlmICghZGVzdC5pc1BhZ2UpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSAoPElFbGVtZW50PmRlc3QpLnBhcmVudDtcbiAgICAgIGlmICghIWNvbnRhaW5lcikge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSAoPFBhbmVsTW9kZWxCYXNlPmNvbnRhaW5lcikuZWxlbWVudHM7XG4gICAgICAgIHZhciBpbmRleCA9IGVsZW1lbnRzLmluZGV4T2YoPElFbGVtZW50PmRlc3QpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGluc2VydEJlZm9yZSA9IDxJRWxlbWVudD5kZXN0O1xuICAgICAgICAgIGluc2VydEFmdGVyID0gPElFbGVtZW50PmRlc3Q7XG4gICAgICAgICAgaWYgKHRoaXMuZHJhZ0Ryb3BJbmZvLmlzQm90dG9tKSB7XG4gICAgICAgICAgICBpbnNlcnRCZWZvcmUgPVxuICAgICAgICAgICAgICBpbmRleCA8IGVsZW1lbnRzLmxlbmd0aCAtIDEgPyBlbGVtZW50c1tpbmRleCArIDFdIDogbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBpbmRleCA+IDAgPyBlbGVtZW50c1tpbmRleCAtIDFdIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICB0YXJnZXQ6IHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgIHNvdXJjZTogdGhpcy5kcmFnRHJvcEluZm8uc291cmNlLFxuICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICBpbnNlcnRBZnRlcjogaW5zZXJ0QWZ0ZXIsXG4gICAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmRyYWdBbmREcm9wQWxsb3cob3B0aW9ucyk7XG4gIH1cbiAgcHVibGljIGRyYWdEcm9wRmluaXNoKGlzQ2FuY2VsOiBib29sZWFuID0gZmFsc2UpOiBJRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSW5mbykgcmV0dXJuO1xuICAgIHZhciB0YXJnZXQgPSB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQ7XG4gICAgdmFyIHJvdyA9IHRoaXMuZHJhZ0Ryb3BGaW5kUm93KHRhcmdldCk7XG4gICAgaWYgKCFpc0NhbmNlbCkge1xuICAgICAgdmFyIHRhcmdldEluZGV4ID0gdGhpcy5kcmFnRHJvcEdldEVsZW1lbnRJbmRleCh0YXJnZXQsIHJvdyk7XG4gICAgICB2YXIgc3JjID0gdGhpcy5kcmFnRHJvcEluZm8uc291cmNlO1xuICAgICAgaWYgKCEhc3JjICYmICEhc3JjLnBhcmVudCkge1xuICAgICAgICB2YXIgc3JjSW5kZXggPSAoPFBhbmVsTW9kZWxCYXNlPnNyYy5wYXJlbnQpLmVsZW1lbnRzLmluZGV4T2Yoc3JjKTtcbiAgICAgICAgaWYgKCEhcm93ICYmIHJvdy5wYW5lbCA9PSBzcmMucGFyZW50ICYmIHRhcmdldEluZGV4ID4gc3JjSW5kZXgpIHtcbiAgICAgICAgICB0YXJnZXRJbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIXJvdykge1xuICAgICAgICAgIHNyYy5wYXJlbnQucmVtb3ZlRWxlbWVudChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0YXJnZXQsIHJvdyk7XG4gICAgICBpZiAoISFyb3cgJiYgdGFyZ2V0SW5kZXggPiAtMSkge1xuICAgICAgICByb3cucGFuZWwuYWRkRWxlbWVudCh0YXJnZXQsIHRhcmdldEluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVSb3dzUmVtb3ZlRWxlbWVudEZyb21Sb3codGFyZ2V0LCByb3cpO1xuICAgIH1cbiAgICB0aGlzLmRyYWdEcm9wSW5mbyA9IG51bGw7XG4gICAgcmV0dXJuICFpc0NhbmNlbCA/IHRhcmdldCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEdldEVsZW1lbnRJbmRleChcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIHJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBudW1iZXIge1xuICAgIGlmICghcm93KSByZXR1cm4gLTE7XG4gICAgdmFyIGluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YodGFyZ2V0KTtcbiAgICBpZiAocm93LmluZGV4ID09IDApIHJldHVybiBpbmRleDtcbiAgICB2YXIgcHJldlJvdyA9IHJvdy5wYW5lbC5yb3dzW3Jvdy5pbmRleCAtIDFdO1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZSb3cuZWxlbWVudHNbcHJldlJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gaW5kZXggKyByb3cucGFuZWwuZWxlbWVudHMuaW5kZXhPZihwcmV2RWxlbWVudCkgKyAxO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIGlmICghZGVzdGluYXRpb24gfHwgZGVzdGluYXRpb24uaXNQYWdlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcENhbkRyb3BDb3JlKFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8udGFyZ2V0LFxuICAgICAgPElFbGVtZW50PmRlc3RpbmF0aW9uXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcFNvdXJjZSgpOiBib29sZWFuIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5kcmFnRHJvcEluZm8uc291cmNlO1xuICAgIGlmICghc291cmNlKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgZGVzdGluYXRpb24gPSA8SUVsZW1lbnQ+dGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wQ2FuRHJvcENvcmUoc291cmNlLCBkZXN0aW5hdGlvbikpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcENhbkRyb3BOb3ROZXh0KFxuICAgICAgc291cmNlLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UsXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BDb3JlKFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgZGVzdGluYXRpb246IElFbGVtZW50XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wSXNTYW1lRWxlbWVudChkZXN0aW5hdGlvbiwgdGFyZ2V0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0YXJnZXQuaXNQYW5lbCkge1xuICAgICAgdmFyIHBubCA9IDxQYW5lbE1vZGVsQmFzZT4oPGFueT50YXJnZXQpO1xuICAgICAgaWYgKFxuICAgICAgICBwbmwuY29udGFpbnNFbGVtZW50KGRlc3RpbmF0aW9uKSB8fFxuICAgICAgICAhIXBubC5nZXRFbGVtZW50QnlOYW1lKGRlc3RpbmF0aW9uLm5hbWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BOb3ROZXh0KFxuICAgIHNvdXJjZTogSUVsZW1lbnQsXG4gICAgZGVzdGluYXRpb246IElFbGVtZW50LFxuICAgIGlzRWRnZTogYm9vbGVhbixcbiAgICBpc0JvdHRvbTogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRlc3RpbmF0aW9uIHx8IChkZXN0aW5hdGlvbi5pc1BhbmVsICYmICFpc0VkZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoc291cmNlLnBhcmVudCAhPT0gZGVzdGluYXRpb24ucGFyZW50KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgcG5sID0gPFBhbmVsTW9kZWxCYXNlPnNvdXJjZS5wYXJlbnQ7XG4gICAgdmFyIHNyY0luZGV4ID0gcG5sLmVsZW1lbnRzLmluZGV4T2Yoc291cmNlKTtcbiAgICB2YXIgZGVzdEluZGV4ID0gcG5sLmVsZW1lbnRzLmluZGV4T2YoZGVzdGluYXRpb24pO1xuICAgIGlmIChkZXN0SW5kZXggPCBzcmNJbmRleCAmJiAhaXNCb3R0b20pIGRlc3RJbmRleC0tO1xuICAgIGlmIChpc0JvdHRvbSkgZGVzdEluZGV4Kys7XG4gICAgcmV0dXJuIHNyY0luZGV4IDwgZGVzdEluZGV4XG4gICAgICA/IGRlc3RJbmRleCAtIHNyY0luZGV4ID4gMVxuICAgICAgOiBzcmNJbmRleCAtIGRlc3RJbmRleCA+IDA7XG4gIH1cblxuICBwcml2YXRlIGRyYWdEcm9wSXNTYW1lRWxlbWVudChlbDE6IElFbGVtZW50LCBlbDI6IElFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsMSA9PSBlbDIgfHwgZWwxLm5hbWUgPT0gZWwyLm5hbWU7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJwYWdlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLFxuICAgICAgZGVmYXVsdDogXCJpbmhlcml0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbmhlcml0XCIsIFwic2hvd1wiLCBcImhpZGVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImluaXRpYWxcIiwgXCJyYW5kb21cIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2g6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VNb2RlbCgpO1xuICB9LFxuICBcInBhbmVsYmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2UudHMiLCJpbXBvcnQgeyBCYXNlLCBJUXVlc3Rpb24sIEV2ZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICBwdWJsaWMgaHRtbFRlbXBsYXRlOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB3aWRnZXRKc29uOiBhbnkpIHtcbiAgICB0aGlzLmh0bWxUZW1wbGF0ZSA9IHdpZGdldEpzb24uaHRtbFRlbXBsYXRlID8gd2lkZ2V0SnNvbi5odG1sVGVtcGxhdGUgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBlbDogYW55KSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi5hZnRlclJlbmRlcikgdGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKHF1ZXN0aW9uLCBlbCk7XG4gIH1cbiAgcHVibGljIHdpbGxVbm1vdW50KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGVsOiBhbnkpIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLndpbGxVbm1vdW50KSB0aGlzLndpZGdldEpzb24ud2lsbFVubW91bnQocXVlc3Rpb24sIGVsKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24uZ2V0RGlzcGxheVZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5nZXREaXNwbGF5VmFsdWUocXVlc3Rpb24pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBpc0ZpdChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmlzRml0KVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0ZpdChxdWVzdGlvbik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzTGlicmFyeUxvYWRlZCgpICYmIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzTGlicmFyeUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpID09IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0RlZmF1bHRSZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEN1c3RvbVdpZGdldENvbGxlY3Rpb24ge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBDdXN0b21XaWRnZXRDb2xsZWN0aW9uID0gbmV3IEN1c3RvbVdpZGdldENvbGxlY3Rpb24oKTtcbiAgcHJpdmF0ZSB3aWRnZXRzVmFsdWVzOiBBcnJheTxRdWVzdGlvbkN1c3RvbVdpZGdldD4gPSBbXTtcbiAgcHJpdmF0ZSB3aWRnZXRzQWN0aXZhdGVkQnkgPSB7fTtcblxuICBwdWJsaWMgb25DdXN0b21XaWRnZXRBZGRlZDogRXZlbnQ8XG4gICAgKGN1c3RvbVdpZGdldDogUXVlc3Rpb25DdXN0b21XaWRnZXQpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LCBhbnk+KCk7XG5cbiAgcHVibGljIGdldCB3aWRnZXRzKCk6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiB7XG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0c1ZhbHVlcztcbiAgfVxuICBwdWJsaWMgYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldEpzb246IGFueSwgYWN0aXZhdGVkQnk6IHN0cmluZyA9IFwicHJvcGVydHlcIikge1xuICAgIHZhciBuYW1lID0gd2lkZ2V0SnNvbi5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgbmFtZSA9IFwid2lkZ2V0X1wiICsgdGhpcy53aWRnZXRzLmxlbmd0aCArIDE7XG4gICAgfVxuICAgIHZhciBjdXN0b21XaWRnZXQgPSBuZXcgUXVlc3Rpb25DdXN0b21XaWRnZXQobmFtZSwgd2lkZ2V0SnNvbik7XG4gICAgdGhpcy53aWRnZXRzVmFsdWVzLnB1c2goY3VzdG9tV2lkZ2V0KTtcbiAgICAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbbmFtZV0gPSBhY3RpdmF0ZWRCeTtcbiAgICBjdXN0b21XaWRnZXQuYWN0aXZhdGVkQnlDaGFuZ2VkKGFjdGl2YXRlZEJ5KTtcbiAgICB0aGlzLm9uQ3VzdG9tV2lkZ2V0QWRkZWQuZmlyZShjdXN0b21XaWRnZXQsIG51bGwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3YXkgdGhlIGN1c3RvbSB3aWdldCBpcyBhY3RpdmF0ZWQuIEl0IGNhbiBiZSBhY3RpdmF0ZWQgYnkgYSBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIGJ5IG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLlxuICAgKiBAcGFyYW0gd2lkZ2V0TmFtZSB0aGUgY3VzdG9tIHdpZGdldCBuYW1lXG4gICAqIEBzZWUgc2V0QWN0aXZhdGVkQnlcbiAgICovXG4gIHB1YmxpYyBnZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcInByb3BlcnR5XCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdheSB0aGUgY3VzdG9tIHdpZ2V0IGlzIGFjdGl2YXRlZC4gVGhlIGFjdGl2YXRpb24gdHlwZXMgYXJlOiBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLiBBIGN1c3RvbSB3aWdldCBtYXkgc3VwcG9ydCBhbGwgb3Igb25seSBzb21lIG9mIHRoaXMgYWN0aXZhdGlvbiB0eXBlcy5cbiAgICogQHBhcmFtIHdpZGdldE5hbWVcbiAgICogQHBhcmFtIGFjdGl2YXRlZEJ5IHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSB2YXJpYW50czogXCJwcm9wZXJ0eVwiLCBcInR5cGVcIiBhbmQgXCJjdXN0b210eXBlXCJcbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcsIGFjdGl2YXRlZEJ5OiBzdHJpbmcpIHtcbiAgICBpZiAoIXdpZGdldE5hbWUgfHwgIWFjdGl2YXRlZEJ5KSByZXR1cm47XG4gICAgdmFyIHdpZGdldCA9IHRoaXMuZ2V0Q3VzdG9tV2lkZ2V0QnlOYW1lKHdpZGdldE5hbWUpO1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG4gICAgKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgd2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMud2lkZ2V0c1ZhbHVlcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBnZXRDdXN0b21XaWRnZXRCeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMud2lkZ2V0c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldChxdWVzdGlvbjogSVF1ZXN0aW9uKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRzVmFsdWVzW2ldLmlzRml0KHF1ZXN0aW9uKSkgcmV0dXJuIHRoaXMud2lkZ2V0c1ZhbHVlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbkN1c3RvbVdpZGdldHMudHMiLCJpbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBkcm9wZG93biBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiLCB0aGlzKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBvcHRpb25zIGNhcHRpb24gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRha2VuIGZyb20gbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3B0aW9uc0NhcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImRyb3Bkb3duXCIsXG4gIFt7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Ecm9wZG93bk1vZGVsKFwiXCIpO1xuICB9LFxuICBcInNlbGVjdGJhc2VcIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEVtYWlsVmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYW4gaW5wdXQgdGV4dCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uVGV4dE1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlucHV0VHlwZVwiLCBcInRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbnB1dFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsID09IFwiZGF0ZXRpbWVfbG9jYWxcIikgdmFsID0gXCJkYXRldGltZS1sb2NhbFwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlucHV0VHlwZVwiLCB2YWwudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiZcbiAgICAgIHZhbCA9PT0gXCJlbWFpbFwiICYmXG4gICAgICAhdGhpcy52YWxpZGF0b3JzLnNvbWUodiA9PiB2LmdldFR5cGUoKSA9PT0gXCJlbWFpbHZhbGlkYXRvclwiKVxuICAgICkge1xuICAgICAgdGhpcy52YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltaW0gdGV4dCBsZW5ndGguIElmIGl0IGlzIC0xLCBkZWZhdWwgdmFsdWUsIHRoZW4gdGhlIHN1cnZleSBtYXhUZXh0TGVuZ3RoIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogSWYgaXQgaXMgMCwgdGhlbiB0aGUgdmFsdWUgaXMgdW5saW1pdGVkXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRNYXhMZW5ndGgoKTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRNYXhMZW5ndGgoXG4gICAgICB0aGlzLm1heExlbmd0aCxcbiAgICAgIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkubWF4VGV4dExlbmd0aCA6IC0xXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgaW5wdXQgc2l6ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgMjUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgdmFsKTtcbiAgfVxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlKTtcbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNvcnJlY3RWYWx1ZVR5cGUobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PSBcIm51bWJlclwiIHx8IHRoaXMuaW5wdXRUeXBlID09IFwicmFuZ2VcIikge1xuICAgICAgcmV0dXJuIHRoaXMuaXNOdW1iZXIobmV3VmFsdWUpID8gcGFyc2VGbG9hdChuZXdWYWx1ZSkgOiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gbmV3VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc051bWJlcih2YWx1ZTphbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJ0ZXh0XCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImlucHV0VHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJ0ZXh0XCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIFwiY29sb3JcIixcbiAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgIFwiZGF0ZXRpbWVcIixcbiAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwibW9udGhcIixcbiAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICBcInJhbmdlXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGV4dFwiLFxuICAgICAgICBcInRpbWVcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ3ZWVrXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaXplOm51bWJlclwiLCBkZWZhdWx0OiAyNSB9LFxuICAgIHsgbmFtZTogXCJtYXhMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgSnNvbk1ldGFkYXRhIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleSxcbiAgU3VydmV5RWxlbWVudCxcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvcixcbiAgSVF1ZXN0aW9uLFxuICBJUGFuZWwsXG4gIElFbGVtZW50LFxuICBJQ29uZGl0aW9uUnVubmVyLFxuICBJUGFnZSxcbiAgU3VydmV5RXJyb3IsXG4gIEV2ZW50LFxuICBJU3VydmV5RWxlbWVudFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJU3VydmV5VHJpZ2dlck93bmVyLCBTdXJ2ZXlUcmlnZ2VyIH0gZnJvbSBcIi4vdHJpZ2dlclwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBkeFN1cnZleVNlcnZpY2UgfSBmcm9tIFwiLi9keFN1cnZleVNlcnZpY2VcIjtcbmltcG9ydCB7IEpzb25FcnJvciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTdHlsZXNNYW5hZ2VyIH0gZnJvbSBcIi4vc3R5bGVzbWFuYWdlclwiO1xuaW1wb3J0IHsgU3VydmV5VGltZXIgfSBmcm9tIFwiLi9zdXJ2ZXl0aW1lclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsQmFzZSB9IGZyb20gXCIuL3BhbmVsXCI7XG5cbi8qKlxuICogU3VydmV5IG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VydmV5LiBQYWdlcywgUXVlc3Rpb25zLCBmbG93IGxvZ2ljIGFuZCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlNb2RlbCBleHRlbmRzIEJhc2VcbiAgaW1wbGVtZW50c1xuICAgIElTdXJ2ZXksXG4gICAgSVN1cnZleURhdGEsXG4gICAgSVN1cnZleUltcGwsXG4gICAgSVN1cnZleVRyaWdnZXJPd25lcixcbiAgICBJTG9jYWxpemFibGVPd25lciB7XG4gIFtpbmRleDogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBzdHlsZXNNYW5hZ2VyID0gbmV3IFN0eWxlc01hbmFnZXIoKTtcbiAgcHVibGljIHN0YXRpYyBwbGF0Zm9ybTogc3RyaW5nID0gXCJ1bmtub3duXCI7XG4gIHB1YmxpYyBnZXQgcGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleU1vZGVsLnBsYXRmb3JtO1xuICB9XG4gIC8qKlxuICAgKiBZb3UgbWF5IHNob3cgY29tbWVudHMgaW5wdXQgZm9yIHRoZSBtb3N0IG9mIHF1ZXN0aW9ucy4gVGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgY29tbWVudCBpbnB1dCB3aWxsIGJlIHNhdmVkIGFzICdxdWVzdGlvbiBuYW1lJyArICdjb21tZW50UHJlZml4Jy5cbiAgICogQHNlZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQmFzZS5jb21tZW50UHJlZml4O1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudFByZWZpeCh2YWw6IHN0cmluZykge1xuICAgIEJhc2UuY29tbWVudFByZWZpeCA9IHZhbDtcbiAgfVxuXG4gIHByaXZhdGUgcGFnZXNWYWx1ZTogQXJyYXk8UGFnZU1vZGVsPjtcbiAgcHJpdmF0ZSB0cmlnZ2Vyc1ZhbHVlOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPjtcbiAgcHJpdmF0ZSBnZXQgY3VycmVudFBhZ2VWYWx1ZSgpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW50UGFnZVZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHByaXZhdGUgc2V0IGN1cnJlbnRQYWdlVmFsdWUodmFsOiBQYWdlTW9kZWwpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjdXJyZW50UGFnZVZhbHVlXCIsIHZhbCk7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlc0hhc2g6IEhhc2hUYWJsZTxhbnk+ID0ge307XG4gIHByaXZhdGUgdmFyaWFibGVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcblxuICBwcml2YXRlIGxvY2FsZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBjb21wbGV0ZWRTdGF0ZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHByaXZhdGUgaXNUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHN1cnZleSBpcyBjb21wbGV0ZWQgYW5kIG9uQ29tcGxldGUgZXZlbnQgaXMgZmlyZWQuIFlvdSBtYXkgcHJldmVudCB0aGUgc3VydmV5IGZyb20gY29tcGxldGluZyBieSBzZXR0aW5nIG9wdGlvbnMuYWxsb3dDb21wbGV0ZSB0byBmYWxzZVxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvd0NvbXBsZXRlIHNldCBpdCBmYWxzZSB0byBwcmV2ZW50IHRoZSBzdXJ2ZXkgZnJvbSBjb21wbGV0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBvbkNvbXBsZXRpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBhIHVzZXIgY2xpY2sgb24gJ0NvbXBsZXRlJyBidXR0b24gYW5kIGZpbmlzaGVkIHRoZSBzdXJ2ZXkuIFlvdSBtYXkgdXNlIGl0IHRvIHNlbmQgdGhlIGRhdGEgdG8geW91ciB3ZWIgc2VydmVyLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5zaG93RGF0YVNhdmluZyh0ZXh0KSBjYWxsIHRoaXMgbWV0aG9kIHRvIHNob3cgdGhhdCB0aGUgc3VydmV5IGlzIHNhdmluZyB0aGUgZGF0YSBvbiB5b3VyIHNlcnZlci4gVGhlIHRleHQgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNob3cgeW91ciBtZXNzYWdlIGluc3RlYWQgb2YgZGVmYXVsdC5cbiAgICogPGJyLz4gb3B0aW9ucy5zaG93RGF0YVNhdmluZ0Vycm9yKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZXJlIGlzIGFuIGVycm9yIG9uIHNhdmluZyB0aGUgZGF0YSBvbiB5b3VyIHNlcnZlci4gSWYgeW91IHdhbnQgdG8gc2hvdyBhIGN1c3RvbSBlcnJvciwgdXNlIGFuIG9wdGlvbmFsIHRleHQgcGFyYW1ldGVyLlxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nU3VjY2Vzcyh0ZXh0KSBjYWxsIHRoaXMgbWV0aG9kIHRvIHNob3cgdGhhdCB0aGUgZGF0YSB3ZXJlIHN1Y2Nlc3NmdWwgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAgICogPGJyLz4gb3B0aW9ucy5zaG93RGF0YVNhdmluZ0NsZWFyIGNhbGwgdGhpcyBtZXRob2QgdG8gaGlkZSB0aGUgdGV4dCBhYm91dCB0aGUgc2F2aW5nIHByb2dyZXNzLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBjbGVhckludmlzaWJsZVZhbHVlc1xuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICovXG4gIHB1YmxpYyBvbkNvbXBsZXRlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgdGhlIHN1cnZleSBjaGFuZ2VkIGl0J3Mgc3RhdGUgZnJvbSBcInN0YXJ0aW5nXCIgdG8gXCJydW5uaW5nXCIuIFRoZSBcInN0YXJ0aW5nXCIgc3RhdGUgbWVhbnMgdGhhdCBzdXJ2ZXkgc2hvd3MgdGhlIHN0YXJ0ZWQgcGFnZS5cbiAgICogVGhlIGZpcnN0UGFnZUlzU3RhcnRlZCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHRvIHRoZSB0cnVlLCBpZiB5b3Ugd2FudCB0byBoYXZlIHRoZSBzdGFydGVkIHBhZ2UgaW4geW91ciBzdXJ2ZXkuIFRoZSBlbmQtdXNlciBzaG91bGQgY2xpY2sgb24gdGhlIFwiU3RhcnRcIiBidXR0b24gdG8gc3RhcnQgdGhlIHN1cnZleS5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0ZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNsaWNraW5nICdOZXh0JyBwYWdlIGlmIHNlbmRSZXN1bHRPblBhZ2VOZXh0IGlzIHNldCB0byB0cnVlLiBZb3UgbWF5IHVzZSBpdCB0byBzYXZlIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgZm9yIGV4YW1wbGUsIGlmIHlvdXIgc3VydmV5IGlzIGxhcmdlIGVub3VnaC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIEBzZWUgc2VuZFJlc3VsdE9uUGFnZU5leHRcbiAgICovXG4gIHB1YmxpYyBvblBhcnRpYWxTZW5kOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgYW5vdGhlciBwYWdlIGJlY29tZXMgdGhlIGN1cnJlbnQuIFR5cGljYWxseSBpdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNsaWNrIG9uICdOZXh0JyBvciAnUHJldicgYnV0dG9ucy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbi5vbGRDdXJyZW50UGFnZSB0aGUgcHJldmlvdXMgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgKiA8YnIvPiBvcHRpb24ubmV3Q3VycmVudFBhZ2UgYSBuZXcgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgKiA8YnIvPiBvcHRpb24uYWxsb3dDaGFuZ2luZyBzZXQgaXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBwYWdlIGNoYW5naW5nLiBJdCBpcyB0cnVlIGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZU5vXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBwcmV2UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBvbkN1cnJlbnRQYWdlQ2hhbmdlZFxuICAgKiovXG4gIHB1YmxpYyBvbkN1cnJlbnRQYWdlQ2hhbmdpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGFub3RoZXIgcGFnZSBiZWNvbWVzIHRoZSBjdXJyZW50LiBUeXBpY2FsbHkgaXQgaGFwcGVucyB3aGVuIGEgdXNlciBjbGljayBvbiAnTmV4dCcgb3IgJ1ByZXYnIGJ1dHRvbnMuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb24ub2xkQ3VycmVudFBhZ2UgdGhlIHByZXZpb3VzIGN1cnJlbnQvYWN0aXZlIHBhZ2VcbiAgICogPGJyLz4gb3B0aW9uLm5ld0N1cnJlbnRQYWdlIGEgbmV3IGN1cnJlbnQvYWN0aXZlIHBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG9uQ3VycmVudFBhZ2VDaGFuZ2luZ1xuICAgKi9cbiAgcHVibGljIG9uQ3VycmVudFBhZ2VDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBjaGFuZ2VkLiBJdCBjYW4gYmUgZG9uZSB2aWEgVUkgYnkgYSB1c2VyIG9yIHByb2dyYW1tYXRpY2FsbHkgb24gY2FsbGluZyBzZXRWYWx1ZSBtZXRob2QuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgdGhlIHZhbHVlIG5hbWUgdGhhdCBoYXMgYmVpbmcgY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gd2hpY2ggcXVlc3Rpb24ubmFtZSBlcXVhbHMgdG8gdGhlIHZhbHVlIG5hbWUuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHF1ZXN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyB0YWtlbi4gSWYgdGhlcmUgaXMgbm8gc3VjaCBxdWVzdGlvbnMsIHRoZSBvcHRpb25zLnF1ZXN0aW9uIGlzIG51bGwuXG4gICAqIDxici8+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+IG9wdGlvbnMudmFsdWUgdGhlIGN1cnJlbnQgcXVlc3Rpb24gdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvciBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIG9uVmFsaWRhdGVRdWVzdGlvbjogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gdmFsaWRhdGUgZGF0YSBvbiB5b3VyIHNlcnZlci5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuZGF0YSB0aGUgdmFsdWVzIG9mIGFsbCBub24tZW1wdHkgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UuIFlvdSBjYW4gZ2V0IGEgcXVlc3Rpb24gdmFsdWUgYXMgb3B0aW9ucy5kYXRhW1wibXlRdWVzdGlvbk5hbWVcIl0uXG4gICAqIDxici8+IG9wdGlvbnMuZXJyb3JzIHNldCB5b3VyIGVycm9ycyB0byB0aGlzIG9iamVjdCBhczogb3B0aW9ucy5lcnJvcnNbXCJteVF1ZXN0aW9uTmFtZVwiXSA9IFwiRXJyb3IgdGV4dFwiOy4gSXQgd2lsbCBiZSBzaG93biBhcyBhIHF1ZXN0aW9uIGVycm9yLlxuICAgKiA8YnIvPiBvcHRpb25zLmNvbXBsZXRlKCkgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHRlbGwgc3VydmV5IHRoYXQgeW91ciBzZXJ2ZXIgY2FsbGJhY2sgaGFzIGJlZW4gcHJvY2Vzc2VkLlxuICAgKiBAc2VlIG9uVmFsaWRhdGVRdWVzdGlvblxuICAgKiBAc2VlIG9uVmFsaWRhdGVQYW5lbFxuICAgKi9cbiAgcHVibGljIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnM6IGFueSA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIG1vZGlmeSB0aGUgaHRtbCBiZWZvcmUgcmVuZGVyaW5nLCBmb3IgZXhhbXBsZSBodG1sIG9uICdUaGFuayB5b3UnIHBhZ2UuIE9wdGlvbnMgaGFzIG9uZSBwYXJhbWV0ZXI6IG9wdGlvbnMuaHRtbC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuaHRtbCBhbiBodG1sIHRoYXQgeW91IG1heSBjaGFuZ2UgYmVmb3JlIHRleHQgcHJvY2Vzc2luZyBhbmQgdGhlbiByZW5kZXJpbmcuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAqIEBzZWUgUXVlc3Rpb25IdG1sTW9kZWwuaHRtbFxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB2YWxpZGF0aW5nIGEgcGFuZWwuIFNldCB5b3VyIGVycm9yIHRvIG9wdGlvbnMuZXJyb3IgYW5kIHN1cnZleSB3aWxsIHNob3cgdGhlIGVycm9yIGZvciB0aGUgcGFuZWwgYW5kIGJsb2NrIGNvbXBsZXRpbmcgdGhlIHN1cnZleSBvciBnb2luZyB0byB0aGUgbmV4dCBwYWdlLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcGFuZWwgbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLmVycm9yIGFuIGVycm9yIHN0cmluZy4gSXQgaXMgZW1wdHkgYnkgZGVmYXVsdC5cbiAgICogQHNlZSBvblZhbGlkYXRlUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlUGFuZWw6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIG9uUHJvY2Vzc0h0bWw6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNoYW5nZSB0aGUgcXVlc3Rpb24gdGl0bGUgaW4gdGhlIGNvZGUuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnRpdGxlIGEgY2FsY3VhbHRlZCBxdWVzdGlvbiB0aXRsZSwgYmFzZWQgb24gcXVlc3Rpb24gdGl0bGUsIG5hbWUsIGlzUmVxdWlyZWQsIHZpc2libGVJbmRleCAobm8pXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25HZXRRdWVzdGlvblRpdGxlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBwcm9jZXNzIHRoZSBtYXJrZG93biB0ZXh0LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50IFN1cnZleUpTIGVsZW1lbnQgd2hlcmUgdGhlIHN0cmluZyBpcyBnb2luZyB0byBiZSByZW5kZXJlZC4gSXQgaXMgYSBxdWVzdGlvbiwgcGFuZWwsIHBhZ2Ugb3Igc3VydmV5XG4gICAqIDxici8+IG9wdGlvbnMudGV4dCBhIHRleHQgdGhhdCBpcyBnb2luZyB0byBiZSByZW5kZXJlZFxuICAgKiA8YnIvPiBvcHRpb25zLmh0bWwgYSBodG1sLiBJdCBpcyBudWxsIGJ5IGRlZmF1bHQuIFNldCBpdCBhbmQgc3VydmV5IHdpbGwgdXNlIGl0IGluc3RlYWQgb2Ygb3B0aW9ucy50ZXh0XG4gICAqL1xuICBwdWJsaWMgb25UZXh0TWFya2Rvd246IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBmaXJlcyB3aGVuIGl0IGdldCByZXNwb25zZSBmcm9tIHRoZSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBvbiBzYXZpbmcgc3VydmV5IHJlc3VsdHMuIFVzZSBpdCB0byBmaW5kIG91dCBpZiB0aGUgcmVzdWx0cyBoYXZlIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuc3VjY2VzcyBpdCBpcyB0cnVlIGlmIHRoZSByZXN1bHRzIHdlcmUgc2VudCB0byB0aGUgc2VydmljZSBzdWNjZXNzZnVsXG4gICAqIDxici8+IG9wdGlvbnMucmVzcG9uc2UgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgb25TZW5kUmVzdWx0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0IHJlc3VsdHMgYWZ0ZXIgY2FsbGluZyB0aGUgZ2V0UmVzdWx0IG1ldGhvZC4gSXQgcmV0dXJucyBhIHNpbXBsZSBhbmFseXRpYyBmcm9tIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5zdWNjZXNzIGl0IGlzIHRydWUgaWYgdGhlIHJlc3VsdHMgd2VyZSBnb3QgZnJvbSB0aGUgc2VydmljZSBzdWNjZXNzZnVsXG4gICAqIDxici8+IG9wdGlvbnMuZGF0YSB0aGUgb2JqZWN0IHtBbnN3ZXJzQ291bnQsIFF1ZXN0aW9uUmVzdWx0IDoge30gfS4gQW5zd2Vyc0NvdW50IGlzIHRoZSBudW1iZXIgb2YgcG9zdGVkIHN1cnZleSByZXN1bHRzLiBRdWVzdGlvblJlc3VsdCBpcyBhbiBvYmplY3Qgd2l0aCBhbGwgcG9zc2libGUgdW5pcXVlIGFuc3dlcnMgdG8gdGhlIHF1ZXN0aW9uIGFuZCBudW1iZXIgb2YgdGhlc2UgYW5zd2Vycy5cbiAgICogPGJyLz4gb3B0aW9ucy5kYXRhTGlzdCBhbiBhcnJheSBvZiBvYmplY3RzIHtuYW1lLCB2YWx1ZX0sIHdoZXJlICduYW1lJyBpcyBhbiB1bmlxdWUgdmFsdWUvYW5zd2VyIHRvIHRoZSBxdWVzdGlvbiBhbmQgdmFsdWUgaXMgYSBudW1iZXIvY291bnQgb2Ygc3VjaCBhbnN3ZXJzLlxuICAgKiA8YnIvPiBvcHRpb25zLnJlc3BvbnNlIHRoZSBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHNlZSBnZXRSZXN1bHRcbiAgICovXG4gIHB1YmxpYyBvbkdldFJlc3VsdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHVwbG9hZGluZyB0aGUgZmlsZSBpbiBRdWVzdGlvbkZpbGUuIFlvdSBtYXkgdXNlIGl0IHRvIGNoYW5nZSB0aGUgZmlsZSBuYW1lIG9yIHRlbGxzIHRoZSBsaWJyYXJ5IGRvIG5vdCBhY2NlcHQgdGhlIGZpbGUuIFRoZXJlIGFyZSB0aHJlZSBwcm9wZXJ0aWVzIGluIG9wdGlvbnM6IG9wdGlvbnMubmFtZSwgb3B0aW9ucy5maWxlIGFuZCBvcHRpb25zLmFjY2VwdC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIG5hbWU6IG5hbWUsIGZpbGU6IGZpbGUsIGFjY2VwdDogYWNjZXB0XG4gICAqIDxici8+IG5hbWUgdGhlIGZpbGUgbmFtZVxuICAgKiA8YnIvPiBmaWxlIHRoZSBKYXZhc2NyaXB0IEZpbGUgb2JqZWN0XG4gICAqIDxici8+IGFjY2VwdCBhIGJvb2xlYW4gdmFsdWUsIHRydWUgYnkgZGVmYXVsdC4gU2V0IGl0IHRvIGZhbHNlIHRvIGRlbnkgdGhpcyBmaWxlIHRvIHVwbG9hZFxuICAgKiBAc2VlIHVwbG9hZEZpbGVcbiAgICovXG4gIHB1YmxpYyBvblVwbG9hZEZpbGVzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+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+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGZvciBldmVyeSBjZWxsIGNyZWF0ZWQgaW4gTWF0cml4IER5bWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zLlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLmNlbGwgLSB0aGUgbWF0cml4IGNlbGxcbiAgICogPGJyLz4gb3B0aW9ucy5jZWxsUXVlc3Rpb24gLSB0aGUgcXVlc3Rpb24vZWRpdG9yIGluIHRoZSBjZWxsLiBZb3UgbWF5IGN1c3RvbWl6ZSBpdCwgY2hhbmdlIGl0J3MgcHJvcGVydGllcywgbGlrZSBjaG9pY2VzIG9yIHZpc2libGUuXG4gICAqIDxici8+IG9wdGlvbnMucm93VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcm93LiBUbyBhY2Nlc3MgdGhlIHZhbHVlIG9mIHBhdGljdWxhciBjb2x1bW4gdXNlOiBvcHRpb25zLnJvd1ZhbHVlW1wiY29sdW1uVmFsdWVcIl1cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bW4gLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMucm93IC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0XG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbENyZWF0ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBmb3IgZXZlcnkgY2VsbCBhZnRlciBpcyBoYXMgYmVlbiByZW5kZXJlZCBpbiBET00uXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgbWF0cml4IHF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuY2VsbCAtIHRoZSBtYXRyaXggY2VsbFxuICAgKiA8YnIvPiBvcHRpb25zLmNlbGxRdWVzdGlvbiAtIHRoZSBxdWVzdGlvbi9lZGl0b3IgaW4gdGhlIGNlbGwuXG4gICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYSBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIGNlbGxRdWVzdGlvbiBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bW4gLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICogQHNlZSBvbk1hdHJpeENlbGxDcmVhdGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEFmdGVyQ2VsbFJlbmRlcjogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gY2VsbCB2YWx1ZSBpcyBjaGFuZ2VkIGluIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucy5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIG5ldyB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gTWF0cml4IER5bWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zIHZhbGlkYXRlIHRoZSBjZWxsIHZhbHVlLlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLmNvbHVtTmFtZSAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy52YWx1ZSAtIGEgY2VsbCB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbGlkYXRlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHBhbmVsIGluIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcGFuZWwgcXVlc3Rpb24uXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwucGFuZWxzXG4gICAqL1xuICBwdWJsaWMgb25EeW5hbWljUGFuZWxBZGRlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcGFuZWwgZnJvbSBQYW5lbCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHBhbmVsIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsSW5kZXggYSByZW1vdmVkIHBhbmVsIGluZGV4LlxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLnBhbmVsc1xuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsUmVtb3ZlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGV2ZXJ5IHNlY29uZCBpZiB0aGUgbWV0aG9kIHN0YXJ0VGltZXIgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSB0aW1lU3BlbnRcbiAgICogQHNlZSBQYWdlLnRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBkaXNwbGF5aW5nIGEgbmV3IGluZm9ybWF0aW9uIGluIHRoZSBUaW1lciBQYW5lbC4gVXNlIGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiA8YnIvPiBvcHRpb25zLnRleHQgLSB0aGUgdGltZXIgcGFuZWwgaW5mbyB0ZXh0LlxuICAgKi9cbiAgcHVibGljIG9uVGltZXJQYW5lbEluZm9UZXh0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBpdGVtIHZhbHVlIGlzIGNoYW5nZWQgaW4gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBwYW5lbCBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIC0gdGhlIGR5bmFtaWMgcGFuZWwgaXRlbVxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgLSB0aGUgaXRlbSBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIG5ldyB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLml0ZW1JbmRleCAtIHRoZSBwYW5lbCBpdGVtIGluZGV4XG4gICAqIDxici8+IG9wdGlvbnMuaXRlbVZhbHVlIC0gdGhlIHBhbmVsIGl0ZW0gb2JqZWN0XG4gICAqIEBzZWUgb25EeW5hbWljUGFuZWxBZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGRlZmluZSwgaWYgdGhlIGFuc3dlciBvbiB0aGUgcXVlc3Rpb24gaXMgY29ycmVjdCBvciBub3QuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gb24gd2hpY2ggeW91IGhhdmUgdG8gZGVjaWRlIGlmIHRoZSBhbnN3ZXIgaXMgY29ycmVjdCBvciBub3QuXG4gICAqIDxici8+IG9wdGlvbnMucmVzdWx0IHJldHVybiB0cnVlLCBpZiB0aGUgYW5zd2VyIGlzIGNvcnJlY3Qgb3IgZmFsc2UgaWYgdGhlIGFuc3dlciBpcyBub3QgY29ycmVjdC4gVXNlIHF1ZXN0aW9ucyB2YWx1ZSBhbmQgY29ycmVjdEFuc3dlciBwcm9wZXJ0aWVzIHRvIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICogQHNlZSBRdWVzdGlvbi52YWx1ZVxuICAgKiBAc2VlIFF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJcbiAgICovXG4gIHB1YmxpYyBvbklzQW5zd2VyQ29ycmVjdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY29udHJvbCBkcmFnJmRyb3Agb3BlcmF0aW9ucyBkdXJpbmcgZGVzaWduIG1vZGUuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvdyBzZXQgaXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBkcmFnZ2luZy5cbiAgICogPGJyLz4gb3B0aW9ucy50YXJnZXQgYSB0YXJnZXQgZWxlbWVudCB0aGF0IGlzIGRyYWdnaW5nLlxuICAgKiA8YnIvPiBvcHRpb25zLnNvdXJjZSBhIHNvdXJjZSBlbGVtZW50LiBJdCBjYW4gYmUgbnVsbCwgaWYgaXQgaXMgYSBuZXcgZWxlbWVudCwgZHJhZ2dpbmcgZnJvbSB0b29sYm94LlxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudCBhIHBhZ2Ugb3IgcGFuZWwgd2hlcmUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuXG4gICAqIDxici8+IG9wdGlvbnMuaW5zZXJ0QmVmb3JlIGFuIGVsZW1lbnQgYmVmb3JlIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBkcmFnZ2luZy4gSXQgY2FuIGJlIG51bGwgaWYgcGFyZW50IGNvbnRhaW5lciAocGFnZSBvciBwYW5lbCkgaXMgZW1wdHkgb3IgZHJhZ2dpbmcgYW4gZWxlbWVudCB1bmRlciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjb250YWluZXIuXG4gICAqIDxici8+IG9wdGlvbnMuaW5zZXJ0QWZ0ZXIgYW4gZWxlbWVudCBhZnRlciB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuIEl0IGNhbiBiZSBudWxsIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGVsZW1lbnQgdG8gdGhlIHRvcCBvZiB0aGUgcGFyZW50IGNvbnRhaW5lci5cbiAgICogQHNlZSBzZXREZXNpZ25Nb2RlXG4gICAqIEBzZWUgaXNEZXNpZ25Nb2RlXG4gICAqL1xuICBwdWJsaWMgb25EcmFnRHJvcEFsbG93OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlcnJvcnMgb24gbG9hZGluZyBzdXJ2ZXkganNvbi4gSWYgdGhlIGxpc3QgaXMgZW1wdHkgYWZ0ZXIgbG9hZGluZyBhIGpzb24gdGhlbiB0aGUganNvbiBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBubyBlcnJvcnMgaW4gaXQuXG4gICAqIEBzZWUgSnNvbkVycm9yXG4gICAqL1xuICBwdWJsaWMganNvbkVycm9yczogQXJyYXk8SnNvbkVycm9yPiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkQmVmb3JlSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdGhpcywgdHJ1ZSk7XG5cbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbihcbiAgICAgIHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlXG4gICAgKSB7XG4gICAgICBzZWxmLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5wYWdlc1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInBhZ2VzXCIsIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgIHNlbGYuZG9PblBhZ2VBZGRlZCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2Vyc1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInRyaWdnZXJzXCIsIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgIHZhbHVlLnNldE93bmVyKHNlbGYpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIixcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRmlyc3RQYWdlSXNTdGFydGVkQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImlzU2luZ2xlUGFnZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Jc1NpbmdsZVBhZ2VDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbkJlZm9yZUNyZWF0aW5nKCk7XG4gICAgaWYgKGpzb25PYmopIHtcbiAgICAgIGlmICh0eXBlb2YganNvbk9iaiA9PT0gXCJzdHJpbmdcIiB8fCBqc29uT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25PYmogYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChqc29uT2JqICYmIGpzb25PYmouY2xpZW50SWQpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGpzb25PYmouY2xpZW50SWQ7XG4gICAgICB9XG4gICAgICB0aGlzLnNldEpzb25PYmplY3QoanNvbk9iaik7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXlJZCkge1xuICAgICAgICB0aGlzLmxvYWRTdXJ2ZXlGcm9tU2VydmljZSh0aGlzLnN1cnZleUlkLCB0aGlzLmNsaWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzdXJ2ZXlcIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgYWxsIHBhZ2VzIGluIHRoZSBzdXJ2ZXksIGluY2x1ZGluZyBpbnZpc2libGUuXG4gICAqIEBzZWUgUGFnZU1vZGVsXG4gICAqIEBzZWUgdmlzaWJsZVBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHRyaWdnZXJzIGluIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgU3VydmV5VHJpZ2dlclxuICAgKi9cbiAgcHVibGljIGdldCB0cmlnZ2VycygpOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcnNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRyaWdnZXJzKHZhbDogQXJyYXk8U3VydmV5VHJpZ2dlcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhdXRvbWF0aWNhbGx5IGxvYWQgc3VydmV5IEpzb24gZnJvbSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogQHNlZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdXJ2ZXlJZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleUlkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSB0aGUgZGF0YSBpbnRvIHRoZSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgc3VydmV5U2hvd0RhdGFTYXZpbmdcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5UG9zdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVBvc3RJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleVBvc3RJZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVBvc3RJZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSBhcyBpbmRlbnRpZmljYXRvciBmb3IgYSB1c2VyLCBmb3IgZXhhbXBsZSBlLW1haWwgb3IgdW5pcXVlIGN1c3RvbWVyIGlkIGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiBJZiB5b3UgYXJlIGxvYWRpbmcgc3VydmV5IG9yIHBvc3Rpbmcgc3VydmV5IHJlc3VsdHMgIGZyb20vdG8gW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UsIHRoZW4gdGhlIGxpYnJhcnkgZG8gbm90IGFsbG93IHRvIHJ1biB0aGUgc2FtZSBzdXJ2ZXkgdGhlIHNlY29uZCB0aW1lLiBPbiB0aGUgc2Vjb25kIHJ1biwgdGhlIHVzZXIgd2lsbCBzZWUgdGhlICdUaGFuayB5b3UnIHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsaWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsaWVudElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xpZW50SWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGllbnRJZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGVtcHR5LCBiZWZvcmUgc3RhcnRpbmcgdG8gcnVuIHRoZSBzdXJ2ZXksIHRoZSBsaWJyYXJ5IGNoZWNrZXMgaWYgdGhlIGNvb2tpZSB3aXRoIHRoaXMgbmFtZSBleGlzdHMuIElmIGl0IGlzIHRydWUsIHRoZSBzdXJ2ZXkgZ29lcyB0byBjb21wbGV0ZSBtb2RlIGFuZCBhbiB1c2VyIHNlZXMgdGhlICdUaGFuayB5b3UnIHBhZ2UuIE9uIGNvbXBsZXRpbmcgdGhlIHN1cnZleSB0aGUgY29va2llIHdpdGggdGhpcyBuYW1lIGlzIGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvb2tpZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29va2llTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvb2tpZU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzYXZlIHJlc3VsdHMgb24gY29tcGxldGluZyBldmVyeSBwYWdlLiBvblBhcnRpYWxTZW5kIGV2ZW50IGlzIGZpcmVkLlxuICAgKiBAc2VlIG9uUGFydGlhbFNlbmRcbiAgICogQHNlZSBjbGllbnRJZFxuICAgKi9cbiAgcHVibGljIGdldCBzZW5kUmVzdWx0T25QYWdlTmV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VuZFJlc3VsdE9uUGFnZU5leHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gc2hvdyB0aGUgcHJvZ3Jlc3Mgb24gc2F2aW5nL3NlbmRpbmcgZGF0YSBpbnRvIHRoZSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleVNob3dEYXRhU2F2aW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIE9uIHNob3dpbmcgdGhlIG5leHQgb3IgcHJldmlvdXMgcGFnZSwgYSBmaXJzdCBpbnB1dCBpcyBmb2N1c2VkLCBpZiB0aGUgcHJvcGVydHkgc2V0IHRvIHRydWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpY1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgdG8gaGlkZSAnUHJldicsICdOZXh0JyBhbmQgJ0NvbXBsZXRlJyBidXR0b25zLiBJdCBtYWtlcyBzZW5zZSBpZiB5b3UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIGN1c3RvbSBuYXZpZ2F0aW9uIG9yIGhhdmUganVzdCBvbmUgcGFnZSBvciBvbiBzZXR0aW5nIGdvTmV4dFBhZ2VBdXRvbWF0aWMgcHJvcGVydHkuXG4gICAqIEBzZWUgZ29OZXh0UGFnZUF1dG9tYXRpY1xuICAgKiBAc2VlIHNob3dQcmV2QnV0dG9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dOYXZpZ2F0aW9uQnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgJ1ByZXYnIHRvIGRpc2FibGUgZm9yIGVuZC11c2VycyBnbyBiYWNrIHRvIHRoZWlyIGFuc3dlcnMuXG4gICAqIEBzZWUgc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldkJ1dHRvblwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcmV2QnV0dG9uKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2QnV0dG9uXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSBoaWRlIHN1cnZleSB0aXRsZS5cbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93VGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dUaXRsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIHRvIGhpZGUgcGFnZSB0aXRsZXMuXG4gICAqIEBzZWUgUGFnZU1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQYWdlVGl0bGVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQYWdlVGl0bGVzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlVGl0bGVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIE9uIGZpbmlzaGluZyB0aGUgc3VydmV5IHRoZSAnVGhhbmsgeW91JywgcGFnZSBvbiBjb21wbGV0ZSwgaXMgc2hvd24uIFNldCB0aGUgcHJvcGVydHkgdG8gZmFsc2UsIHRvIGhpZGUgdGhlICdUaGFuayB5b3UnIHBhZ2UuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0NvbXBsZXRlZFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dDb21wbGV0ZWRQYWdlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0NvbXBsZXRlZFBhZ2UodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQSBjaGFyL3N0cmluZyB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgaW4gdGhlIHRpdGxlIHJlcXVpcmVkIHF1ZXN0aW9ucy5cbiAgICogQHNlZSBRdWVzdGlvbi50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIFwiKlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkVGV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleCBpcyAxLiBZb3UgbWF5IHN0YXJ0IGl0IGZyb20gMTAwIG9yIGZyb20gJ0EnLCBieSBzZXR0aW5nIDEwMCBvciAnQScgdG8gdGhpcyBwcm9wZXJ0eS5cbiAgICogQHNlZSBRdWVzdGlvbi50aXRsZVxuICAgKiBAc2VlIHJlcXVpcmVkVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvblN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25TdGFydEluZGV4XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25TdGFydEluZGV4KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25TdGFydEluZGV4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgKiBAc2VlIGNvbW1lbnRQcmVmaXhcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgbWF4aW11bSBsZW5ndGggZm9yIHF1ZXN0aW9ucyBsaWtlIHRleHQgYW5kIGNvbW1lbnQsIGluY2x1ZGluZyBtYXRyaXggY2VsbCBxdWVzdGlvbnMuXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAsIGl0IGlzIHVubGltaXRlZCBtYXhMZW5ndGggLSA1MjQyODggY2hhcmFjdGVyczogaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2F0dF9pbnB1dF9tYXhsZW5ndGguYXNwXG4gICAqIEBzZWUgbWF4T3RoZXJzTGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRleHRMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGV4dExlbmd0aFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFRleHRMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUZXh0TGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIGZvciBxdWVzdGlvbiBjb21tZW50cyBhbmQgb3RoZXJzXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAsIGl0IGlzIHVubGltaXRlZCBtYXhMZW5ndGggLSA1MjQyODggY2hhcmFjdGVyczogaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2F0dF9pbnB1dF9tYXhsZW5ndGguYXNwXG4gICAqIEBzZWUgUXVlc3Rpb24uaGFzQ29tbWVudFxuICAgKiBAc2VlIFF1ZXN0aW9uLmhhc090aGVyXG4gICAqIEBzZWUgbWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhPdGhlcnNMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4T3RoZXJzTGVuZ3RoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4T3RoZXJzTGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4T3RoZXJzTGVuZ3RoXCIsIHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGl0IHRvIHRoZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgaWYgeW91IHdhbnQgdG8gZ28gdG8gdGhlIG5leHQgcGFnZSB3aXRob3V0IHByZXNzaW5nICdOZXh0JyBidXR0b24gd2hlbiBhbGwgcXVlc3Rpb25zIGFyZSBhbndlcmVkLlxuICAgKiB0cnVlIC0gZ28gbmV4dCBwYWdlIGFuZCBzdWJtaXQgYXV0b21hdGljYWxseVxuICAgKiBcImF1dG9nb25leHRcIiAtIGdvIG5leHQgcGFnZSBhdXRvbWF0aWNhbGx5IGJ1dCBkbyBub3Qgc3VibWl0XG4gICAqIGZhbHNlIC0gZG8gbm90IGdvIG5leHQgcGFnZSBhbmQgbm90IHN1Ym1pdCBhdXRvbWF0aWNhbGx5XG4gICAqIEBzZWUgc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbiB8IFwiYXV0b2dvbmV4dFwiIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBnb05leHRQYWdlQXV0b21hdGljKHZhbDogYm9vbGVhbiB8IFwiYXV0b2dvbmV4dFwiKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhpcyBwcm9wZXJ0eSBmcm9tICdvbk5leHRQYWdlJyB0byAnb25WYWx1ZUNoYW5nZWQnIHRvIGNoZWNrIGVyb3JycyBvbiBldmVyeSBxdWVzdGlvbiB2YWx1ZSBjaGFuZ2luZy5cbiAgICogQnkgZGVmYXVsdCwgbGlicmFyeSBjaGVja3MgZXJyb3JzIG9uIGNoYW5naW5nIGN1cnJlbnQgcGFnZSB0byB0aGUgbmV4dCBvciBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrRXJyb3JzTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaGVja0Vycm9yc01vZGVcIiwgXCJvbk5leHRQYWdlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hlY2tFcnJvcnNNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hlY2tFcnJvcnNNb2RlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byAnbm9uZScgdG8gaW5jbHVkZSB0aGUgaW52aXNpYmxlIHZhbHVlcyBpbnRvIHRoZSBzdXJ2ZXkgZGF0YS5cbiAgICogPC9icj4gU2V0IGl0IHRvICdvbkhpZGRlbicgdG8gY2xlYXIgdGhlIHF1ZXN0aW9uIHZhbHVlIHdoZW4gaXQgYmVjb21lcyBpbnZpc2libGUuXG4gICAqIDwvYnI+IExlYXZlIGl0IGVxdWFscyB0byAnb25Db21wbGV0ZScsIHRvIHJlbW92ZSBmcm9tIGRhdGEgcHJvcGVydHkgdmFsdWVzIG9mIGludmlzaWJsZSBxdWVzdGlvbnMgb24gc3VydmV5IGNvbXBsZXRlLiBJbiB0aGlzIGNhc2UsIHRoZSBpbnZpc2libGUgcXVlc3Rpb25zIHdpbGwgbm90IGJlIHN0b3JlZCBvbiB0aGUgc2VydmVyLlxuICAgKiA8L2JyPiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnb25Db21wbGV0ZScuXG4gICAqIEBzZWUgUXVlc3Rpb24udmlzaWJsZVxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY2xlYXJJbnZpc2libGVWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgXCJvbkNvbXBsZXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xlYXJJbnZpc2libGVWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcIm9uQ29tcGxldGVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJub25lXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbGwgcXVlc3Rpb24gdmFsdWVzIGZyb20gdGhlIHN1cnZleSwgdGhhdCBlbmQtdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyLlxuICAgKiBGb3IgZXhhbXBsZSB0aGUgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0cyBpbiBhIHJhZGlncm91cC9kcm9wZG93bi9jaGVja2JveCBjaG9pY2VzIG9yIG1hdHJpeCByb3dzL2NvbHVtbnMuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2xlYXIgdmFsdWVzIGZvciBpbnZpc2libGUgcXVlc3Rpb25zIG9yIHZhbHVlcyB0aGF0IGRvZXNuJ3QgYXNzb2NpYXRlZCB3aXRoIHF1ZXN0aW9ucy5cbiAgICogSW4gZmFjdCB0aGlzIGZ1bmN0aW9uIGp1c3QgY2FsbCBjbGVhckluY29ycmVjdFZhbHVlcyBmdW5jdGlvbiBvZiBhbGwgcXVlc3Rpb25zIGluIHRoZSBzdXJ2ZXJ5XG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICogQHNlZSBQYWdlLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqIEBzZWUgUGFuZWwuY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlIGl0IHRvIGNoYW5nZSB0aGUgc3VydmV5IGxvY2FsZS4gQnkgZGVmYXVsdCBpdCBpcyBlbXB0eSwgJ2VuJy4gWW91IG1heSBzZXQgaXQgdG8gJ2RlJyAtIGdlcm1hbiwgJ2ZyJyAtIGZyZW5jaCBhbmQgc28gb24uIFRoZSBsaWJyYXJ5IGhhcyBidWlsdC1pbiBsb2NhbGl6YXRpb24gZm9yIHNldmVyYWwgbGFuZ3VhZ2VzLiBUaGUgbGlicmFyeSBoYXMgYSBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0IGFzIHdlbGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhY2hlID0gdW5kZWZpbmVkO1xuICAgIHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdmFsdWU7XG4gICAgdGhpcy5sb2NhbGVWYWx1ZSA9IHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvY2FsZVwiLCB0aGlzLmxvY2FsZVZhbHVlKTtcbiAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2NhbGVDaGFuZ2VkKCkge31cbiAgLy9JTG9jYWxpemFibGVPd25lclxuICBnZXRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5TWFya2Rvd25IdG1sKHRoaXMsIHRleHQpO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NUZXh0KHRleHQsIHRydWUpO1xuICB9XG4gIGdldExvY1N0cmluZyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0cik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgdGhhdCByZW5kZXJzIHdoZW4gdGhlcmUgaXMgbm8gYW55IHZpc2libGUgcGFnZSBhbmQgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCB0aGF0IHNob3dzIG9uIGNvbXBsZXRlZCAoJ1RoYW5rIHlvdScpIHBhZ2UuIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBzaG93Q29tcGxldGVkUGFnZVxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBjb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVkSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlZEh0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVkSHRtbFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlZEh0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgdGhhdCBzaG93cyBpZiB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgY2xpZW50SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRCZWZvcmVIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NDb21wbGV0ZWRCZWZvcmVIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlZEJlZm9yZUh0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gbG9hZGluZyBzdXJ2ZXkgSnNvbiBmcm9tIHRoZSBkeHN1cnZleS5jb20gc2VydmljZS5cbiAgICogQHNlZSBzdXJ2ZXlJZFxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBsb2FkaW5nSHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9hZGluZ0h0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibG9hZGluZ0h0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NMb2FkaW5nSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ1N0YXJ0JyBidXR0b24uIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogVGhlIHN0YXJ0IGJ1dHRvbiBpcyBzaG93biBvbiB0aGUgc3RhcnRlZCBwYWdlLiBZb3UgaGF2ZSB0byBzZXQgZmlyc3RQYWdlSXNTdGFydGVkIHByb3BlcnR5IHRvIHRydWUsIHRvIGhhdmUgdGhlIHN0YXJ0ZWQgcGFnZS5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRTdXJ2ZXlUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJzdGFydFN1cnZleVwiLFxuICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXCJzdGFydFN1cnZleVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRTdXJ2ZXlUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInN0YXJ0U3VydmV5XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jU3RhcnRTdXJ2ZXlUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBBIHRleHQgdGhhdCByZW5kZXJzIG9uIHRoZSAnUHJldicgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZVByZXZcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGFnZVByZXZUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2VQcmV2VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYWdlUHJldlwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1BhZ2VQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ05leHQnIGJ1dHRvbi4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlTmV4dFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhZ2VOZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlTmV4dFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NQYWdlTmV4dFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgdGV4dCB0aGF0IHJlbmRlcnMgb24gdGhlICdDb21wbGV0ZScgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tcGxldGVcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlVGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZVwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZVwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZW1wbGF0ZSBmb3IgYSBxdWVzdGlvbiB0aXRsZS5cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FjaGU6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHF1ZXN0aW9uIHRpdGxlIHRlbXBsYXRlXG4gICAqIEBzZWUgcXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqIEBzZWUgUXVlc3Rpb25Nb2RlbC50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FjaGUgPSB0aGlzLmxvY1F1ZXN0aW9uVGl0bGVUZW1wbGF0ZS50ZXh0T3JIdG1sO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZTtcbiAgfVxuICBnZXQgbG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuICBnZXRVcGRhdGVkUXVlc3Rpb25UaXRsZShxdWVzdGlvbjogSVF1ZXN0aW9uLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uVGl0bGUuaXNFbXB0eSkgcmV0dXJuIHRpdGxlO1xuICAgIHZhciBvcHRpb25zID0geyBxdWVzdGlvbjogcXVlc3Rpb24sIHRpdGxlOiB0aXRsZSB9O1xuICAgIHRoaXMub25HZXRRdWVzdGlvblRpdGxlLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIHR1cm4gb2ZmIHRoZSBudW1iZXJpbmcgb24gcGFnZXMgdGl0bGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UGFnZU51bWJlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlTnVtYmVyc1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UGFnZU51bWJlcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuc2hvd1BhZ2VOdW1iZXJzKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VOdW1iZXJzXCIsIHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwib2ZmXCIgdG8gdHVybiBvZmYgdGhlIG51bWJlcmluZyBvbiBxdWVzdGlvbnMgdGl0bGVzIG9yIFwib25wYWdlXCIgdG8gc3RhcnQgbnVtYmVyaW5nIG9uIGV2ZXJ5IHBhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwib25cIi5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1F1ZXN0aW9uTnVtYmVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIFwib25cIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gXCJvbnBhZ2VcIiA/IFwib25QYWdlXCIgOiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJ0b3BcIiB0byBzaG93IHRoZSBwcm9ncmVzcyBiYXIgb24gdGhlIGJvdHRvbSBvciB0byBcImJvdHRvbVwiIHRvIHNob3cgaXQgb24gdGhlIGJvdHRvbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1Byb2dyZXNzQmFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiLCBcIm9mZlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcm9ncmVzc0JhcihuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1Byb2dyZXNzQmFyXCIsIG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwidG9wXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90dG9tXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0L2h0bWwgdGhhdCByZW5kZXJzIGFzIHN1cnZleSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAnYm90dG9tJyBvciAnbGVmdCcgdG8gc2hvdyBxdWVzdGlvbiB0aXRsZSB1bmRlciB0aGUgcXVlc3Rpb24gb3Igb24gdGhlIGxlZnQuXG4gICAqIDxici8+PGI+Tm90ZTo8L2I+IFNvbWUgcXVlc3Rpb25zLCBmb3IgZXhhbXBsZSBtYXRyaXhlcywgZG8gbm90IHN1cHBvcnQgJ2xlZnQnIHZhbHVlLiBUaGUgdGl0bGUgZm9yIHRoZW0gd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCBcInRvcFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAnYm90dG9tJyB0byBzaG93IHF1ZXN0aW9uIGVycm9yKHMpIHVuZGVyIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCBcInRvcFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uRXJyb3JMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBtb2RlIHRvICdkaXNwbGF5JyB0byBtYWtlIHRoZSBzdXJ2ZXkgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnZWRpdCcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibW9kZVwiLCBcImVkaXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlID09IHRoaXMubW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSAhPSBcImVkaXRcIiAmJiB2YWx1ZSAhPSBcImRpc3BsYXlcIikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIHN1cnZleSByZXN1bHRzL2RhdGEuIFlvdSBtYXkgc2V0IGl0IGRpcmVjdGx5IGFzIHsgJ3F1ZXN0aW9uIG5hbWUnOiBxdWVzdGlvblZhbHVlLCAuLi4gfVxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgZ2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcbiAgICAgIHZhciBkYXRhVmFsdWUgPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgaWYgKGRhdGFWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZGF0YVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbiAgcHJpdmF0ZSBnZXRRdWVzdGlvblBsYWluRGF0YShxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICB2YXIgcmVzdWx0OiBBcnJheTxhbnk+ID0gW107XG4gICAgdmFyIHZhbHVlID0gcXVlc3Rpb24udmFsdWU7XG4gICAgdmFyIGRpc3BsYXlWYWx1ZSA9IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIGRpc3BsYXlWYWx1ZSA9IChkaXNwbGF5VmFsdWUgfHwgXCJcIilcbiAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAubWFwKCh2OiBzdHJpbmcpID0+IHYudHJpbSgpKTtcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHF1ZXN0aW9uLnZhbHVlKTtcbiAgICB2YXIgZGlzcGxheVZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSk7XG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICB2YWx1ZUtleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIHRpdGxlOiBpc0FycmF5ID8gXCJcIiA6IGRpc3BsYXlWYWx1ZUtleXNbaW5kZXhdLFxuICAgICAgICB2YWx1ZTogdmFsdWVba2V5XSxcbiAgICAgICAgZGlzcGxheVZhbHVlOiBkaXNwbGF5VmFsdWVbZGlzcGxheVZhbHVlS2V5c1tpbmRleF1dLFxuICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgaXNOb2RlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBzdXJ2ZXkgcmVzdWx0IGRhdGEgYXMgYW4gYXJyYXkgb2YgcGxhaW4gb2JqZWN0czogd2l0aCBxdWVzdGlvbiB0aXRsZSwgbmFtZSwgdmFsdWUgYW5kIGRpc3BsYXlWYWx1ZS5cbiAgICogRm9yIGNvbXBsZXggcXVlc3Rpb25zIChsaWtlIG1hdHJpeCwgZXRjLikgaXNOb2RlIGZsYWcgaXMgc2V0IHRvIHRydWUgYW5kIGRhdGEgY29udGFpbnMgYXJyYXkgb2YgbmVzdGVkIG9iamVjdHMgKHJvd3MpXG4gICAqIHNldCBvcHRpb25zLmluY2x1ZGVFbXB0eSB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBza2lwIGVtcHR5IGFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczogeyBpbmNsdWRlRW1wdHk/OiBib29sZWFuIH0gPSB7IGluY2x1ZGVFbXB0eTogdHJ1ZSB9XG4gICkge1xuICAgIHZhciByZXN1bHQ6IEFycmF5PGFueT4gPSBbXTtcbiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICB0aGlzLmdldEFsbFF1ZXN0aW9ucygpLmZvckVhY2gocXVlc3Rpb24gPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUVtcHR5IHx8IGRhdGFbcXVlc3Rpb24ubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcmVzdWx0SXRlbTogYW55ID0ge1xuICAgICAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICAgICAgdGl0bGU6ICg8UXVlc3Rpb24+cXVlc3Rpb24pLnRpdGxlLFxuICAgICAgICAgIHZhbHVlOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6ICg8UXVlc3Rpb24+cXVlc3Rpb24pLmRpc3BsYXlWYWx1ZSxcbiAgICAgICAgICBpc05vZGU6XG4gICAgICAgICAgICB0eXBlb2YgcXVlc3Rpb24udmFsdWUgPT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShxdWVzdGlvbi52YWx1ZSksXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQucHVzaChyZXN1bHRJdGVtKTtcbiAgICAgICAgaWYgKHJlc3VsdEl0ZW0uaXNOb2RlKSB7XG4gICAgICAgICAgcmVzdWx0SXRlbS5kYXRhID0gdGhpcy5nZXRRdWVzdGlvblBsYWluRGF0YSg8UXVlc3Rpb24+cXVlc3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblZlcnNpb24gPSAwO1xuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHZhciB2YWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhcmlhYmxlc0hhc2gpIHZhbHVlc1trZXldID0gdGhpcy52YXJpYWJsZXNIYXNoW2tleV07XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzSGFzaClcbiAgICAgIHZhbHVlc1trZXldID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICB2YWx1ZXNbXCJjb25kaXRpb25WZXJzaW9uXCJdID0gKyt0aGlzLmNvbmRpdGlvblZlcnNpb247XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBnZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4geyBzdXJ2ZXk6IHRoaXMgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlc0hhc2ggPSB7fTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5LCBkYXRhW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModGhpcy52YWx1ZXNIYXNoLCBmYWxzZSk7XG4gICAgdGhpcy5ub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQoXCJcIik7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgcHVibGljIGdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB2YWx1ZXNIYXNoW2tleV07XG4gIH1cbiAgcHVibGljIHNldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHZhbHVlc0hhc2hba2V5XSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBkZWxldGVEYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdmFsdWVzSGFzaFtrZXldO1xuICB9XG4gIC8vIHByb3RlY3RlZCBpdGVyYXRlRGF0YVZhbHVlc0hhc2goZnVuYzogKGhhc2g6IGFueSwga2V5OiBhbnkpID0+IHZvaWQpIHtcbiAgLy8gICB2YXIga2V5czogYW55W10gPSBbXTtcbiAgLy8gICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YWx1ZXNIYXNoKSB7XG4gIC8vICAgICBrZXlzLnB1c2goa2V5KTtcbiAgLy8gICB9XG4gIC8vICAga2V5cy5mb3JFYWNoKGtleSA9PiBmdW5jKHRoaXMudmFsdWVzSGFzaCwga2V5KSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgY29tbWVudHMgZnJvbSB0aGUgZGF0YS5cbiAgICogQHNlZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRzKCk6IGFueSB7XG4gICAgdmFyIHJlc3VsdDogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzSGFzaCkge1xuICAgICAgaWYgKGtleS5pbmRleE9mKHRoaXMuY29tbWVudFByZWZpeCkgPiAwKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2aXNpYmxlIHBhZ2VzLiBJZiBhbGwgcGFnZXMgYXJlIHZpc2libGUgdGhlbiBpdCBpcyB0aGUgc2FtZSBhcyBwYWdlcyBwcm9wZXJ0eS5cbiAgICogQHNlZSBwYWdlc1xuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlXG4gICAqIEBzZWUgUGFnZU1vZGVsLnZpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlUGFnZXMoKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGhpcy5wYWdlcztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PFBhZ2VNb2RlbD4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZSkge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnBhZ2VzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIGFueSBwYWdlIGluIHRoZSBzdXJ2ZXkuIFRoZSBzdXJ2ZXkgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoID09IDA7XG4gIH1cbiAgLyoqXG4gICAqIGRlcHJpY2F0ZWQsIG1pc3NwZWxsaW5nLCB1c2UgcGFnZUNvdW50IHByb3BlcnR5XG4gICAqL1xuICBnZXQgUGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvdW50O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdXJ2ZXkgcGFnZXMgY291bnQuXG4gICAqIEBzZWUgdmlzaWJsZVBhZ2VDb3VudFxuICAgKiBAc2VlIHBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IHZpc2libGUgcGFnZXMgY291bnRcbiAgICogQHNlZSBwYWdlQ291bnRcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0ZWQgUGFnZS4gZmlyc3RQYWdlSXNTdGFydGVkIHByb3BlcnR5IHNob3VsZCBiZSBlcXVhbHMgdG8gdHJ1ZVxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKi9cbiAgcHVibGljIGdldCBzdGFydGVkUGFnZSgpOiBQYWdlTW9kZWwge1xuICAgIHZhciBwYWdlID1cbiAgICAgIHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkICYmIHRoaXMucGFnZXMubGVuZ3RoID4gMCA/IHRoaXMucGFnZXNbMF0gOiBudWxsO1xuICAgIGlmICghIXBhZ2UpIHtcbiAgICAgIHBhZ2Uub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgcGFnZS4gSWYgc3VydmV5IGlzIHJlbmRyZWQgdGhlbiBpdCBpcyBhIHBhZ2UgdGhhdCBhIHVzZXIgY2FuIHNlZS9lZGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFnZSgpOiBhbnkge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICh2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIDwgMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBudWxsICYmIHZQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVudFBhZ2UodmFsdWU6IGFueSkge1xuICAgIHZhciBuZXdQYWdlID0gdGhpcy5nZXRQYWdlQnlPYmplY3QodmFsdWUpO1xuICAgIGlmICghIXZhbHVlICYmICFuZXdQYWdlKSByZXR1cm47XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIGlmIChuZXdQYWdlICE9IG51bGwgJiYgdlBhZ2VzLmluZGV4T2YobmV3UGFnZSkgPCAwKSByZXR1cm47XG4gICAgaWYgKG5ld1BhZ2UgPT0gdGhpcy5jdXJyZW50UGFnZVZhbHVlKSByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jdXJyZW50UGFnZVZhbHVlO1xuICAgIGlmICghdGhpcy5jdXJyZW50UGFnZUNoYW5naW5nKG5ld1BhZ2UsIG9sZFZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICghIW5ld1BhZ2UpIHtcbiAgICAgIG5ld1BhZ2Uub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPSBuZXdQYWdlO1xuICAgIGlmICghIW5ld1BhZ2UpIHtcbiAgICAgIG5ld1BhZ2UudXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xuICAgICAgbmV3UGFnZS5zZXRXYXNTaG93bih0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMuY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1BhZ2UsIG9sZFZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGdldFBhZ2VCeU9iamVjdCh2YWx1ZTogYW55KTogUGFnZU1vZGVsIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodmFsdWUuZ2V0VHlwZSAmJiB2YWx1ZS5nZXRUeXBlKCkgPT0gXCJwYWdlXCIpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5TmFtZShTdHJpbmcodmFsdWUpKTtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgdmFyIGluZGV4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gdlBhZ2VzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdlBhZ2VzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgcGFnZSBpbiB0aGUgdmlzaWJsZSBwYWdlcyBhcnJheS4gSXQgc3RhcnRzIGZyb20gMC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VObygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVudFBhZ2VObyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gdlBhZ2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbdmFsdWVdO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byByYW5kb21pemUgcXVlc3Rpb25zLiBTZXQgaXQgdG8gJ3JhbmRvbScgdG8gcmFuZG9taXplIHF1ZXN0aW9ucywgJ2luaXRpYWwnIHRvIGtlZXAgdGhlbSBpbiB0aGUgc2FtZSBvcmRlci4gWW91IGNhbiByYW5kb21pemUgcXVlc3Rpb25zIG9uIGEgc3BlY2lmaWMgcGFnZS5cbiAgICogQHNlZSBTdXJ2ZXlQYWdlLnF1ZXN0aW9uc09yZGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiLCBcImluaXRpYWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbnB1dCBmb2N1cyB0byB0aGUgZmlyc3QgcXVlc3Rpb24gd2l0aCB0aGUgaW5wdXQuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAocGFnZSkge1xuICAgICAgcGFnZS5zY3JvbGxUb1RvcCgpO1xuICAgICAgcGFnZS5mb2N1c0ZpcnN0UXVlc3Rpb24oKTtcbiAgICB9XG4gIH1cbiAgc2Nyb2xsVG9Ub3BPblBhZ2VDaGFuZ2UoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuO1xuICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICBpZiAodGhpcy5mb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWMpIHtcbiAgICAgIHBhZ2UuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1cnZleSBzdGF0ZTogJ2xvYWRpbmcnIC0gbG9hZGluZyBmcm9tIHRoZSBqc29uLCAnY29tcGxldGVkJyAtIGEgdXNlciBoYXMgY29tcGxldGVkIHRoZSBzdXJ2ZXksXG4gICAqICdzdGFydGluZycgLSB0aGUgc3RhcnRlZCBwYWdlIGlzIHNob3dpbmcsIHJ1bm5pbmcnIC0gYSB1c2VyIGFuc3dlcnMgYSBxdWVzdGlvbnMgcmlnaHQgbm93LCAnZW1wdHknIC0gdGhlcmUgaXMgbm90aGluZyB0byBzaG93IGluIHRoZSBjdXJyZW50IHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHJldHVybiBcImxvYWRpbmdcIjtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCkgcmV0dXJuIFwiY29tcGxldGVkXCI7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWRCZWZvcmUpIHJldHVybiBcImNvbXBsZXRlZGJlZm9yZVwiO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRGVzaWduTW9kZSAmJlxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICB0aGlzLmlzU3RhcnRlZFN0YXRlICYmXG4gICAgICB0aGlzLnN0YXJ0ZWRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuIFwic3RhcnRpbmdcIjtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA/IFwicnVubmluZ1wiIDogXCJlbXB0eVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzQ29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNDb21wbGV0ZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1N0YXJ0ZWRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTdGFydGVkU3RhdGVcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0IGlzU3RhcnRlZFN0YXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU3RhcnRlZFN0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNDb21wbGV0ZWRCZWZvcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQ29tcGxldGVkQmVmb3JlXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0NvbXBsZXRlZEJlZm9yZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZEJlZm9yZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0xvYWRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZFN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZTtcbiAgfVxuICBnZXQgY29tcGxldGVkU3RhdGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVUZXh0VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgaWYgKHZhbHVlID09IFwic2F2aW5nXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJlcnJvclwiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhRXJyb3JcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJzdWNjZXNzXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFTdWNjZXNzXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlID0gdGV4dDtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdGhlIHN1cnZleSBkYXRhIGFuZCBzdGF0ZS4gSWYgdGhlIHN1cnZleSBoYXMgYSAnY29tcGxldGVkJyBzdGF0ZSwgaXQgd2lsbCBoYXZlIGEgJ3J1bm5pbmcnIHN0YXRlLlxuICAgKiBAcGFyYW0gY2xlYXJEYXRhIGNsZWFyIHRoZSBkYXRhXG4gICAqIEBwYXJhbSBnb3RvRmlyc3RQYWdlIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYXMgYSBjdXJyZW50IHBhZ2UuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjbGVhckRhdGE6IGJvb2xlYW4gPSB0cnVlLCBnb3RvRmlyc3RQYWdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChjbGVhckRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnZhcmlhYmxlc0hhc2ggPSB7fTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS50aW1lU3BlbnQgPSAwO1xuICAgICAgdGhpcy5wYWdlc1tpXS5zZXRXYXNTaG93bihmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ29tcGxldGVkQmVmb3JlID0gZmFsc2U7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgaWYgKGdvdG9GaXJzdFBhZ2UgJiYgdGhpcy52aXNpYmxlUGFnZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMudmlzaWJsZVBhZ2VzWzBdO1xuICAgIH1cbiAgICBpZiAoY2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlc1dpdGhEZWZhdWx0cygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgbWVyZ2VWYWx1ZXMoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgIGlmICghZGVzdCB8fCAhc3JjKSByZXR1cm47XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgdmFyIHZhbHVlID0gc3JjW2tleV07XG4gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmICghZGVzdFtrZXldKSBkZXN0W2tleV0gPSB7fTtcbiAgICAgICAgdGhpcy5tZXJnZVZhbHVlcyh2YWx1ZSwgZGVzdFtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZhbHVlc1dpdGhEZWZhdWx0cygpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy5pc0xvYWRpbmcpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhZ2VzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tqXS51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VzdG9tV2lkZ2V0cyhwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICBwYWdlLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2VDaGFuZ2luZyhuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBvbGRDdXJyZW50UGFnZTogb2xkVmFsdWUsXG4gICAgICBuZXdDdXJyZW50UGFnZTogbmV3VmFsdWUsXG4gICAgICBhbGxvd0NoYW5naW5nOiB0cnVlXG4gICAgfTtcbiAgICB0aGlzLm9uQ3VycmVudFBhZ2VDaGFuZ2luZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93Q2hhbmdpbmc7XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRQYWdlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIG9sZEN1cnJlbnRQYWdlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld0N1cnJlbnRQYWdlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9ncmVzcyB0aGF0IGEgdXNlciBtYWRlIGJ5IGFuc3dlcmluZyBvbiB0aGUgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGdldFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgdmFyIGluZGV4ID0gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbChpbmRleCAqIDEwMCAvIHRoaXMudmlzaWJsZVBhZ2VDb3VudCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBuYXZpZ2F0aW9uIGJ1dHRvbnM6ICdQcmV2JywgJ05leHQnIG9yICdDb21wbGV0ZScgYXJlIHNob3duLlxuICAgKi9cbiAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKCFwYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHBhZ2UubmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5ID09IFwic2hvd1wiIHx8XG4gICAgICAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgIT0gXCJoaWRlXCIgJiYgdGhpcy5zaG93TmF2aWdhdGlvbkJ1dHRvbnMpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGVkaXQgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImVkaXRcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGRpc3BsYXkgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGlzcGxheU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImRpc3BsYXlcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGRlc2lnbiBtb2RlLiBJdCBpcyB1c2VkIGJ5IFN1cnZleUpTIEVkaXRvclxuICAgKiBAc2VlIHNldERlc2lnbk1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0Rlc2lnbk1vZGVcIiwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIHNldCB0aGUgc3VydmV5IGludG8gdGhlIGRlc2lnbiBtb2RlLlxuICAgKiBAcGFyYW0gdmFsdWUgdXNlIHRydWUgdG8gc2V0IHRoZSBzdXJ2ZXkgaW50byB0aGUgZGVzaWduIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgc2V0RGVzaWduTW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRGVzaWduTW9kZVwiLCB2YWx1ZSk7XG4gICAgdGhpcy5vbklzU2luZ2xlUGFnZUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gc2hvdyBhbGwgZWxlbWVudHMgaW4gdGhlIHN1cnZleSwgcmVnYXJkbGVzcyB0aGVpciB2aXNpYmlsaXR5LiBJdCBpcyBmYWxzZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93SW52aXNpYmxlRWxlbWVudHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dJbnZpc2libGVFbGVtZW50c1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93SW52aXNpYmxlRWxlbWVudHModmFsOiBib29sZWFuKSB7XG4gICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0ludmlzaWJsZUVsZW1lbnRzXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVBbGxFbGVtZW50c1Zpc2liaWxpdHkodmlzUGFnZXMpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQWxsRWxlbWVudHNWaXNpYmlsaXR5KHZpc1BhZ2VzOiBBcnJheTxQYWdlTW9kZWw+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICBwYWdlLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICBpZiAodmlzUGFnZXMuaW5kZXhPZihwYWdlKSA+IC0xICE9IHBhZ2UuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMub25QYWdlVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB2aXNpYmxlOiBwYWdlLmlzVmlzaWJsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBhcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMuc2hvd0ludmlzaWJsZUVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIGEgdXNlciBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgdGhlIHN1cnZleSBvbiB0aGlzIGJyb3dzZXIgYW5kIHRoZXJlIGlzIGEgY29va2llIGFib3V0IGl0LiBTdXJ2ZXkgZ29lcyB0byAnY29tcGxldGVkJyBzdGF0ZSBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBzZXRDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNDb29raWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZTtcbiAgICByZXR1cm4gY29va2llcyAmJiBjb29raWVzLmluZGV4T2YodGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZVwiKSA+IC0xO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvb2tpZSB3aXRoIGNvb2tpZU5hbWUgaW4gdGhlIGJyb3dzZXIuIEl0IGlzIGRvbmUgYXV0b21hdGljYWxseSBvbiBzdXJ2ZXkgY29tcGxldGUgaWYgY29va2llTmFtZSBpcyBub3QgZW1wdHkuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIGRlbGV0ZUNvb2tpZVxuICAgKi9cbiAgcHVibGljIHNldENvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9XG4gICAgICB0aGlzLmNvb2tpZU5hbWUgKyBcIj10cnVlOyBleHBpcmVzPUZyaSwgMzEgRGVjIDk5OTkgMDowOjAgR01UXCI7XG4gIH1cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgY29va2llIHdpdGggY29va2llTmFtZSBpbiB0aGUgYnJvd3Nlci5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgaGFzQ29va2llXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQ29va2llKCkge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm47XG4gICAgZG9jdW1lbnQuY29va2llID0gdGhpcy5jb29raWVOYW1lICsgXCI9O1wiO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGdvIHRvIHRoZSBuZXh0IHBhZ2UuIEl0IHJldHVybnMgZmFsc2UsIGlmIGl0IGlzIHRoZSBsYXN0IHBhZ2UuIElmIHRoZXJlIGlzIGFuIGVycm9yLCBmb3IgZXhhbXBsZSByZXF1aXJlZCBxdWVzdGlvbiBpcyBlbXB0eSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgYXMgd2VsbC5cbiAgICogQHNlZSBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgbmV4dFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMYXN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5pc0N1cnJlbnRQYWdlSGFzRXJyb3JzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZG9TZXJ2ZXJWYWxpZGF0aW9uKCkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmRvTmV4dFBhZ2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhbnkgZXJyb3Igb24gdGhlIGN1cnJlbnQgcGFnZS4gRm9yIGV4YW1wbGUsIHRoZSByZXF1aXJlZCBxdWVzdGlvbiBpcyBlbXB0eSBvciBhIHF1ZXN0aW9uIHZhbGlkYXRpb24gaXMgZmFpbGVkLlxuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ3VycmVudFBhZ2VIYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UuaGFzRXJyb3JzKHRydWUsIHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGdvIHRvIHRoZSBwcmV2aW91cyBwYWdlLiBJdCByZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGZpcnN0IHBhZ2UgYWxyZWFkeS4gSXQgZG9lc24ndCBwZXJmb3JtIGFueSBjaGVja3MsIHJlcXVpcmVkIHF1ZXN0aW9ucyBjYW4gYmUgZW1wdHkuXG4gICAqIEBzZWUgaXNGaXJzdFBhZ2VcbiAgICovXG4gIHB1YmxpYyBwcmV2UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW2luZGV4IC0gMV07XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gY29tcGxldGUgdGhlIHN1cnZleSwgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmUuIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhlIHBhZ2UuIElmIHRoZXJlIGlzIG5vIGVycm9ycyBvbiB0aGUgcGFnZSwgaXQgY2FsbHMgZG9Db21wbGV0ZSBhbmQgcmV0dXJucyB0cnVlLlxuICAgKiBAc2VlIGlzQ3VycmVudFBhZ2VIYXNFcnJvcnNcbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIGRvQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBjb21wbGV0ZUxhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5pc0N1cnJlbnRQYWdlSGFzRXJyb3JzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZG9TZXJ2ZXJWYWxpZGF0aW9uKCkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmRvQ29tcGxldGUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgaWYgeW91IHdhbnQgdG8gY29tYmluZSBhbGwgeW91ciBwYWdlcyBpbiBvbmUgcGFnZS4gUGFnZXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBwYW5lbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU2luZ2xlUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaW5nbGVQYWdlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzU2luZ2xlUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1NpbmdsZVBhZ2VcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgZmlyc3QgcGFnZSB5b3VyIHN0YXJ0aW5nIHBhZ2UuIFRoZSBlbmQtdXNlciBjb3VsZCBub3QgY29tZWJhY2sgdG8gdGhlIHN0YXJ0IHBhZ2UgYW5kIGl0IGlzIG5vdCBjb3VudCBpbiB0aGUgcHJvZ3Jlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpcnN0UGFnZUlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZmlyc3RQYWdlSXNTdGFydGVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZpcnN0UGFnZUlzU3RhcnRlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgdmFsKTtcbiAgfVxuICBpc1BhZ2VTdGFydGVkKHBhZ2U6IElQYWdlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkICYmIHRoaXMucGFnZXMubGVuZ3RoID4gMCAmJiB0aGlzLnBhZ2VzWzBdID09PSBwYWdlXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25GaXJzdFBhZ2VJc1N0YXJ0ZWRDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIHRoaXMucGFnZVZpc2liaWxpdHlDaGFuZ2VkKHRoaXMucGFnZXNbMF0sICF0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCk7XG4gIH1cbiAgb3JpZ2lvbmFsUGFnZXM6IGFueSA9IG51bGw7XG4gIHByb3RlY3RlZCBvbklzU2luZ2xlUGFnZUNoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2luZ2xlUGFnZSB8fCB0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgaWYgKHRoaXMub3JpZ2lvbmFsUGFnZXMpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgICAgIHRoaXMucGFnZXMuc3BsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdpb25hbFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5wYWdlcy5wdXNoKHRoaXMub3JpZ2lvbmFsUGFnZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9yaWdpb25hbFBhZ2VzID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgICB0aGlzLm9yaWdpb25hbFBhZ2VzID0gdGhpcy5wYWdlcy5zbGljZSgwLCB0aGlzLnBhZ2VzLmxlbmd0aCk7XG4gICAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkID8gMSA6IDA7XG4gICAgICBzdXBlci5zdGFydExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgdmFyIHNpbmdsZVBhZ2UgPSB0aGlzLmNyZWF0ZVNpbmdsZVBhZ2Uoc3RhcnRJbmRleCk7XG4gICAgICB2YXIgZGVsZXRlZExlbiA9IHRoaXMucGFnZXMubGVuZ3RoIC0gc3RhcnRJbmRleDtcbiAgICAgIHRoaXMucGFnZXMuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZWRMZW4sIHNpbmdsZVBhZ2UpO1xuICAgICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICBzaW5nbGVQYWdlLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVNpbmdsZVBhZ2Uoc3RhcnRJbmRleDogbnVtYmVyKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgc2luZ2xlID0gdGhpcy5jcmVhdGVOZXdQYWdlKFwiYWxsXCIpO1xuICAgIHNpbmdsZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgdmFyIHBhbmVsID0gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICAgICAgc2luZ2xlLmFkZFBhbmVsKHBhbmVsKTtcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocGFnZSk7XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbmdsZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGZpcnN0IG9uZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSkgPT0gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd1ByZXZCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdFBhZ2UgfHwgIXRoaXMuc2hvd1ByZXZCdXR0b24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcGFnZSA9IHRoaXMudmlzaWJsZVBhZ2VzW3RoaXMuY3VycmVudFBhZ2VObyAtIDFdO1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSkgPD0gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICByZXR1cm4gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSkgPT0gdlBhZ2VzLmxlbmd0aCAtIDE7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gY29tcGxldGUgdGhlIHN1cnZleS4gSXQgd3JpdGVzIGNvb2tpZSBpZiBjb29raWVOYW1lIHByb3BlcnR5IGlzIG5vdCBlbXB0eSwgc2V0IHRoZSBzdXJ2ZXkgaW50byAnY29tcGxldGVkJyBzdGF0ZSwgZmlyZSBvbkNvbXBsZXRlIGV2ZW50IGFuZCBzZW5kUmVzdWx0IGludG8gW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UgaWYgc3VydmV5UG9zdElkIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4gSXQgZG9lc24ndCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uLCB1bmxpa2UgY29tcGxldGVMYXN0UGFnZSBmdW5jdGlvbi5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKi9cbiAgcHVibGljIGRvQ29tcGxldGUoKSB7XG4gICAgdmFyIG9uQ29tcGxldGluZ09wdGlvbnMgPSB7IGFsbG93Q29tcGxldGU6IHRydWUgfTtcbiAgICB0aGlzLm9uQ29tcGxldGluZy5maXJlKHRoaXMsIG9uQ29tcGxldGluZ09wdGlvbnMpO1xuICAgIGlmICghb25Db21wbGV0aW5nT3B0aW9ucy5hbGxvd0NvbXBsZXRlKSByZXR1cm47XG4gICAgbGV0IHByZXZpb3VzQ29va2llID0gdGhpcy5oYXNDb29raWU7XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLnNldENvbXBsZXRlZCgpO1xuICAgIHRoaXMuY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICB0aGlzLnNldENvb2tpZSgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb25Db21wbGV0ZU9wdGlvbnMgPSB7XG4gICAgICBzaG93RGF0YVNhdmluZzogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzYXZpbmdcIiwgdGV4dCk7XG4gICAgICB9LFxuICAgICAgc2hvd0RhdGFTYXZpbmdFcnJvcjogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ1N1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic3VjY2Vzc1wiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ0NsZWFyOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcIlwiLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25Db21wbGV0ZS5maXJlKHRoaXMsIG9uQ29tcGxldGVPcHRpb25zKTtcbiAgICBpZiAoIXByZXZpb3VzQ29va2llICYmIHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICB0aGlzLnNlbmRSZXN1bHQoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBzdXJ2ZXkuIENoYW5nZSB0aGUgbW9kZSBmcm9tIFwic3RhcnRpbmdcIiB0byBcInJ1bm5pbmdcIi4gWW91IG5lZWQgdG8gY2FsbCBpdCwgaWYgdGhlcmUgaXMgYSBzdGFydGVkIHBhZ2UgaW4geW91ciBzdXJ2ZXksIG90aGVyd2lzZSBpdCBkb2VzIG5vdGhpbmcuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKSB7XG4gICAgaWYgKCF0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICB0aGlzLm9uU3RhcnRlZC5maXJlKHRoaXMsIHt9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhdCB0aGUgY3VycmVudCBtb21lbnQgdGhlIHF1ZXN0aW9uIHZhbHVlcyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSB2YWxpZGF0aW5nIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRpbmdPblNlcnZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYWxpZGF0aW5nT25TZXJ2ZXJcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmlzVmFsaWRhdGluZ09uU2VydmVyKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYWxpZGF0aW5nT25TZXJ2ZXJcIiwgdmFsKTtcbiAgICB0aGlzLm9uSXNWYWxpZGF0aW5nT25TZXJ2ZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXNWYWxpZGF0aW5nT25TZXJ2ZXJDaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIGRvU2VydmVyVmFsaWRhdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zIHx8XG4gICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMuaXNFbXB0eVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5jb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSkgY29udGludWU7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpKTtcbiAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKVxuICAgICAgICBvcHRpb25zLmRhdGFbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodHJ1ZSk7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29tcGxldGVTZXJ2ZXJWYWxpZGF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIoZmFsc2UpO1xuICAgIGlmICghb3B0aW9ucyAmJiAhb3B0aW9ucy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IG9wdGlvbnMuc3VydmV5O1xuICAgIHZhciBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gc2VsZi5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uW1wiZXJyb3JzXCJdKSB7XG4gICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICBxdWVzdGlvbltcImFkZEVycm9yXCJdKG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yc1tuYW1lXSwgdGhpcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzRXJyb3JzKSB7XG4gICAgICBpZiAoc2VsZi5pc0xhc3RQYWdlKSBzZWxmLmRvQ29tcGxldGUoKTtcbiAgICAgIGVsc2Ugc2VsZi5kb05leHRQYWdlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkb05leHRQYWdlKCkge1xuICAgIHRoaXMuY2hlY2tPblBhZ2VUcmlnZ2VycygpO1xuICAgIGlmICh0aGlzLnNlbmRSZXN1bHRPblBhZ2VOZXh0KSB7XG4gICAgICB0aGlzLnNlbmRSZXN1bHQodGhpcy5zdXJ2ZXlQb3N0SWQsIHRoaXMuY2xpZW50SWQsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZWQpIHtcbiAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCArIDFdO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q29tcGxldGVkKCkge1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBodG1sIGZvciBjb21wbGV0ZWQgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWRIdG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbCh0aGlzLmNvbXBsZXRlZEh0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImNvbXBsZXRpbmdTdXJ2ZXlcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGh0bWwgc2hvd2luZyB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5XG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRDb21wbGV0ZWRCZWZvcmVIdG1sKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29tcGxldGVkQmVmb3JlSHRtbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0bWwodGhpcy5jb21wbGV0ZWRCZWZvcmVIdG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0aW5nU3VydmV5QmVmb3JlXCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBodG1sIHRoYXQgc2hvd3Mgb24gbG9hZGluZyB0aGUganNvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkTG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nSHRtbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0bWwodGhpcy5sb2FkaW5nSHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwibG9hZGluZ1N1cnZleVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgcHJvZ3Jlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2dyZXNzVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKGluZGV4LCB2UGFnZXMubGVuZ3RoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWZ0ZXJSZW5kZXJTdXJ2ZXkoaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclN1cnZleS5maXJlKHRoaXMsIHtcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlcyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3Nlc1xuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhbmVsQ3NzQ2xhc3NlcyhwYW5lbDogSVBhbmVsLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUGFuZWxDc3NDbGFzc2VzLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3Nlc1xuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUGFnZShodG1sRWxlbWVudDogYW55KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlclBhZ2UuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhZ2UuZmlyZSh0aGlzLCB7XG4gICAgICBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uLCBodG1sRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUXVlc3Rpb24uZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlclBhbmVsKHBhbmVsOiBJRWxlbWVudCwgaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhbmVsLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgbWF0cml4QmVmb3JlUm93QWRkZWQob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeEJlZm9yZVJvd0FkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4Um93QWRkZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMub25NYXRyaXhSb3dBZGRlZC5maXJlKHRoaXMsIHsgcXVlc3Rpb246IHF1ZXN0aW9uIH0pO1xuICB9XG4gIG1hdHJpeFJvd1JlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcm93SW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcbiAgICB0aGlzLm9uTWF0cml4Um93UmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgIHJvdzogcm93XG4gICAgfSk7XG4gIH1cbiAgbWF0cml4Q2VsbENyZWF0ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsQ3JlYXRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeEFmdGVyQ2VsbFJlbmRlcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeEFmdGVyQ2VsbFJlbmRlci5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeENlbGxWYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4Q2VsbFZhbGlkYXRlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IFN1cnZleUVycm9yIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxWYWxpZGF0ZS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IsIHRoaXMpIDogbnVsbDtcbiAgfVxuICBkeW5hbWljUGFuZWxBZGRlZChxdWVzdGlvbjogSVF1ZXN0aW9uKSB7XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbEFkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24gfSk7XG4gIH1cbiAgZHluYW1pY1BhbmVsUmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBwYW5lbEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm9uRHluYW1pY1BhbmVsUmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHBhbmVsSW5kZXg6IHBhbmVsSW5kZXhcbiAgICB9KTtcbiAgfVxuICBkeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIGRyYWdBbmREcm9wQWxsb3cob3B0aW9uczogYW55KTogYm9vbGVhbiB7XG4gICAgb3B0aW9ucy5hbGxvdyA9IHRydWU7XG4gICAgdGhpcy5vbkRyYWdEcm9wQWxsb3cuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5hbGxvdztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgdGhlIGZpbGUgaW50byBzZXJ2ZXJcbiAgICogQHBhcmFtIG5hbWUgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gZmlsZSB1cGxvYWRpbmcgZmlsZVxuICAgKiBAcGFyYW0gc3RvcmVEYXRhQXNUZXh0IHNldCBpdCB0byB0cnVlIHRvIGVuY29kZSBmaWxlIGNvbnRlbnQgaW50byB0aGUgc3VydmV5IHJlc3VsdHNcbiAgICogQHBhcmFtIHVwbG9hZGluZ0NhbGxiYWNrIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9uIHVwbG9hZGluZyB0aGUgZmlsZVxuICAgKi9cbiAgcHVibGljIHVwbG9hZEZpbGVzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmaWxlczogRmlsZVtdLFxuICAgIHVwbG9hZGluZ0NhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIGlmICh0aGlzLm9uVXBsb2FkRmlsZXMuaXNFbXB0eSkge1xuICAgICAgdXBsb2FkaW5nQ2FsbGJhY2soXCJlcnJvclwiLCBmaWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25VcGxvYWRGaWxlcy5maXJlKHRoaXMsIHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgZmlsZXM6IGZpbGVzIHx8IFtdLFxuICAgICAgICBjYWxsYmFjazogdXBsb2FkaW5nQ2FsbGJhY2tcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHRoaXMudXBsb2FkRmlsZXNDb3JlKG5hbWUsIGZpbGVzLCB1cGxvYWRpbmdDYWxsYmFjayk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBEb3dubG9hZCB0aGUgZmlsZSBmcm9tIHNlcnZlclxuICAgKiBAcGFyYW0gbmFtZSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBmaWxlVmFsdWUgc2luZ2xlIGZpbGUgcXVlc3Rpb24gdmFsdWVcbiAgICogQHBhcmFtIGNhbGxiYWNrIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9uIGRvd25sb2FkaW5nIHRoZSBmaWxlIGFuZCB0aGUgZG93bmxvYWRlZCBmaWxlIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyBkb3dubG9hZEZpbGUoXG4gICAgcXVlc3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgZmlsZVZhbHVlOiBhbnksXG4gICAgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgaWYgKHRoaXMub25Eb3dubG9hZEZpbGUuaXNFbXB0eSkge1xuICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjayhcInN1Y2Nlc3NcIiwgZmlsZVZhbHVlLmNvbnRlbnQgfHwgZmlsZVZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5vbkRvd25sb2FkRmlsZS5maXJlKHRoaXMsIHtcbiAgICAgIG5hbWU6IHF1ZXN0aW9uTmFtZSxcbiAgICAgIGNvbnRlbnQ6IGZpbGVWYWx1ZS5jb250ZW50IHx8IGZpbGVWYWx1ZSxcbiAgICAgIGZpbGVWYWx1ZTogZmlsZVZhbHVlLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIGZpbGVzIGZyb20gc2VydmVyXG4gICAqIEBwYXJhbSBuYW1lIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIGZpbGUgcXVlc3Rpb24gdmFsdWVcbiAgICogQHBhcmFtIGNhbGxiYWNrIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBjbGVhcmluZyBvcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckZpbGVzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgaWYgKHRoaXMub25DbGVhckZpbGVzLmlzRW1wdHkpIHtcbiAgICAgICEhY2FsbGJhY2sgJiYgY2FsbGJhY2soXCJzdWNjZXNzXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5vbkNsZWFyRmlsZXMuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ2hvaWNlc0Zyb21TZXJ2ZXIoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjaG9pY2VzOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgY2hvaWNlczogY2hvaWNlcyxcbiAgICAgIHNlcnZlclJlc3VsdDogc2VydmVyUmVzdWx0XG4gICAgfTtcbiAgICB0aGlzLm9uTG9hZENob2ljZXNGcm9tU2VydmVyLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuY2hvaWNlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXlTZXJ2aWNlKCk6IGR4U3VydmV5U2VydmljZSB7XG4gICAgcmV0dXJuIG5ldyBkeFN1cnZleVNlcnZpY2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBsb2FkRmlsZXNDb3JlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmaWxlczogRmlsZVtdLFxuICAgIHVwbG9hZGluZ0NhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIHZhciByZXNwb25zZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKSB1cGxvYWRpbmdDYWxsYmFjayhcInVwbG9hZGluZ1wiLCBmaWxlKTtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLnNlbmRGaWxlKFxuICAgICAgICB0aGlzLnN1cnZleVBvc3RJZCxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goeyBjb250ZW50OiByZXNwb25zZSwgZmlsZTogZmlsZSB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKSB1cGxvYWRpbmdDYWxsYmFjayhcInN1Y2Nlc3NcIiwgcmVzcG9uc2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKVxuICAgICAgICAgICAgICB1cGxvYWRpbmdDYWxsYmFjayhcImVycm9yXCIsIHsgcmVzcG9uc2U6IHJlc3BvbnNlLCBmaWxlOiBmaWxlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBnZXRQYWdlKGluZGV4OiBudW1iZXIpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzW2luZGV4XTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFnZSBpbnRvIHRoZSBzdXJ2ZXlcbiAgICogQHBhcmFtIHBhZ2VcbiAgICogQHNlZSBhZGROZXdQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAocGFnZSA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5wYWdlcy5wdXNoKHBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwYWdlIGFuZCBhZGRzIGl0IGludG8gdGhlIHN1cnZleS4gR2VuYXJhdGVzIGEgbmV3IG5hbWUgaWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFnZSBuYW1lXG4gICAqIEBzZWUgYWRkUGFnZVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1BhZ2UobmFtZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jcmVhdGVOZXdQYWdlKG5hbWUpO1xuICAgIHRoaXMuYWRkUGFnZShwYWdlKTtcbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBwYWdlIGZyb20gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gcGFnZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciBoYXNoOiBIYXNoVGFibGU8YW55PiA9ICEhY2FzZUluc2Vuc2l0aXZlXG4gICAgICA/IHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZVxuICAgICAgOiB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzO1xuICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgIGlmICghcmVzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzWzBdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIHZhbHVlIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlTmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIGNhc2VJbnNlbnNpdGl2ZVxuICAgKiBAc2VlIGdldFF1ZXN0aW9uQnlOYW1lXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUsIGNhc2VJbnNlbnNpdGl2ZSk7XG4gICAgcmV0dXJuICEhcmVzID8gcmVzWzBdIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIHZhciBoYXNoOiBIYXNoVGFibGU8YW55PiA9ICEhY2FzZUluc2Vuc2l0aXZlXG4gICAgICA/IHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlXG4gICAgICA6IHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcztcbiAgICB2YXIgcmVzID0gaGFzaFt2YWx1ZU5hbWVdO1xuICAgIGlmICghcmVzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIHF1ZXN0aW9ucyBieSB0aGVpciBuYW1lc1xuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGFycmF5IG9mIG5hbWVzXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICovXG4gIHB1YmxpYyBnZXRRdWVzdGlvbnNCeU5hbWVzKFxuICAgIG5hbWVzOiBzdHJpbmdbXSxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb25bXSB7XG4gICAgdmFyIHJlc3VsdDogSVF1ZXN0aW9uW10gPSBbXTtcbiAgICBpZiAoIW5hbWVzKSByZXR1cm4gcmVzdWx0O1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFuYW1lc1tpXSkgY29udGludWU7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWVzW2ldLCBjYXNlSW5zZW5zaXRpdmUpO1xuICAgICAgaWYgKHF1ZXN0aW9uKSByZXN1bHQucHVzaChxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIG9uIHdoaWNoIGFuIGVsZW1lbnQgKHF1ZXN0aW9uIG9yIHBhbmVsKSBpcyBwbGFjZWQuXG4gICAqIEBwYXJhbSBlbGVtZW50IFF1ZXN0aW9uIG9yIFBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUJ5RWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IFBhZ2VNb2RlbCB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgIGlmIChwYWdlLmNvbnRhaW5zRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHBhZ2U7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFnZSBvbiB3aGljaCBhIHF1ZXN0aW9uIGlzIGxvY2F0ZWRcbiAgICogQHBhcmFtIHF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUJ5UXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5RWxlbWVudChxdWVzdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIGJ5IGl0J3MgbmFtZS5cbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNb2RlbCB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnBhZ2VzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMucGFnZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXJ0dW5zIGEgbGlzdCBvZiBwYWdlcyBieSB0aGVpciBuYW1lc1xuICAgKiBAcGFyYW0gbmFtZXMgYSBsaXN0IG9mIHBhZ2VzIG5hbWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZXNCeU5hbWVzKG5hbWVzOiBzdHJpbmdbXSk6IFBhZ2VNb2RlbFtdIHtcbiAgICB2YXIgcmVzdWx0OiBQYWdlTW9kZWxbXSA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5nZXRQYWdlQnlOYW1lKG5hbWVzW2ldKTtcbiAgICAgIGlmIChwYWdlKSByZXN1bHQucHVzaChwYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcXVlc3Rpb25zIGluIHRoZSBzdXJ2ZXlcbiAgICogQHBhcmFtIHZpc2libGVPbmx5IHNldCBpdCB0cnVlLCBpZiB5b3Ugd2FudCB0byBnZXQgb25seSB2aXNpYmxlIHF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFF1ZXN0aW9ucyhcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxJUXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElRdWVzdGlvbj4oKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5hZGRRdWVzdGlvbnNUb0xpc3QoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdmlzaWJsZU9ubHksXG4gICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVpeiBxdWVzdGlvbnMuIEFsbCB2aXNpYmxlIHF1ZXN0aW9ucyB0aGF0IGhhcyBpbnB1dChzKSB3aWRnZXRzLlxuICAgKi9cbiAgcHVibGljIGdldFF1aXpRdWVzdGlvbnMoKTogQXJyYXk8SVF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUXVlc3Rpb24+KCk7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCA/IDEgOiAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYWdlc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tqXTtcbiAgICAgICAgaWYgKHEuaXNWaXNpYmxlICYmIHEuaGFzSW5wdXQpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFuZWwgYnkgaXRzIG5hbWVcbiAgICogQHBhcmFtIG5hbWUgYSBwYW5lbCBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldFBhbmVsQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUGFuZWwge1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLmdldEFsbFBhbmVscygpO1xuICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhbmVsTmFtZSA9IHBhbmVsc1tpXS5uYW1lO1xuICAgICAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkgcGFuZWxOYW1lID0gcGFuZWxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocGFuZWxOYW1lID09IG5hbWUpIHJldHVybiBwYW5lbHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYW5lbHMgaW4gdGhlIHN1cnZleVxuICAgKi9cbiAgcHVibGljIGdldEFsbFBhbmVscyhcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxJUGFuZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElQYW5lbD4oKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5hZGRQYW5lbHNJbnRvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFnZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VNb2RlbChuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgcXVlc3Rpb25PblZhbHVlQ2hhbmdpbmcodmFsdWVOYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgcXVlc3Rpb246IHRoaXMuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZSh2YWx1ZU5hbWUpLFxuICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2luZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKHZhbHVlTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUodmFsdWVOYW1lKTtcbiAgICBpZiAoISFxdWVzdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gcXVlc3Rpb25zW2ldO1xuICAgICAgICBpZiAodGhpcy5jaGVja0Vycm9yc01vZGUgPT0gXCJvblZhbHVlQ2hhbmdlZFwiKSB7XG4gICAgICAgICAgcXVlc3Rpb24uaGFzRXJyb3JzKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9TdXJ2ZXlWYWx1ZUNoYW5nZWQocXVlc3Rpb24sIG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgICBuYW1lOiB2YWx1ZU5hbWUsXG4gICAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgICBxdWVzdGlvbjogbnVsbCxcbiAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZCh2YWx1ZU5hbWUpO1xuICB9XG4gIHByaXZhdGUgbm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPT09IFwicHJvY2Vzc2luZ1wiKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmRvU3VydmV5VmFsdWVDaGFuZ2VkKFxuICAgICAgICBxdWVzdGlvbnNbaV0sXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRvU3VydmV5VmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja09uUGFnZVRyaWdnZXJzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICB2YWx1ZXNbbmFtZV0gPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModmFsdWVzLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8UXVlc3Rpb24+ID0gW107XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24ubmFtZSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaChxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKGtleTogYW55LCBpc09uTmV4dFBhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCB8fCB0aGlzLnRyaWdnZXJzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudHJpZ2dlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy50cmlnZ2Vyc1tpXTtcbiAgICAgIGlmICh0cmlnZ2VyLmlzT25OZXh0UGFnZSA9PSBpc09uTmV4dFBhZ2UpIHtcbiAgICAgICAgdHJpZ2dlci5jaGVja0V4cHJlc3Npb24oa2V5LCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGRvRWxlbWVudHNPbkxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQgfHwgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIpIHJldHVybjtcbiAgICB2YXIgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhZ2VzW2ldLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2VuZCB0aGUgc3VydmV5IHJlc3VsdCBpbnRvIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gcG9zdElkIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIHBvc3RJZFxuICAgKiBAcGFyYW0gY2xpZW50SWQgVHlwaWNhbGx5IGEgY3VzdG9tZXIgZS1tYWlsIG9yIGFuIGlkZW50aWZpY2F0b3JcbiAgICogQHBhcmFtIGlzUGFydGlhbENvbXBsZXRlZCBTZXQgaXQgdG8gdHJ1ZSBpZiB0aGUgc3VydmV5IGlzIG5vdCBjb21wbGV0ZWQgeWV0IGFuZCBpdCBpcyBhbiBpbnRlcm1lZGlhdGUgcmVzdWx0c1xuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgY2xpZW50SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgaXNQYXJ0aWFsQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHJldHVybjtcbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkICYmIHRoaXMub25QYXJ0aWFsU2VuZCkge1xuICAgICAgdGhpcy5vblBhcnRpYWxTZW5kLmZpcmUodGhpcywgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCFwb3N0SWQgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHBvc3RJZCA9IHRoaXMuc3VydmV5UG9zdElkO1xuICAgIH1cbiAgICBpZiAoIXBvc3RJZCkgcmV0dXJuO1xuICAgIGlmIChjbGllbnRJZCkge1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgIH1cbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkICYmICF0aGlzLmNsaWVudElkKSByZXR1cm47XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICB0aGlzLnNldENvbXBsZXRlZFN0YXRlKFwic2F2aW5nXCIsIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5zZW5kUmVzdWx0KFxuICAgICAgcG9zdElkLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgZnVuY3Rpb24oc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkge1xuICAgICAgICBpZiAoc2VsZi5zdXJ2ZXlTaG93RGF0YVNhdmluZykge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic3VjY2Vzc1wiLCBcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcImVycm9yXCIsIFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLm9uU2VuZFJlc3VsdC5maXJlKHNlbGYsIHsgc3VjY2Vzczogc3VjY2VzcywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICAgICAgfSxcbiAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICBpc1BhcnRpYWxDb21wbGV0ZWRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UgYW5kIG9uIGNhbGxiYWNrIGZpcmVzIG9uR2V0UmVzdWx0IGV2ZW50IHdpdGggYWxsIGFuc3dlcnMgdGhhdCB5b3VyIHVzZXJzIG1hZGUgZm9yIGEgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSByZXN1bHRJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSByZXN1bHRJZFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIG9uR2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVzdWx0KHJlc3VsdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRSZXN1bHQocmVzdWx0SWQsIG5hbWUsIGZ1bmN0aW9uKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIGRhdGFMaXN0OiBhbnlbXSxcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApIHtcbiAgICAgIHNlbGYub25HZXRSZXN1bHQuZmlyZShzZWxmLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGRhdGFMaXN0OiBkYXRhTGlzdCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogTG9hZHMgdGhlIHN1cnZleSBKc29uIGZyb20gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLiBJZiBjbGllbnRJZCBpcyBub3QgbnVsbCBhbmQgdXNlciBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgdGhlIHN1cnZleSwgdGhlIHN1cnZleSB3aWxsIGdvIGludG8gXCJjb21wbGV0ZWRiZWZvcmVcIiBzdGF0ZS5cbiAgICogQHBhcmFtIHN1cnZleUlkIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIHN1cnZleUlkXG4gICAqIEBwYXJhbSBjbGllbnRJZCBpbmRlbnRpZmljYXRvciBmb3IgYSB1c2VyLCBmb3IgZXhhbXBsZSBlLW1haWwgb3IgdW5pcXVlIGN1c3RvbWVyIGlkIGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uLlxuICAgKiBAc2VlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVuZElkOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmIChzdXJ2ZXlJZCkge1xuICAgICAgdGhpcy5zdXJ2ZXlJZCA9IHN1cnZleUlkO1xuICAgIH1cbiAgICBpZiAoY2xpZW5kSWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbmRJZDtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCk7XG4gICAgaWYgKGNsaWVuZElkKSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRTdXJ2ZXlKc29uQW5kSXNDb21wbGV0ZWQoXG4gICAgICAgIHRoaXMuc3VydmV5SWQsXG4gICAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICAgIGZ1bmN0aW9uKFxuICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAganNvbjogc3RyaW5nLFxuICAgICAgICAgIGlzQ29tcGxldGVkOiBzdHJpbmcsXG4gICAgICAgICAgcmVzcG9uc2U6IGFueVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxmLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBzZWxmLmlzQ29tcGxldGVkQmVmb3JlID0gaXNDb21wbGV0ZWQgPT0gXCJjb21wbGV0ZWRcIjtcbiAgICAgICAgICAgIHNlbGYubG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLmxvYWRTdXJ2ZXkodGhpcy5zdXJ2ZXlJZCwgZnVuY3Rpb24oXG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgICAgICByZXNwb25zZTogYW55XG4gICAgICApIHtcbiAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uOiBhbnkpIHtcbiAgICBpZiAoIWpzb24pIHJldHVybjtcbiAgICB0aGlzLnNldEpzb25PYmplY3QoanNvbik7XG4gICAgdGhpcy5ub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMub25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKSB7fVxuICBwcm90ZWN0ZWQgb25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKSB7fVxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVJbmRleGVzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8ICEhdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHRoaXMuc2hvd1BhZ2VOdW1iZXJzKTtcbiAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25QYWdlXCIpIHtcbiAgICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2aXNQYWdlc1tpXS5zZXRWaXNpYmxlSW5kZXgoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uXCIgPyAwIDogLTE7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5kZXggKz0gdGhpcy5wYWdlc1tpXS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhZ2VWaXNpYmxlSW5kZXhlcyhzaG93SW5kZXg6IGJvb2xlYW4pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS52aXNpYmxlSW5kZXggPSB0aGlzLnBhZ2VzW2ldLnZpc2libGUgPyBpbmRleCsrIDogLTE7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm51bSA9XG4gICAgICAgIHNob3dJbmRleCAmJiB0aGlzLnBhZ2VzW2ldLnZpc2libGVcbiAgICAgICAgICA/IHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ICsgMVxuICAgICAgICAgIDogLTE7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRKc29uT2JqZWN0KGpzb25PYmo6IGFueSkge1xuICAgIGlmICghanNvbk9iaikgcmV0dXJuO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNDbGVhcigpO1xuICAgIHRoaXMuanNvbkVycm9ycyA9IG51bGw7XG4gICAgdmFyIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgIGpzb25Db252ZXJ0ZXIudG9PYmplY3QoanNvbk9iaiwgdGhpcyk7XG4gICAgaWYgKGpzb25Db252ZXJ0ZXIuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuanNvbkVycm9ycyA9IGpzb25Db252ZXJ0ZXIuZXJyb3JzO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzRW5kTG9hZGluZ0Zyb21Kc29uOiBzdHJpbmcgPSBudWxsO1xuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IFwicHJvY2Vzc2luZ1wiO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZDtcbiAgICB0aGlzLm9uSXNTaW5nbGVQYWdlQ2hhbmdlZCgpO1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGlmICh0aGlzLmhhc0Nvb2tpZSkge1xuICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuZG9FbGVtZW50c09uTG9hZCgpO1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBcImNvbmRpdGlvbnNcIjtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBudWxsO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmdldFByb2Nlc3NlZFRleHRWYWx1ZUNvcmUodGV4dFZhbHVlKTtcbiAgICBpZiAoIXRoaXMub25Qcm9jZXNzVGV4dFZhbHVlLmlzRW1wdHkpIHtcbiAgICAgIHZhciB3YXNFbXB0eSA9IHRoaXMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSk7XG4gICAgICB0aGlzLm9uUHJvY2Vzc1RleHRWYWx1ZS5maXJlKHRoaXMsIHRleHRWYWx1ZSk7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPVxuICAgICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgfHwgKHdhc0VtcHR5ICYmICF0aGlzLmlzVmFsdWVFbXB0eSh0ZXh0VmFsdWUudmFsdWUpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWVDb3JlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKTogdm9pZCB7XG4gICAgdmFyIG5hbWUgPSB0ZXh0VmFsdWUubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIGlmIChbXCJub1wiLCBcInJlcXVpcmVcIiwgXCJ0aXRsZVwiXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJwYWdlbm9cIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHBhZ2UgIT0gbnVsbCA/IHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YocGFnZSkgKyAxIDogMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicGFnZWNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLnZpc2libGVQYWdlQ291bnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImxvY2FsZVwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gISF0aGlzLmxvY2FsZVxuICAgICAgICA/IHRoaXMubG9jYWxlXG4gICAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcnNcIiB8fCBuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImluY29ycmVjdGVkYW5zd2Vyc1wiIHx8IG5hbWUgPT09IFwiaW5jb3JyZWN0ZWRhbnN3ZXJjb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInF1ZXN0aW9uY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpLmxlbmd0aDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgdmFyIHZhcmlhYmxlID0gdGhpcy5nZXRWYXJpYWJsZShuYW1lKTtcbiAgICBpZiAodmFyaWFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhcmlhYmxlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoZmlyc3ROYW1lLCB0cnVlKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkgKyBuYW1lLnN1YnN0cihmaXJzdE5hbWUubGVuZ3RoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgIHZhbHVlc1tmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShmYWxzZSlcbiAgICAgICAgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyAhPSBcIm5vbmVcIikge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIGhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbnMpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmlzVmlzaWJsZSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBxdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9ucyA/IHF1ZXN0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIHByaXZhdGUgY2xlYXJJbnZpc2libGVRdWVzdGlvblZhbHVlcygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmFyaWFibGUgdmFsdWUuIFZhcmlhYmxlLCB1bmxpa2UgdmFsdWVzLCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgKiBAc2VlIFNldFZhcmlhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0gbmFtZSBBIHZhcmlhYmxlIG5hbWVcbiAgICogQHBhcmFtIG5ld1ZhbHVlXG4gICAqIEBzZWUgR2V0VmFyaWFibGVcbiAgICovXG4gIHB1YmxpYyBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQobmFtZSk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLy9JU3VydmV5IGRhdGFcbiAgcHJvdGVjdGVkIGdldFVuYmluZFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIHZhbHVlXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHF1ZXN0aW9uIHZhbHVlLiBJdCBydW5zIGFsbCB0cmlnZ2VycyBhbmQgY29uZGl0aW9ucyAodmlzaWJsZUlmIHByb3BlcnRpZXMpLiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2UgaWYgZ29OZXh0UGFnZUF1dG9tYXRpYyBpcyB0cnVlIGFuZCBhbGwgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIGFuc3dlcmVkIGNvcnJlY3RseS5cbiAgICogQHBhcmFtIG5hbWUgQSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBuZXdWYWx1ZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmxlSWZcbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLnF1ZXN0aW9uT25WYWx1ZUNoYW5naW5nKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRXF1YWwobmFtZSwgbmV3VmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKSkge1xuICAgICAgdGhpcy5kZWxldGVEYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXRVbmJpbmRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB0aGlzLnNldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHZhciB0cmlnZ2VyS2V5czogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgdHJpZ2dlcktleXNbbmFtZV0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModHJpZ2dlcktleXMsIGZhbHNlKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB0aGlzLm5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQobmFtZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMudHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lKTtcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVFcXVhbChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobmV3VmFsdWUgPT09IFwiXCIgfHwgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCkgbmV3VmFsdWUgPSBudWxsO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUobmFtZSk7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSBudWxsKSByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlO1xuICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PblBhZ2VBZGRlZChwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBwYWdlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgaWYgKCFwYWdlLm5hbWUpIHBhZ2UubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKHRoaXMucGFnZXMsIFwicGFnZVwiKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZChwYWdlKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcGFnZTogcGFnZSB9O1xuICAgIHRoaXMub25QYWdlQWRkZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTmV3TmFtZShlbGVtZW50czogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGtleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIGtleXNbZWxlbWVudHNbaV1bXCJuYW1lXCJdXSA9IHRydWU7XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB3aGlsZSAoa2V5c1tiYXNlTmFtZSArIGluZGV4XSkgaW5kZXgrKztcbiAgICByZXR1cm4gYmFzZU5hbWUgKyBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgdHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKFxuICAgICAgIXF1ZXN0aW9uIHx8XG4gICAgICAoISFxdWVzdGlvbiAmJlxuICAgICAgICAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRDdXJyZW50UGFnZVF1ZXN0aW9ucygpO1xuICAgIGlmIChxdWVzdGlvbnMuaW5kZXhPZihxdWVzdGlvbikgPCAwKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaGFzSW5wdXQgJiYgcXVlc3Rpb25zW2ldLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2UuaGFzRXJyb3JzKHRydWUsIGZhbHNlKSkge1xuICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuZ29OZXh0UGFnZUF1dG9tYXRpYyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21tZW50IHZhbHVlXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqIEBzZWUgc2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW25hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXhdO1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gXCJcIjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbW1lbnQgdmFsdWVcbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHBhcmFtIG5ld1ZhbHVlXG4gICAqIEBzZWUgZ2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBcIlwiO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMuZ2V0Q29tbWVudChuYW1lKSkpIHJldHVybjtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgY29tbWVudE5hbWUsIG5ld1ZhbHVlKTtcbiAgICAgIHRoaXMudHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IGNvbW1lbnROYW1lLFxuICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIHN1cnZleSByZXN1bHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZS4gVHlwaWNhbGx5IGl0IGlzIGEgcXVlc3Rpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGNsZWFyVmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lLCBudWxsKTtcbiAgICB0aGlzLnNldENvbW1lbnQobmFtZSwgbnVsbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIGNsZWFyIHZhbHVlIG9uIGRpc2FibGUgaXRlbXMgaW4gY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAgICogQnkgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBjbGVhcmVkIG9uIGRpc2FibGVkIHRoZSBjb3JyZXNwb25kZWQgaXRlbXMuIFRoaXMgcHJvcGVydHkgaXMgbm90IHBlcnNpc3RlZCBpbiBzdXJ2ZXkganNvbiBhbmQgeW91IGhhdmUgdG8gc2V0IGl0IGluIGNvZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGVhclZhbHVlT25EaXNhYmxlSXRlbXNcIiwgdmFsKTtcbiAgfVxuICBxdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICB2aXNpYmxlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAhcXVlc3Rpb24udmlzaWJsZSAmJlxuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyA9PSBcIm9uSGlkZGVuXCJcbiAgICApIHtcbiAgICAgIHF1ZXN0aW9uLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyBwYWdlOiBwYWdlLCB2aXNpYmxlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIHZpc2libGU6IG5ld1ZhbHVlIH0pO1xuICB9XG4gIHF1ZXN0aW9uQWRkZWQoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmVudFBhbmVsOiBhbnksXG4gICAgcm9vdFBhbmVsOiBhbnlcbiAgKSB7XG4gICAgaWYgKCFxdWVzdGlvbi5uYW1lKSB7XG4gICAgICBxdWVzdGlvbi5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUoXG4gICAgICAgIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKGZhbHNlLCB0cnVlKSxcbiAgICAgICAgXCJxdWVzdGlvblwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5wYWdlKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgfVxuICAgIHRoaXMub25RdWVzdGlvbkFkZGVkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHBhcmVudFBhbmVsOiBwYXJlbnRQYW5lbCxcbiAgICAgIHJvb3RQYW5lbDogcm9vdFBhbmVsXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUmVtb3ZlZChcbiAgICAgIDxRdWVzdGlvbj5xdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWUsXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25RdWVzdGlvblJlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25SZW5hbWVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgb2xkTmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlTmFtZTogc3RyaW5nXG4gICk6IGFueSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc1JlbW92ZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBvbGROYW1lLCBvbGRWYWx1ZU5hbWUpO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNBZGRlZCg8UXVlc3Rpb24+cXVlc3Rpb24pO1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXMgPSB7XG4gICAgbmFtZXM6IHt9LFxuICAgIG5hbWVzSW5zZW5zaXRpdmU6IHt9LFxuICAgIHZhbHVlTmFtZXM6IHt9LFxuICAgIHZhbHVlTmFtZXNJbnNlbnNpdGl2ZToge31cbiAgfTtcbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc0NsZWFyKCkge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXMgPSB7fTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmUgPSB7fTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMgPSB7fTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZSA9IHt9O1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXNQYW5lbEFkZGVkKHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKHF1ZXN0aW9uc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXNBZGRlZChxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXMsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWVcbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc1JlbW92ZWQoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZU5hbWU6IHN0cmluZ1xuICApIHtcbiAgICBpZiAoISFuYW1lKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXMsIHF1ZXN0aW9uLCBuYW1lKTtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhdmFsdWVOYW1lKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICB2YWx1ZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaEFkZGVkQ29yZShoYXNoOiBhbnksIHF1ZXN0aW9uOiBRdWVzdGlvbiwgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgaWYgKCEhcmVzKSB7XG4gICAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICAgIGlmIChyZXMuaW5kZXhPZihxdWVzdGlvbikgPCAwKSB7XG4gICAgICAgIHJlcy5wdXNoKHF1ZXN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaFtuYW1lXSA9IFtxdWVzdGlvbl07XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoaGFzaDogYW55LCBxdWVzdGlvbjogUXVlc3Rpb24sIG5hbWU6IHN0cmluZykge1xuICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgIGlmICghcmVzKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gcmVzLmluZGV4T2YocXVlc3Rpb24pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKHJlcy5sZW5ndGggPT0gMCkge1xuICAgICAgZGVsZXRlIGhhc2hbbmFtZV07XG4gICAgfVxuICB9XG4gIHBhbmVsQWRkZWQocGFuZWw6IElFbGVtZW50LCBpbmRleDogbnVtYmVyLCBwYXJlbnRQYW5lbDogYW55LCByb290UGFuZWw6IGFueSkge1xuICAgIGlmICghcGFuZWwubmFtZSkge1xuICAgICAgcGFuZWwubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKFxuICAgICAgICB0aGlzLmdldEFsbFBhbmVscyhmYWxzZSwgdHJ1ZSksXG4gICAgICAgIFwicGFuZWxcIlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc1BhbmVsQWRkZWQoPFBhbmVsTW9kZWxCYXNlPig8YW55PnBhbmVsKSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbEFkZGVkLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHBhcmVudFBhbmVsOiBwYXJlbnRQYW5lbCxcbiAgICAgIHJvb3RQYW5lbDogcm9vdFBhbmVsXG4gICAgfSk7XG4gIH1cbiAgcGFuZWxSZW1vdmVkKHBhbmVsOiBJRWxlbWVudCkge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFuZWxSZW1vdmVkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIG5hbWU6IHBhbmVsLm5hbWUgfSk7XG4gIH1cbiAgdmFsaWRhdGVRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICh0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5pc0VtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICB2YWx1ZTogcXVlc3Rpb24udmFsdWUsXG4gICAgICBlcnJvcjogPGFueT5udWxsXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IsIHRoaXMpIDogbnVsbDtcbiAgfVxuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZVBhbmVsLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIHBhbmVsOiBwYW5lbCxcbiAgICAgIGVycm9yOiA8YW55Pm51bGxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVBhbmVsLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGh0bWw6IGh0bWwgfTtcbiAgICB0aGlzLm9uUHJvY2Vzc0h0bWwuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dChvcHRpb25zLmh0bWwsIHRydWUpO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dEV4KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZmFsc2UpLnRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgdGV4dDogdGhpcy5wcm9jZXNzVGV4dENvcmUodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBkb0VuY29kaW5nKSxcbiAgICAgIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZVxuICAgIH07XG4gICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5oYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHByb2Nlc3NUZXh0Q29yZShcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRleHQ7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZG9FbmNvZGluZyk7XG4gIH1cbiAgZ2V0U3VydmV5TWFya2Rvd25IdG1sKGVsZW1lbnQ6IEJhc2UsIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGVsZW1lbnQ6IGVsZW1lbnQsIHRleHQ6IHRleHQsIGh0bWw6IDxhbnk+bnVsbCB9O1xuICAgIHRoaXMub25UZXh0TWFya2Rvd24uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5odG1sO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29ycmVjdGVkIGFuc3dlcnMgb24gcXVpelxuICAgKi9cbiAgcHVibGljIGdldENvcnJlY3RlZEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcXVlc3Rpb246IDxJUXVlc3Rpb24+bnVsbCwgcmVzdWx0OiBmYWxzZSB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb25zW2ldO1xuICAgICAgb3B0aW9ucy5yZXN1bHQgPSBvcHRpb25zLnF1ZXN0aW9uLmlzQW5zd2VyQ29ycmVjdCgpO1xuICAgICAgdGhpcy5vbklzQW5zd2VyQ29ycmVjdC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMucmVzdWx0KSBjb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5jb3JyZWN0ZWQgYW5zd2VycyBvbiBxdWl6XG4gICAqL1xuICBwdWJsaWMgZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1aXpRdWVzdGlvbnMoKTtcbiAgICByZXR1cm4gcXVlc3Rpb25zLmxlbmd0aCAtIHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgfVxuICBnZXRDb3JyZWN0ZWRBbnN3ZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgfVxuICBnZXRJbkNvcnJlY3RlZEFuc3dlcnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byAndG9wJyBvciAnYm90dG9tJyBpZiB5b3Ugd2FudCB0byBzaG93IHRoZSBQYW5lbCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGhvdyBtdWNoIHRpbWUgdGhlIGVuZC11c2VyIHNwZW50IG9mIHRoZSBzdXJ2ZXkvcGFnZS5cbiAgICogSWYgdGhlIHZhbHVlIGRvZXNuJ3QgZXF1YWwgJ25vbmUnIHRoZW4gc3VydmV5IGNhbGxzIHN0YXJ0VGltZXIoKSBtZXRob2Qgb24gc3VydmV5IHJlbmRlcmluZy5cbiAgICogQHNlZSBzaG93VGltZXJQYW5lbE1vZGVcbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgc3RvcFRpbWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaW1lclBhbmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsXCIsIFwibm9uZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dUaW1lclBhbmVsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVGltZXJQYW5lbFNob3dpbmdPblRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RpbWVyU3RhcnRlZCAmJiB0aGlzLnNob3dUaW1lclBhbmVsID09IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1RpbWVyUGFuZWxTaG93aW5nT25Cb3R0b20oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lclN0YXJ0ZWQgJiYgdGhpcy5zaG93VGltZXJQYW5lbCA9PSBcImJvdHRvbVwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAncGFnZScgb3IgJ3N1cnZleScgdG8gc2hvdyB0aGUgdGltZXIgaW5mb3JtYXRpb24gZm9yIHBhZ2Ugb3Igc3VydmV5IG9ubHkuXG4gICAqIFVzZSBvblRpbWVyUGFuZWxJbmZvVGV4dCBldmVudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBzaG93VGltZXJQYW5lbFxuICAgKiBAc2VlIG9uVGltZXJQYW5lbEluZm9UZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaW1lclBhbmVsTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgXCJhbGxcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGltZXJQYW5lbE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpbWVySW5mb1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdGV4dDogdGhpcy5nZXRUaW1lckluZm9UZXh0KCkgfTtcbiAgICB0aGlzLm9uVGltZXJQYW5lbEluZm9UZXh0LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGV4dDtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1RleHQoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHBhZ2VTcGVudCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUocGFnZS50aW1lU3BlbnQpO1xuICAgIHZhciBzdXJ2ZXlTcGVudCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUodGhpcy50aW1lU3BlbnQpO1xuICAgIHZhciBwYWdlTGltaXRTZWMgPSB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSk7XG4gICAgdmFyIHBhZ2VMaW1pdCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUocGFnZUxpbWl0U2VjKTtcbiAgICB2YXIgc3VydmV5TGltaXQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHRoaXMubWF4VGltZVRvRmluaXNoKTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJwYWdlXCIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaW1lckluZm9QYWdlVGV4dChwYWdlLCBwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwic3VydmV5XCIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaW1lckluZm9TdXJ2ZXlUZXh0KHN1cnZleVNwZW50LCBzdXJ2ZXlMaW1pdCk7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwiYWxsXCIpIHtcbiAgICAgIGlmIChwYWdlTGltaXRTZWMgPD0gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA8PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRBbGxcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgcGFnZVNwZW50LFxuICAgICAgICAgIHN1cnZleVNwZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFnZUxpbWl0U2VjID4gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJMaW1pdEFsbFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBwYWdlU3BlbnQsXG4gICAgICAgICAgcGFnZUxpbWl0LFxuICAgICAgICAgIHN1cnZleVNwZW50LFxuICAgICAgICAgIHN1cnZleUxpbWl0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcGFnZVRleHQgPSB0aGlzLmdldFRpbWVySW5mb1BhZ2VUZXh0KHBhZ2UsIHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgICAgIGxldCBzdXJ2ZXlUZXh0ID0gdGhpcy5nZXRUaW1lckluZm9TdXJ2ZXlUZXh0KHN1cnZleVNwZW50LCBzdXJ2ZXlMaW1pdCk7XG4gICAgICByZXR1cm4gcGFnZVRleHQgKyBcIiBcIiArIHN1cnZleVRleHQ7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvUGFnZVRleHQoXG4gICAgcGFnZTogUGFnZU1vZGVsLFxuICAgIHBhZ2VTcGVudDogc3RyaW5nLFxuICAgIHBhZ2VMaW1pdDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKSA+IDBcbiAgICAgID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0UGFnZVwiKVtcImZvcm1hdFwiXShwYWdlU3BlbnQsIHBhZ2VMaW1pdClcbiAgICAgIDogdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50UGFnZVwiKVtcImZvcm1hdFwiXShwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9TdXJ2ZXlUZXh0KFxuICAgIHN1cnZleVNwZW50OiBzdHJpbmcsXG4gICAgc3VydmV5TGltaXQ6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDBcbiAgICAgID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0U3VydmV5XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHN1cnZleVNwZW50LFxuICAgICAgICAgIHN1cnZleUxpbWl0XG4gICAgICAgIClcbiAgICAgIDogdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50U3VydmV5XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHN1cnZleVNwZW50LFxuICAgICAgICAgIHN1cnZleUxpbWl0XG4gICAgICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VGltZSh2YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgdmFyIG1pbiA9IE1hdGguZmxvb3IodmFsIC8gNjApO1xuICAgIHZhciBzZWMgPSB2YWwgJSA2MDtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAobWluID4gMCkge1xuICAgICAgcmVzICs9IG1pbiArIFwiIFwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lck1pblwiKTtcbiAgICB9XG4gICAgaWYgKHJlcyAmJiBzZWMgPT0gMCkgcmV0dXJuIHJlcztcbiAgICBpZiAocmVzKSByZXMgKz0gXCIgXCI7XG4gICAgcmV0dXJuIHJlcyArIHNlYyArIFwiIFwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNlY1wiKTtcbiAgfVxuICBwcml2YXRlIHRpbWVyRnVuYzogYW55ID0gbnVsbDtcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGltZXIgdGhhdCB3aWxsIGNhbGN1bGF0ZSBob3cgbXVjaCB0aW1lIGVuZC11c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5IG9yIG9uIHBhZ2VzXG4gICAqIEBzZWUgc3RvcFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lcigpIHtcbiAgICBpZiAodGhpcy5pc1RpbWVyU3RhcnRlZCB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRpbWVyRnVuYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5kb1RpbWVyKCk7XG4gICAgfTtcbiAgICB0aGlzLmlzVGltZXJTdGFydGVkID0gdHJ1ZTtcbiAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZS5zdGFydCh0aGlzLnRpbWVyRnVuYyk7XG4gIH1cbiAgc3RhcnRUaW1lckZyb21VSSgpIHtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbCAhPSBcIm5vbmVcIiAmJiB0aGlzLnN0YXRlID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTdG9wIHRoZSB0aW1lci5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RvcFRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pc1RpbWVyU3RhcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNUaW1lclN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZS5zdG9wKHRoaXMudGltZXJGdW5jKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5XG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGltZVNwZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0aW1lU3BlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCB0aW1lU3BlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aW1lU3BlbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kLXVzZXIgaGFzIHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXkuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBtYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kLXVzZXIgaGFzIHRvIGNvbXBsZXRlIGEgcGFnZSBpbiB0aGUgc3VydmV5LiBJZiB0aGUgdmFsdWUgaXMgMCBvciBsZXNzLCB0aGUgZW5kLXVzZXIgaGFzIHVubGltaXRlZCB0aW1lLiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgdmFsdWUgZm9yIGV2ZXJ5IHBhZ2UuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIG1heFRpbWVUb0ZpbmlzaFxuICAgKiBAc2VlIFBhZ2VNb2RlbC5tYXhUaW1lVG9GaW5pc2hcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoUGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoUGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKCFwYWdlIHx8IHBhZ2UubWF4VGltZVRvRmluaXNoIDwgMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHBhZ2UubWF4VGltZVRvRmluaXNoID4gMFxuICAgICAgPyBwYWdlLm1heFRpbWVUb0ZpbmlzaFxuICAgICAgOiB0aGlzLm1heFRpbWVUb0ZpbmlzaFBhZ2U7XG4gIH1cbiAgcHJvdGVjdGVkIGRvVGltZXIoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBwYWdlLnRpbWVTcGVudCA9IHBhZ2UudGltZVNwZW50ICsgMTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSB0aGlzLnRpbWVTcGVudCArIDE7XG4gICAgdGhpcy5vblRpbWVyLmZpcmUodGhpcywge30pO1xuICAgIGlmICh0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPT0gdGhpcy50aW1lU3BlbnQpIHtcbiAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgIH1cbiAgICBpZiAocGFnZSkge1xuICAgICAgdmFyIHBhZ2VMaW1pdCA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICAgIGlmIChwYWdlTGltaXQgPiAwICYmIHBhZ2VMaW1pdCA9PSBwYWdlLnRpbWVTcGVudCkge1xuICAgICAgICBpZiAodGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vSVN1cnZleUltcGxlbWVudG9yXG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vSVN1cnZleVRyaWdnZXJPd25lclxuICBnZXRPYmplY3RzKHBhZ2VzOiBzdHJpbmdbXSwgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICB2YXIgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5nZXRQYWdlc0J5TmFtZXMocGFnZXMpKTtcbiAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIHRoaXMuZ2V0UXVlc3Rpb25zQnlOYW1lcyhxdWVzdGlvbnMpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICBpZiAoaXNWYXJpYWJsZSkge1xuICAgICAgdGhpcy5zZXRWYXJpYWJsZShuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBjb3B5VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgZnJvbU5hbWU6IHN0cmluZykge1xuICAgIGlmICghbmFtZSB8fCAhZnJvbU5hbWUpIHJldHVybjtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUsIHRoaXMuZ2V0VmFsdWUoZnJvbU5hbWUpKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwic3VydmV5XCIsIFtcbiAge1xuICAgIG5hbWU6IFwibG9jYWxlXCIsXG4gICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRMb2NhbGVzKCk7XG4gICAgfSxcbiAgICBvbkdldFZhbHVlOiAob2JqOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgcmV0dXJuIG9iai5sb2NhbGUgPT0gc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGUgPyBudWxsIDogb2JqLmxvY2FsZTtcbiAgICB9XG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gIHsgbmFtZTogXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJjb21wbGV0ZWRIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlZEh0bWxcIiB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRCZWZvcmVIdG1sOmh0bWxcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVkQmVmb3JlSHRtbFwiXG4gIH0sXG4gIHsgbmFtZTogXCJsb2FkaW5nSHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMb2FkaW5nSHRtbFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlc1wiLCBjbGFzc05hbWU6IFwicGFnZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiZWxlbWVudHNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsXG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgb25HZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnZlcnRlcjogYW55KSB7XG4gICAgICB2YXIgcGFnZSA9IG9iai5hZGROZXdQYWdlKFwiXCIpO1xuICAgICAganNvbkNvbnZlcnRlci50b09iamVjdCh7IHF1ZXN0aW9uczogdmFsdWUgfSwgcGFnZSk7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJ0cmlnZ2Vyczp0cmlnZ2Vyc1wiLFxuICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dHJpZ2dlclwiLFxuICAgIGNsYXNzTmFtZVBhcnQ6IFwidHJpZ2dlclwiXG4gIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlJZFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7IG5hbWU6IFwic3VydmV5UG9zdElkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlTaG93RGF0YVNhdmluZzpib29sZWFuXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIFwiY29va2llTmFtZVwiLFxuICBcInNlbmRSZXN1bHRPblBhZ2VOZXh0OmJvb2xlYW5cIixcbiAgeyBuYW1lOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uczpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInNob3dQcmV2QnV0dG9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1RpdGxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1BhZ2VUaXRsZXM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93Q29tcGxldGVkUGFnZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICBkZWZhdWx0OiBcImluaXRpYWxcIixcbiAgICBjaG9pY2VzOiBbXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gIH0sXG4gIFwic2hvd1BhZ2VOdW1iZXJzOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgIGRlZmF1bHQ6IFwib25cIixcbiAgICBjaG9pY2VzOiBbXCJvblwiLCBcIm9uUGFnZVwiLCBcIm9mZlwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZWZhdWx0OiBcInRvcFwiLFxuICAgIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl1cbiAgfSxcbiAgeyBuYW1lOiBcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCBkZWZhdWx0OiBcInRvcFwiLCBjaG9pY2VzOiBbXCJ0b3BcIiwgXCJib3R0b21cIl0gfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICBjaG9pY2VzOiBbXCJvZmZcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJib3RoXCJdXG4gIH0sXG4gIHsgbmFtZTogXCJtb2RlXCIsIGRlZmF1bHQ6IFwiZWRpdFwiLCBjaG9pY2VzOiBbXCJlZGl0XCIsIFwiZGlzcGxheVwiXSB9LFxuICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJtYXhUZXh0TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gIHsgbmFtZTogXCJtYXhPdGhlcnNMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgXCJnb05leHRQYWdlQXV0b21hdGljOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIixcbiAgICBkZWZhdWx0OiBcIm9uQ29tcGxldGVcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwib25Db21wbGV0ZVwiLCBcIm9uSGlkZGVuXCJdXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImNoZWNrRXJyb3JzTW9kZVwiLFxuICAgIGRlZmF1bHQ6IFwib25OZXh0UGFnZVwiLFxuICAgIGNob2ljZXM6IFtcIm9uTmV4dFBhZ2VcIiwgXCJvblZhbHVlQ2hhbmdlZFwiXVxuICB9LFxuICB7IG5hbWU6IFwic3RhcnRTdXJ2ZXlUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NTdGFydFN1cnZleVRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZVByZXZUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlUHJldlRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZU5leHRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlTmV4dFRleHRcIiB9LFxuICB7IG5hbWU6IFwiY29tcGxldGVUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZVRleHRcIiB9LFxuICB7IG5hbWU6IFwicmVxdWlyZWRUZXh0XCIsIGRlZmF1bHQ6IFwiKlwiIH0sXG4gIFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NRdWVzdGlvblRpdGxlVGVtcGxhdGVcIlxuICB9LFxuICB7IG5hbWU6IFwiZmlyc3RQYWdlSXNTdGFydGVkOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgeyBuYW1lOiBcImlzU2luZ2xlUGFnZTpib29sZWFuXCIsIGRlZmF1bHQ6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2g6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaFBhZ2U6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1RpbWVyUGFuZWxcIixcbiAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwidG9wXCIsIFwiYm90dG9tXCJdXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInNob3dUaW1lclBhbmVsTW9kZVwiLFxuICAgIGRlZmF1bHQ6IFwiYWxsXCIsXG4gICAgY2hvaWNlczogW1wiYWxsXCIsIFwicGFnZVwiLCBcInN1cnZleVwiXVxuICB9XG5dKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXkudHMiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21haW4uc2Nzc1xuLy8gbW9kdWxlIGlkID0gMjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25DZWxsLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxufSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29DZWxsQWZ0ZXJSZW5kZXI6IGFueTtcbiAga29Sb3dzOiBhbnk7XG4gIGtvVmlzaWJsZUNvbHVtbnM6IGFueTtcbiAga29SZWNhbGM6IGFueTtcbiAga29BZGRSb3dDbGljazogYW55O1xuICBrb1JlbW92ZVJvd0NsaWNrOiBhbnk7XG4gIGtvSXNBZGRSb3dPblRvcDogYW55O1xuICBrb0lzQWRkUm93T25Cb3R0b206IGFueTtcbiAga29DYW5SZW1vdmVSb3c6IGFueTtcbiAga29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQ6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQ2VsbEFmdGVyUmVuZGVyID0gZnVuY3Rpb24oZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICAgIHJldHVybiBzZWxmLmNlbGxBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICAgIHRoaXMua29SZWNhbGMgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29Sb3dzID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXMucXVlc3Rpb24pLnZpc2libGVSb3dzO1xuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMua29WaXNpYmxlQ29sdW1ucyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD50aGlzLnF1ZXN0aW9uKS52aXNpYmxlQ29sdW1ucztcbiAgICB9LCB0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpc1xuICAgICAgLnF1ZXN0aW9uKS52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblZpc2libGVSb3dzQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgdGhpcy5rb0FkZFJvd0NsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmFkZFJvdygpO1xuICAgIH07XG4gICAgdGhpcy5rb1JlbW92ZVJvd0NsaWNrID0gZnVuY3Rpb24oZGF0YTogYW55KSB7XG4gICAgICBzZWxmLnJlbW92ZVJvdyhkYXRhKTtcbiAgICB9O1xuICAgIHRoaXMua29Jc0FkZFJvd09uVG9wID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuIHNlbGYuaXNBZGRSb3dUb3AoKTtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNBZGRSb3dPbkJvdHRvbSA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiBzZWxmLmlzQWRkUm93Qm90dG9tKCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0NhblJlbW92ZVJvdyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiBzZWxmLmNhblJlbW92ZVJvdygpO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQgPSBrby5vYnNlcnZhYmxlKFxuICAgICAgKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpcy5xdWVzdGlvbikuaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsXG4gICAgKTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUm93c1wiXSA9IHRoaXMua29Sb3dzO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29WaXNpYmxlQ29sdW1uc1wiXSA9IHRoaXMua29WaXNpYmxlQ29sdW1ucztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ2VsbEFmdGVyUmVuZGVyXCJdID0gdGhpcy5rb0NlbGxBZnRlclJlbmRlcjtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQWRkUm93Q2xpY2tcIl0gPSB0aGlzLmtvQWRkUm93Q2xpY2s7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1JlbW92ZVJvd0NsaWNrXCJdID0gdGhpcy5rb1JlbW92ZVJvd0NsaWNrO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Jc0FkZFJvd09uVG9wXCJdID0gdGhpcy5rb0lzQWRkUm93T25Ub3A7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lzQWRkUm93T25Cb3R0b21cIl0gPSB0aGlzLmtvSXNBZGRSb3dPbkJvdHRvbTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ2FuUmVtb3ZlUm93XCJdID0gdGhpcy5rb0NhblJlbW92ZVJvdztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcbiAgICAgIFwia29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXRcIlxuICAgIF0gPSB0aGlzLmtvSXNIb3Jpem9udGFsQ29sdW1uTGF5b3V0O1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wiaGFzUm93VGV4dFwiXSA9IHRoaXMuaGFzUm93VGV4dCgpO1xuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXNcbiAgICAgIC5xdWVzdGlvbikuY29sdW1uc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkNvbHVtbkNoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXNcbiAgICAgIC5xdWVzdGlvbikudXBkYXRlQ2VsbHNDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblVwZGF0ZUNlbGxzKCk7XG4gICAgfTtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD50aGlzXG4gICAgICAucXVlc3Rpb24pLmNvbHVtbkxheW91dENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkNvbHVtbkxheW91dENoYW5nZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvblRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHluYW1pY1wiO1xuICB9XG4gIHByaXZhdGUgY2VsbEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIHZhciBjZWxsID0gPE1hdHJpeERyb3Bkb3duQ2VsbD5jb247XG4gICAgaWYgKGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSB7XG4gICAgICBjZWxsLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcihjZWxsLnF1ZXN0aW9uLCBlbCk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgY2VsbDogY2VsbCxcbiAgICAgIGNlbGxRdWVzdGlvbjogY2VsbC5xdWVzdGlvbixcbiAgICAgIGh0bWxFbGVtZW50OiBlbCxcbiAgICAgIHJvdzogY2VsbC5yb3csXG4gICAgICBjb2x1bW46IGNlbGwuY29sdW1uXG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uLnN1cnZleS5tYXRyaXhBZnRlckNlbGxSZW5kZXIodGhpcy5xdWVzdGlvbiwgb3B0aW9ucyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLm9uQ29sdW1uTGF5b3V0Q2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBoYXNSb3dUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbkxheW91dENoYW5nZWQoKSB7XG4gICAgdGhpcy5rb0lzSG9yaXpvbnRhbENvbHVtbkxheW91dChcbiAgICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZT50aGlzLnF1ZXN0aW9uKS5pc0NvbHVtbkxheW91dEhvcml6b250YWxcbiAgICApO1xuICAgIHRoaXMua29SZWNhbGModGhpcy5rb1JlY2FsYygpICsgMSk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQWRkUm93VG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNBZGRSb3dCb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SZW1vdmVSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbkNoYW5nZWQoKSB7XG4gICAgdmFyIHJvd3MgPSAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U+dGhpcy5xdWVzdGlvbikudmlzaWJsZVJvd3M7XG4gICAgdGhpcy5vblZpc2libGVSb3dzQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVSb3dzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvUmVjYWxjKHRoaXMua29SZWNhbGMoKSArIDEpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRSb3coKSB7fVxuICBwcm90ZWN0ZWQgcmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpIHt9XG4gIHByb3RlY3RlZCBvblVwZGF0ZUNlbGxzKCkge31cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd24gZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uTWF0cml4QmFzZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibWF0cml4ZHJvcGRvd25cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bihcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZS5hZGREZWZhdWx0Q29sdW1ucyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0IGV4dGVuZHMgUXVlc3Rpb25UZXh0TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJ0ZXh0XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0KG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl90ZXh0LnRzIiwiZXhwb3J0IHZhciBrb1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90ZW1wbGF0ZXMvZW50cnkuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRlbXBsYXRlVGV4dCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgYWRkVGV4dChuZXdUZXh0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGlkID0gdGhpcy5nZXRJZChpZCwgbmFtZSk7XG4gICAgdGhpcy50ZXh0ID1cbiAgICAgIHRoaXMudGV4dCArXG4gICAgICAnPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgJyArXG4gICAgICBpZCArXG4gICAgICBcIj5cIiArXG4gICAgICBuZXdUZXh0ICtcbiAgICAgIFwiPC9zY3JpcHQ+XCI7XG4gIH1cbiAgcHVibGljIHJlcGxhY2VUZXh0KFxuICAgIHJlcGxhY2VUZXh0OiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgdmFyIHBvc0lkID0gdGhpcy5nZXRJZChpZCwgcXVlc3Rpb25UeXBlKTtcbiAgICB2YXIgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YocG9zSWQpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICB0aGlzLmFkZFRleHQocmVwbGFjZVRleHQsIGlkLCBxdWVzdGlvblR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwb3MgPSB0aGlzLnRleHQuaW5kZXhPZihcIj5cIiwgcG9zKTtcbiAgICBpZiAocG9zIDwgMCkgcmV0dXJuO1xuICAgIHZhciBzdGFydFBvcyA9IHBvcyArIDE7XG4gICAgdmFyIGVuZFN0cmluZyA9IFwiPC9zY3JpcHQ+XCI7XG4gICAgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YoZW5kU3RyaW5nLCBzdGFydFBvcyk7XG4gICAgaWYgKHBvcyA8IDApIHJldHVybjtcbiAgICB0aGlzLnRleHQgPVxuICAgICAgdGhpcy50ZXh0LnN1YnN0cigwLCBzdGFydFBvcykgKyByZXBsYWNlVGV4dCArIHRoaXMudGV4dC5zdWJzdHIocG9zKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SWQoaWQ6IHN0cmluZywgcXVlc3Rpb25UeXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gJ2lkPVwic3VydmV5LScgKyBpZDtcbiAgICBpZiAocXVlc3Rpb25UeXBlKSB7XG4gICAgICByZXN1bHQgKz0gXCItXCIgKyBxdWVzdGlvblR5cGU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgKyAnXCInO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBrb1RlbXBsYXRlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAga29UZW1wbGF0ZSA9IHZhbHVlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVUZXh0LnRzIiwiaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IsIElUZXh0UHJvY2Vzc29yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBKc29uT2JqZWN0UHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5cbmNsYXNzIFhtbFBhcnNlciB7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBwdWJsaWMgYXNzaWduVmFsdWUodGFyZ2V0OiBhbnksIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXS5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdXS5jb25jYXQodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDEgJiZcbiAgICAgIE9iamVjdC5rZXlzKHZhbHVlKVswXSA9PT0gbmFtZVxuICAgICkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWVbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgeG1sMkpzb24oeG1sTm9kZTogYW55LCByZXN1bHQ6IGFueSkge1xuICAgIGlmICh4bWxOb2RlLmNoaWxkcmVuICYmIHhtbE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4bWxOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZE5vZGUgPSB4bWxOb2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICBsZXQgY2hpbGRPYmplY3QgPSB7fTtcbiAgICAgICAgdGhpcy54bWwySnNvbihjaGlsZE5vZGUsIGNoaWxkT2JqZWN0KTtcbiAgICAgICAgdGhpcy5hc3NpZ25WYWx1ZShyZXN1bHQsIGNoaWxkTm9kZS5ub2RlTmFtZSwgY2hpbGRPYmplY3QpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2lnblZhbHVlKHJlc3VsdCwgeG1sTm9kZS5ub2RlTmFtZSwgeG1sTm9kZS50ZXh0Q29udGVudCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBwYXJzZVhtbFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgIGxldCB4bWxSb290ID0gdGhpcy5wYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcbiAgICBsZXQganNvbiA9IHt9O1xuICAgIHRoaXMueG1sMkpzb24oeG1sUm9vdCwganNvbik7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRlZmluaXRpb24gZm9yIGZpbGxpbmcgY2hvaWNlcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucyBmcm9tIHJlc2Z1bGwgc2VydmljZXMuXG4gKiBUaGUgcnVuIG1ldGhvZCBjYWxsIGEgcmVzdGZ1bGwgc2VydmljZSBhbmQgcmVzdWx0cyBjYW4gYmUgZ2V0IG9uIGdldFJlc3VsdENhbGxiYWNrLlxuICovXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1Jlc3RmdWxsIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGl0ZW1zUmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHVibGljIHN0YXRpYyBvbkJlZm9yZVNlbmRSZXF1ZXN0OiAoXG4gICAgc2VuZGVyOiBDaG9pY2VzUmVzdGZ1bGwsXG4gICAgb3B0aW9uczogeyByZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCB9XG4gICkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q2FjaGVkSXRlbXNSZXN1bHQob2JqOiBDaG9pY2VzUmVzdGZ1bGwpOiBib29sZWFuIHtcbiAgICB2YXIgaGFzaCA9IG9iai5vYmpIYXNoO1xuICAgIHZhciByZXMgPSBDaG9pY2VzUmVzdGZ1bGwuaXRlbXNSZXN1bHRbaGFzaF07XG4gICAgaWYgKCFyZXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAob2JqLmdldFJlc3VsdENhbGxiYWNrKSB7XG4gICAgICBvYmouZ2V0UmVzdWx0Q2FsbGJhY2socmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBsYXN0T2JqSGFzaDogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBpc1J1bm5pbmdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2VkVXJsOiBzdHJpbmcgPSBcIlwiO1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2VkUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGdldFJlc3VsdENhbGxiYWNrOiAoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pID0+IHZvaWQ7XG4gIHB1YmxpYyB1cGRhdGVSZXN1bHRDYWxsYmFjazogKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICkgPT4gQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHVibGljIGVycm9yOiBTdXJ2ZXlFcnJvciA9IG51bGw7XG4gIHB1YmxpYyBvd25lcjogQmFzZTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgcnVuKHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yID0gbnVsbCkge1xuICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2spIHJldHVybjtcbiAgICB0aGlzLnByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3Nvcik7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFVybCkge1xuICAgICAgdGhpcy5kb0VtcHR5UmVzdWx0Q2FsbGJhY2soe30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0T2JqSGFzaCA9PSB0aGlzLm9iakhhc2gpIHJldHVybjtcbiAgICB0aGlzLmxhc3RPYmpIYXNoID0gdGhpcy5vYmpIYXNoO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIGlmICh0aGlzLnVzZUNoYW5nZWRJdGVtc1Jlc3VsdHMoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VuZFJlcXVlc3QoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUnVubmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzV2FpdGluZ0ZvclBhcmFtZXRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudXJsICYmICF0aGlzLnByb2Nlc3NlZFVybDtcbiAgfVxuICBwcm90ZWN0ZWQgdXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQ2hvaWNlc1Jlc3RmdWxsLmdldENhY2hlZEl0ZW1zUmVzdWx0KHRoaXMpO1xuICB9XG4gIHByaXZhdGUgZG9FbXB0eVJlc3VsdENhbGxiYWNrKHNlcnZlclJlc3VsdDogYW55KSB7XG4gICAgdmFyIGl0ZW1zOiBBcnJheTxhbnk+ID0gW107XG4gICAgaWYgKHRoaXMudXBkYXRlUmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgIGl0ZW1zID0gdGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjayhpdGVtcywgc2VydmVyUmVzdWx0KTtcbiAgICB9XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzZWRUZXh0KHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yKSB7XG4gICAgaWYgKHRleHRQcm9jZXNzb3IpIHtcbiAgICAgIHZhciBwVXJsID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KHRoaXMudXJsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YXIgcFBhdGggPSB0ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0RXgodGhpcy5wYXRoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICBpZiAoIXBVcmwuaGFzQWxsVmFsdWVzT25MYXN0UnVuIHx8ICFwUGF0aC5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSBcIlwiO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSBwVXJsLnRleHQ7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IHBQYXRoLnRleHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gdGhpcy51cmw7XG4gICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSB0aGlzLnBhdGg7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBsZXQgcGFyc2VkUmVzcG9uc2U7XG4gICAgaWYgKFxuICAgICAgISFyZXNwb25zZSAmJlxuICAgICAgdHlwZW9mIHJlc3BvbnNlLmluZGV4T2YgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgcmVzcG9uc2UuaW5kZXhPZihcIjxcIikgPT09IDBcbiAgICApIHtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgWG1sUGFyc2VyKCk7XG4gICAgICBwYXJzZWRSZXNwb25zZSA9IHBhcnNlci5wYXJzZVhtbFN0cmluZyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcGFyc2VkUmVzcG9uc2UgPSAocmVzcG9uc2UgfHwgXCJcIilcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAubWFwKChzOiBhbnkpID0+IHMudHJpbShcIiBcIikpXG4gICAgICAgICAgLmZpbHRlcigoczogYW55KSA9PiAhIXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNlbmRSZXF1ZXN0KCkge1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSB0cnVlO1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcIkdFVFwiLCB0aGlzLnByb2Nlc3NlZFVybCk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgc2VsZi5vbkxvYWQoc2VsZi5wYXJzZVJlc3BvbnNlKHhoci5yZXNwb25zZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5vbkVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBvcHRpb25zID0geyByZXF1ZXN0OiB4aHIgfTtcbiAgICBpZiAoISFDaG9pY2VzUmVzdGZ1bGwub25CZWZvcmVTZW5kUmVxdWVzdCkge1xuICAgICAgQ2hvaWNlc1Jlc3RmdWxsLm9uQmVmb3JlU2VuZFJlcXVlc3QodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIG9wdGlvbnMucmVxdWVzdC5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaG9pY2VzQnlVcmxcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnVybCAmJiAhdGhpcy5wYXRoICYmICF0aGlzLnZhbHVlTmFtZSAmJiAhdGhpcy50aXRsZU5hbWU7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydGllc1tpXS5uYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgKyBcIk5hbWVcIjtcbiAgfVxuICBwcml2YXRlIGdldEN1c3RvbVByb3BlcnRpZXMoKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXModGhpcy5pdGVtVmFsdWVUeXBlKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ2YWx1ZVwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcInZpc2libGVJZlwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJlbmFibGVJZlwiXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEoanNvbjogYW55KSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGlmIChqc29uLnVybCkgdGhpcy51cmwgPSBqc29uLnVybDtcbiAgICBpZiAoanNvbi5wYXRoKSB0aGlzLnBhdGggPSBqc29uLnBhdGg7XG4gICAgaWYgKGpzb24udmFsdWVOYW1lKSB0aGlzLnZhbHVlTmFtZSA9IGpzb24udmFsdWVOYW1lO1xuICAgIGlmIChqc29uLnRpdGxlTmFtZSkgdGhpcy50aXRsZU5hbWUgPSBqc29uLnRpdGxlTmFtZTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoanNvbltwcm9wZXJ0aWVzW2ldXSkgKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0gPSBqc29uW3Byb3BlcnRpZXNbaV1dO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGF0YSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLnVybCkgcmVzW1widXJsXCJdID0gdGhpcy51cmw7XG4gICAgaWYgKHRoaXMucGF0aCkgcmVzW1wicGF0aFwiXSA9IHRoaXMucGF0aDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJlc1tcInZhbHVlTmFtZVwiXSA9IHRoaXMudmFsdWVOYW1lO1xuICAgIGlmICh0aGlzLnRpdGxlTmFtZSkgcmVzW1widGl0bGVOYW1lXCJdID0gdGhpcy50aXRsZU5hbWU7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dKVxuICAgICAgICByZXNbcHJvcGVydGllc1tpXV0gPSAoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB1cmwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtVmFsdWVUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICB2YXIgcHJvcCA9IEpzb25PYmplY3QubWV0YURhdGEuZmluZFByb3BlcnR5KFxuICAgICAgdGhpcy5vd25lci5nZXRUeXBlKCksXG4gICAgICBcImNob2ljZXNcIlxuICAgICk7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICBpZiAocHJvcC50eXBlID09IFwiaXRlbXZhbHVlW11cIikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgcmV0dXJuIHByb3AudHlwZTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgdGhpcy52YWx1ZU5hbWUgPSBcIlwiO1xuICAgIHRoaXMudGl0bGVOYW1lID0gXCJcIjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0pICg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dID0gXCJcIjtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZChyZXN1bHQ6IGFueSkge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHZhciB1cGRhdGVkUmVzdWx0ID0gdGhpcy5nZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0KTtcbiAgICBpZiAodXBkYXRlZFJlc3VsdCAmJiB1cGRhdGVkUmVzdWx0W1wibGVuZ3RoXCJdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZWRSZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW1WYWx1ZSA9IHVwZGF0ZWRSZXN1bHRbaV07XG4gICAgICAgIGlmICghaXRlbVZhbHVlKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShpdGVtVmFsdWUpO1xuICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGl0ZW1WYWx1ZSk7XG4gICAgICAgIHZhciBpdGVtID0gbmV3IEl0ZW1WYWx1ZSh2YWx1ZSwgdGl0bGUpO1xuICAgICAgICB0aGlzLnNldEN1c3RvbVByb3BlcnRpZXMoaXRlbSwgaXRlbVZhbHVlKTtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvciA9IG5ldyBDdXN0b21FcnJvcihcbiAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInVybEdldENob2ljZXNFcnJvclwiKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudXBkYXRlUmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgIGl0ZW1zID0gdGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjayhpdGVtcywgcmVzdWx0KTtcbiAgICB9XG4gICAgQ2hvaWNlc1Jlc3RmdWxsLml0ZW1zUmVzdWx0W3RoaXMub2JqSGFzaF0gPSBpdGVtcztcbiAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgfVxuICBwcml2YXRlIHNldEN1c3RvbVByb3BlcnRpZXMoaXRlbTogSXRlbVZhbHVlLCBpdGVtVmFsdWU6IGFueSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZUNvcmUoXG4gICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eUJpbmRpbmcocHJvcC5uYW1lKVxuICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgICAoPGFueT5pdGVtKVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnR5QmluZGluZyhwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICgoPGFueT50aGlzKVt0aGlzLmdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpXSlcbiAgICAgIHJldHVybiAoPGFueT50aGlzKVt0aGlzLmdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpXTtcbiAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXSkgcmV0dXJuICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV07XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgfVxuICBwcml2YXRlIG9uRXJyb3Ioc3RhdHVzOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVycm9yID0gbmV3IEN1c3RvbUVycm9yKFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ1cmxSZXF1ZXN0RXJyb3JcIilcbiAgICAgICAgW1wiZm9ybWF0XCJdKHN0YXR1cywgcmVzcG9uc2UpXG4gICAgKTtcbiAgICB0aGlzLmRvRW1wdHlSZXN1bHRDYWxsYmFjayhyZXNwb25zZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoIXRoaXMucHJvY2Vzc2VkUGF0aCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YXIgcGF0aGVzID0gdGhpcy5nZXRQYXRoZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0W3BhdGhlc1tpXV07XG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYXRoZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHBhdGhlcyA9IFtdO1xuICAgIGlmICh0aGlzLnByb2Nlc3NlZFBhdGguaW5kZXhPZihcIjtcIikgPiAtMSkge1xuICAgICAgcGF0aGVzID0gdGhpcy5wYXRoLnNwbGl0KFwiO1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aGVzID0gdGhpcy5wcm9jZXNzZWRQYXRoLnNwbGl0KFwiLFwiKTtcbiAgICB9XG4gICAgaWYgKHBhdGhlcy5sZW5ndGggPT0gMCkgcGF0aGVzLnB1c2godGhpcy5wcm9jZXNzZWRQYXRoKTtcbiAgICByZXR1cm4gcGF0aGVzO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWUoaXRlbTogYW55KTogYW55IHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRoaXMuZ2V0VmFsdWVDb3JlKGl0ZW0sIHRoaXMudmFsdWVOYW1lKTtcbiAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGl0ZW07XG4gICAgdmFyIGxlbiA9IE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aDtcbiAgICBpZiAobGVuIDwgMSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGl0ZW1bT2JqZWN0LmtleXMoaXRlbSlbMF1dO1xuICB9XG4gIHByaXZhdGUgZ2V0VGl0bGUoaXRlbTogYW55KTogYW55IHtcbiAgICB2YXIgdGl0bGUgPSB0aGlzLnRpdGxlTmFtZSA/IHRoaXMudGl0bGVOYW1lIDogXCJ0aXRsZVwiO1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aXRsZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUNvcmUoaXRlbTogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSA8IDApIHJldHVybiBpdGVtW3Byb3BlcnR5XTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnR5LnNwbGl0KFwiLlwiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBpdGVtW3Byb3BlcnRpZXNbaV1dO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcHJpdmF0ZSBnZXQgb2JqSGFzaCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMudmFsdWVOYW1lICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMudGl0bGVOYW1lXG4gICAgKTtcbiAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjaG9pY2VzQnlVcmxcIixcbiAgW1widXJsXCIsIFwicGF0aFwiLCBcInZhbHVlTmFtZVwiLCBcInRpdGxlTmFtZVwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBDaG9pY2VzUmVzdGZ1bGwoKTtcbiAgfVxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jaG9pY2VzUmVzdGZ1bGwudHMiLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIENvbmRpdGlvbk5vZGUsXG4gIE9wZXJhbmQsXG4gIEZ1bmN0aW9uT3BlcmFuZCxcbiAgRXhwcmVzc2lvbk9wZXJhbmQsXG4gIENvbmRpdGlvbk9wZXJhbmRcbn0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uc1BhcnNlckVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGF0OiBudW1iZXIsIHB1YmxpYyBjb2RlOiBzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25zUGFyc2VyIHtcbiAgcmVhZG9ubHkgRVJST1JfT3BlcmF0b3JFeHBlY3RlZCA9IFwiT1BFUkFUT1JfRVhQRUNURURcIjtcbiAgcmVhZG9ubHkgRVJST1JfUmlnaHRQYXJ0RXhwZWN0ZWQgPSBcIlJJR0hUUEFSVF9FWFBFQ1RFRFwiO1xuICByZWFkb25seSBFUlJPUl9FeHByZXNzaW9uRXhwZWN0ZWQgPSBcIkVYUFJFU1NJT05fRVhQRUNURURcIjtcbiAgcmVhZG9ubHkgRVJST1JfRW5kRXhwZWN0ZWQgPSBcIkVORF9FWFBFQ1RFRFwiO1xuICBwcml2YXRlIHRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSByb290OiBDb25kaXRpb25Ob2RlO1xuICBwcml2YXRlIGV4cHJlc3Npb25Ob2RlczogQXJyYXk8YW55PjtcbiAgcHJpdmF0ZSBub2RlOiBhbnk7XG4gIHByaXZhdGUgYXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBlcnJvclZhbHVlOiBDb25kaXRpb25zUGFyc2VyRXJyb3I7XG4gIHB1YmxpYyBwYXJzZSh0ZXh0OiBzdHJpbmcsIHJvb3Q6IENvbmRpdGlvbk5vZGUpOiBib29sZWFuIHtcbiAgICB0aGlzLnNldFByb3BlcnRpZXModGV4dCwgcm9vdCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUZXh0KCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZUNvbmRpdGlvbih0ZXh0OiBzdHJpbmcpOiBDb25kaXRpb25Ob2RlIHtcbiAgICB2YXIgcm9vdCA9IG5ldyBDb25kaXRpb25Ob2RlKCk7XG4gICAgaWYgKCF0aGlzLnBhcnNlKHRleHQsIHJvb3QpKSB7XG4gICAgICByb290ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cbiAgcHVibGljIHBhcnNlRXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcpOiBPcGVyYW5kIHtcbiAgICB0aGlzLnNldFByb3BlcnRpZXModGV4dCwgbmV3IENvbmRpdGlvbk5vZGUoKSk7XG4gICAgcmV0dXJuIHRoaXMucmVhZEV4cHJlc3Npb25PcGVyYW5kKCk7XG4gIH1cbiAgcHVibGljIGdldCBlcnJvcigpOiBDb25kaXRpb25zUGFyc2VyRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLmVycm9yVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVFcnJvcihjb2RlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5lcnJvclZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5lcnJvclZhbHVlID0gbmV3IENvbmRpdGlvbnNQYXJzZXJFcnJvcih0aGlzLmF0LCBjb2RlKTtcbiAgfVxuICBwcml2YXRlIHNldFByb3BlcnRpZXModGV4dDogc3RyaW5nLCByb290OiBDb25kaXRpb25Ob2RlKSB7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB0aGlzLmF0ID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICB0aGlzLnJvb3QuY2xlYXIoKTtcbiAgICB0aGlzLm5vZGUgPSB0aGlzLnJvb3Q7XG4gICAgdGhpcy5leHByZXNzaW9uTm9kZXMgPSBbXTtcbiAgICB0aGlzLmV4cHJlc3Npb25Ob2Rlcy5wdXNoKHRoaXMubm9kZSk7XG4gICAgdGhpcy5lcnJvclZhbHVlID0gbnVsbDtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcocm9vdDogQ29uZGl0aW9uTm9kZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvb3QudG9TdHJpbmcoKTtcbiAgfVxuICBwcml2YXRlIHBhcnNlVGV4dCgpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gdGhpcy5yZWFkQ29uZGl0aW9ucygpO1xuICAgIGlmICh0aGlzLmF0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY3JlYXRlRXJyb3IodGhpcy5FUlJPUl9FbmRFeHBlY3RlZCk7XG4gICAgfVxuICAgIHJldHVybiByZXMgJiYgdGhpcy5hdCA+PSB0aGlzLmxlbmd0aDtcbiAgfVxuICBwcml2YXRlIHJlYWRDb25kaXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSB0aGlzLnJlYWRDb25kaXRpb24oKTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIHJlcztcbiAgICB2YXIgY29ubmVjdGl2ZSA9IHRoaXMucmVhZENvbm5lY3RpdmUoKTtcbiAgICBpZiAoY29ubmVjdGl2ZSkge1xuICAgICAgdGhpcy5hZGRDb25uZWN0aXZlKGNvbm5lY3RpdmUpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZENvbmRpdGlvbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkQ29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHZhciBleHBSZXMgPSB0aGlzLnJlYWRFeHByZXNzaW9uKCk7XG4gICAgaWYgKGV4cFJlcyA8IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZXhwUmVzID09IDEpIHJldHVybiB0cnVlO1xuICAgIHZhciBsZWZ0ID0gdGhpcy5yZWFkRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICBpZiAoIWxlZnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRXJyb3IodGhpcy5FUlJPUl9FeHByZXNzaW9uRXhwZWN0ZWQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgb3AgPSB0aGlzLnJlYWRPcGVyYXRvcigpO1xuICAgIGlmICghb3ApIHtcbiAgICAgIGlmIChsZWZ0LmlzQm9vbGVhbikge1xuICAgICAgICB2YXIgYyA9IG5ldyBDb25kaXRpb24oKTtcbiAgICAgICAgYy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5jcmVhdGVFcnJvcih0aGlzLkVSUk9SX09wZXJhdG9yRXhwZWN0ZWQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgYyA9IG5ldyBDb25kaXRpb24oKTtcbiAgICBjLmxlZnQgPSBsZWZ0O1xuICAgIGMub3BlcmF0b3IgPSBvcDtcbiAgICBpZiAoIUNvbmRpdGlvbi5pc05vUmlnaHRPcGVyYXRpb24ob3ApKSB7XG4gICAgICB2YXIgcmlnaHQgPSB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZCh0cnVlKTtcbiAgICAgIGlmICghcmlnaHQpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvcih0aGlzLkVSUk9SX1JpZ2h0UGFydEV4cGVjdGVkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRPcGVyYW5kKCk6IE9wZXJhbmQge1xuICAgIHZhciBhciA9IHRoaXMucmVhZEFycmF5KCk7XG4gICAgaWYgKGFyKSByZXR1cm4gbmV3IE9wZXJhbmQoYXIpO1xuICAgIHZhciBzdHIgPSB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICBpZiAoIXN0cikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBhcmFtcyA9IHRoaXMucmVhZFBhcmFtZXRlcnMoKTtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICB2YXIgcmVzID0gbmV3IEZ1bmN0aW9uT3BlcmFuZChzdHIpO1xuICAgICAgcmVzLnBhcmFtZXRlcnMgPSBwYXJhbXM7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9wZXJhbmQoc3RyKTtcbiAgfVxuICBwcml2YXRlIHJlYWROb3RPcGVyYW5kKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuc2tpcCgpO1xuICAgIHZhciBzYXZlZEF0ID0gdGhpcy5hdDtcbiAgICB2YXIgc3RyID0gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgaWYgKCEhc3RyICYmIChzdHIudG9Mb3dlckNhc2UoKSA9PSBcIm5vdFwiIHx8IHN0ciA9PSBcIiFcIikpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuYXQgPSBzYXZlZEF0O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHJlYWRFeHByZXNzaW9uKCk6IG51bWJlciB7XG4gICAgdmFyIGlzTm90ID0gdGhpcy5yZWFkTm90T3BlcmFuZCgpO1xuICAgIGlmICh0aGlzLmF0ID49IHRoaXMubGVuZ3RoIHx8IHRoaXMuY2ggIT0gXCIoXCIpIHJldHVybiAwO1xuICAgIHRoaXMuYXQrKztcbiAgICB0aGlzLnB1c2hFeHByZXNzaW9uKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMucmVhZENvbmRpdGlvbnMoKTtcbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnNraXAoKTtcbiAgICAgIHJlcyA9IHRoaXMuY2ggPT0gPHN0cmluZz5cIilcIjtcbiAgICAgIHRoaXMuYXQrKztcbiAgICAgIHRoaXMucG9wRXhwcmVzc2lvbihpc05vdCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByaXZhdGUgcmVhZEV4cHJlc3Npb25PcGVyYW5kKGlzUmlnaHRDb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSk6IE9wZXJhbmQge1xuICAgIHZhciBleHByID0gdGhpcy5yZWFkRXhwcmVzc2lvbk9wZXJhbmRDb3JlKDAsIGlzUmlnaHRDb25kaXRpb24pO1xuICAgIGlmIChleHByID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGlmICghZXhwci5yaWdodCkgcmV0dXJuIGV4cHIubGVmdDtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuICBwcml2YXRlIHJlYWRFeHByZXNzaW9uT3BlcmFuZENvcmUoXG4gICAgYnJhY2tldHM6IG51bWJlciA9IDAsXG4gICAgaXNSaWdodENvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEV4cHJlc3Npb25PcGVyYW5kIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZHNDb3JlKFxuICAgICAgYnJhY2tldHMsXG4gICAgICBpc1JpZ2h0Q29uZGl0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlRXhwcmVzc2lvbk9wZXJhbmRDb3JlKGV4cHJlc3Npb25zKTtcbiAgfVxuICBwcml2YXRlIG1ha2VFeHByZXNzaW9uT3BlcmFuZENvcmUoXG4gICAgZXhwcmVzc2lvbnM6IEFycmF5PEV4cHJlc3Npb25PcGVyYW5kPlxuICApOiBFeHByZXNzaW9uT3BlcmFuZCB7XG4gICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZXhwcmVzc2lvbnMubGVuZ3RoID09IDEpIHJldHVybiBleHByZXNzaW9uc1swXTtcbiAgICB2YXIgcmVzID0gbmV3IEV4cHJlc3Npb25PcGVyYW5kKCk7XG4gICAgcmVzLmxlZnQgPSBleHByZXNzaW9uc1swXS5sZWZ0O1xuICAgIHJlcy5vcGVyYXRvciA9IGV4cHJlc3Npb25zWzBdLm9wZXJhdG9yO1xuICAgIHRoaXMuYnVpbGRFeHByZXNzaW9uQmluYXJ5VHJlZShleHByZXNzaW9ucywgMSwgcmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgYnVpbGRFeHByZXNzaW9uQmluYXJ5VHJlZShcbiAgICBsaXN0OiBBcnJheTxFeHByZXNzaW9uT3BlcmFuZD4sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnQ6IEV4cHJlc3Npb25PcGVyYW5kXG4gICkge1xuICAgIGlmIChpbmRleCA+PSBsaXN0Lmxlbmd0aCkgcmV0dXJuO1xuICAgIHZhciByaWdodCA9IGxpc3RbaW5kZXhdLmxlZnQ7XG4gICAgaWYgKGluZGV4ID09IGxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgcGFyZW50LnJpZ2h0ID0gcmlnaHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvcGVyYXRvciA9IGxpc3RbaW5kZXhdLm9wZXJhdG9yO1xuICAgIHZhciBleHByID0gbmV3IEV4cHJlc3Npb25PcGVyYW5kKCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0hpZ2hQcmlvcml0eU9wZXJhbmQocGFyZW50Lm9wZXJhdG9yKSAmJlxuICAgICAgIXRoaXMuaXNIaWdoUHJpb3JpdHlPcGVyYW5kKG9wZXJhdG9yKVxuICAgICkge1xuICAgICAgZXhwci5sZWZ0ID0gcGFyZW50LmxlZnQ7XG4gICAgICBleHByLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICBleHByLm9wZXJhdG9yID0gcGFyZW50Lm9wZXJhdG9yO1xuICAgICAgcGFyZW50Lm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICBwYXJlbnQubGVmdCA9IGV4cHI7XG4gICAgICB0aGlzLmJ1aWxkRXhwcmVzc2lvbkJpbmFyeVRyZWUobGlzdCwgaW5kZXggKyAxLCBwYXJlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByLmxlZnQgPSByaWdodDtcbiAgICAgIGV4cHIub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgIHBhcmVudC5yaWdodCA9IGV4cHI7XG4gICAgICB0aGlzLmJ1aWxkRXhwcmVzc2lvbkJpbmFyeVRyZWUobGlzdCwgaW5kZXggKyAxLCBleHByKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZWFkRXhwcmVzc2lvbk9wZXJhbmRzQ29yZShcbiAgICBicmFja2V0czogbnVtYmVyLFxuICAgIGlzUmlnaHRDb25kaXRpb246IGJvb2xlYW5cbiAgKTogQXJyYXk8RXhwcmVzc2lvbk9wZXJhbmQ+IHtcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PEV4cHJlc3Npb25PcGVyYW5kPigpO1xuICAgIHZhciBvcGVyYW5kID0gbnVsbDtcbiAgICB2YXIgb3BlcmF0b3IgPSBudWxsO1xuICAgIHdoaWxlICh0aGlzLmF0IDw9IHRoaXMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5pc0Nsb3NlQnJhY2tldCh0aGlzLmNoKSkge1xuICAgICAgICB0aGlzLmF0Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5za2lwKCk7XG4gICAgICBpZiAodGhpcy5pc09wZW5CcmFja2V0KHRoaXMuY2gpKSB7XG4gICAgICAgIHRoaXMuYXQrKztcbiAgICAgICAgb3BlcmFuZCA9IHRoaXMucmVhZEV4cHJlc3Npb25PcGVyYW5kQ29yZShicmFja2V0cyArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmFuZCA9IHRoaXMucmVhZE9wZXJhbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3BlcmFuZCkge1xuICAgICAgICB0aGlzLm5leHRPbkNsb3NlQnJhY2tldHMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvcGVyYXRvciA9IHRoaXMucmVhZE9wZXJhbmRPcGVyYXRvcigpO1xuICAgICAgaWYgKCFvcGVyYXRvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWlzUmlnaHRDb25kaXRpb24gJiZcbiAgICAgICAgICB0aGlzLm5leHRPbkNsb3NlQnJhY2tldHMoKSAmJlxuICAgICAgICAgIGJyYWNrZXRzID09IDAgJiZcbiAgICAgICAgICB0aGlzLmV4cHJlc3Npb25Ob2Rlcy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucG9wRXhwcmVzc2lvbihmYWxzZSk7XG4gICAgICAgICAgdmFyIGV4cHIgPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgICAgICBleHByLmxlZnQgPSBvcGVyYW5kO1xuICAgICAgICAgIHJlcy5wdXNoKGV4cHIpO1xuICAgICAgICAgIG9wZXJhbmQgPSB0aGlzLm1ha2VFeHByZXNzaW9uT3BlcmFuZENvcmUocmVzKTtcbiAgICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgICBvcGVyYXRvciA9IHRoaXMucmVhZE9wZXJhbmRPcGVyYXRvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3BlcmF0b3IpIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGV4cHIgPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgIGV4cHIubGVmdCA9IG9wZXJhbmQ7XG4gICAgICBleHByLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICByZXMucHVzaChleHByKTtcbiAgICB9XG4gICAgaWYgKCEhb3BlcmFuZCkge1xuICAgICAgdmFyIGV4cHIgPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgIGV4cHIubGVmdCA9IG9wZXJhbmQ7XG4gICAgICByZXMucHVzaChleHByKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIG5leHRPbkNsb3NlQnJhY2tldHMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDbG9zZUJyYWNrZXQodGhpcy5jaCkpIHtcbiAgICAgIHRoaXMuYXQrKztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY2goKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0LmNoYXJBdCh0aGlzLmF0KTtcbiAgfVxuICBwcml2YXRlIHNraXAoKSB7XG4gICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzU3BhY2UodGhpcy5jaCkpIHRoaXMuYXQrKztcbiAgfVxuICBwcml2YXRlIGlzU3BhY2UoYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGMgPT0gXCIgXCIgfHwgYyA9PSBcIlxcblwiIHx8IGMgPT0gXCJcXHRcIiB8fCBjID09IFwiXFxyXCI7XG4gIH1cbiAgcHJpdmF0ZSBpc1F1b3RlcyhjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYyA9PSBcIidcIiB8fCBjID09ICdcIic7XG4gIH1cbiAgcHJpdmF0ZSBpc0NvbW1hKGM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjID09IFwiLFwiO1xuICB9XG4gIHByaXZhdGUgaXNPcGVyYXRvckNoYXIoYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgPT0gXCI+XCIgfHxcbiAgICAgIGMgPT0gXCI8XCIgfHxcbiAgICAgIGMgPT0gXCI9XCIgfHxcbiAgICAgIGMgPT0gXCIhXCIgfHxcbiAgICAgIGMgPT0gXCIrXCIgfHxcbiAgICAgIGMgPT0gXCItXCIgfHxcbiAgICAgIGMgPT0gXCIqXCIgfHxcbiAgICAgIGMgPT0gXCJeXCIgfHxcbiAgICAgIGMgPT0gXCIvXCIgfHxcbiAgICAgIGMgPT0gXCIlXCJcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNPcGVuQnJhY2tldChjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYyA9PSBcIihcIjtcbiAgfVxuICBwcml2YXRlIGlzQ2xvc2VCcmFja2V0KGM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjID09IFwiKVwiO1xuICB9XG4gIHByaXZhdGUgaXNCcmFja2V0cyhjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09wZW5CcmFja2V0KGMpIHx8IHRoaXMuaXNDbG9zZUJyYWNrZXQoYyk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkQXJyYXkoKTogQXJyYXk8YW55PiB7XG4gICAgdGhpcy5za2lwKCk7XG4gICAgaWYgKHRoaXMuYXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmNoICE9PSBcIltcIikgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5hdCsrO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5hdCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICB2YXIgc3RyID0gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgICBpZiAoc3RyKSByZXMucHVzaChzdHIpO1xuICAgICAgdGhpcy5za2lwKCk7XG4gICAgICB2YXIgYyA9IHRoaXMuY2g7XG4gICAgICBpZiAoYyA9PSBcIixcIikgdGhpcy5hdCsrO1xuICAgICAgaWYgKGMgPT0gXCJdXCIpIHtcbiAgICAgICAgdGhpcy5hdCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICB0aGlzLnNraXAoKTtcbiAgICBpZiAodGhpcy5hdCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5hdDtcbiAgICB2YXIgaGFzUXVvdGVzID0gdGhpcy5pc1F1b3Rlcyh0aGlzLmNoKTtcbiAgICB2YXIgaGFzQnJhY2VzID0gdGhpcy5jaCA9PSBcIntcIjtcbiAgICBpZiAoaGFzUXVvdGVzKSB0aGlzLmF0Kys7XG4gICAgdmFyIGlzRmlyc3RPcENoID0gdGhpcy5pc09wZXJhdG9yQ2hhcih0aGlzLmNoKTtcbiAgICB2YXIgaXNQcmV2RXNwYXBlID0gZmFsc2U7XG4gICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCkge1xuICAgICAgaWYgKGhhc0JyYWNlcykge1xuICAgICAgICB2YXIgaXNCcmFjZSA9IHRoaXMuY2ggPT0gXCJ9XCI7XG4gICAgICAgIHRoaXMuYXQrKztcbiAgICAgICAgaWYgKGlzQnJhY2UpIGJyZWFrO1xuICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNRdW90ZXMgJiYgdGhpcy5pc1NwYWNlKHRoaXMuY2gpKSBicmVhaztcbiAgICAgIGlmICh0aGlzLmlzUXVvdGVzKHRoaXMuY2gpICYmICFpc1ByZXZFc3BhcGUpIHtcbiAgICAgICAgaWYgKGhhc1F1b3RlcykgdGhpcy5hdCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICghaGFzUXVvdGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmNoICE9IFwiLVwiICYmIGlzRmlyc3RPcENoICE9IHRoaXMuaXNPcGVyYXRvckNoYXIodGhpcy5jaCkpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmICh0aGlzLmlzQnJhY2tldHModGhpcy5jaCkgfHwgdGhpcy5pc0NvbW1hKHRoaXMuY2gpKSBicmVhaztcbiAgICAgICAgaWYgKHRoaXMuY2ggPT09IFwiXVwiKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlzUHJldkVzcGFwZSA9IHRoaXMuY2ggPT09IFwiXFxcXFwiO1xuICAgICAgdGhpcy5hdCsrO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdCA8PSBzdGFydCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlcyA9IHRoaXMudGV4dC5zdWJzdHIoc3RhcnQsIHRoaXMuYXQgLSBzdGFydCk7XG4gICAgaWYgKHJlcykge1xuICAgICAgaWYgKHJlcy5sZW5ndGggPiAxICYmIHRoaXMuaXNRdW90ZXMocmVzWzBdKSkge1xuICAgICAgICB2YXIgbGVuID0gcmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmICh0aGlzLmlzUXVvdGVzKHJlc1tyZXMubGVuZ3RoIC0gMV0pKSBsZW4tLTtcbiAgICAgICAgcmVzID0gcmVzLnN1YnN0cigxLCBsZW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcmVhZFBhcmFtZXRlcigpOiBPcGVyYW5kIHtcbiAgICB2YXIgb3BlbmVkQnJhY2tldHMgPSAwO1xuICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5hdDtcbiAgICB3aGlsZSAodGhpcy5hdCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5pc09wZW5CcmFja2V0KHRoaXMuY2gpKSBvcGVuZWRCcmFja2V0cysrO1xuICAgICAgaWYgKHRoaXMuaXNDbG9zZUJyYWNrZXQodGhpcy5jaCkpIG9wZW5lZEJyYWNrZXRzLS07XG4gICAgICBpZiAob3BlbmVkQnJhY2tldHMgPCAwKSBicmVhaztcbiAgICAgIGlmIChvcGVuZWRCcmFja2V0cyA9PT0gMCAmJiB0aGlzLmNoID09PSBcIixcIikgYnJlYWs7XG4gICAgICB0aGlzLmF0Kys7XG4gICAgfVxuICAgIHZhciBwYXJhbVN0ciA9IHRoaXMudGV4dC5zdWJzdHJpbmcoc3RhcnRJbmRleCwgdGhpcy5hdCk7XG4gICAgaWYgKCFwYXJhbVN0cikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBhcnNlciA9IG5ldyBDb25kaXRpb25zUGFyc2VyKCk7XG4gICAgdmFyIG5vZGUgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xuICAgIGlmIChwYXJzZXIucGFyc2UocGFyYW1TdHIsIG5vZGUpKSB7XG4gICAgICByZXR1cm4gbmV3IENvbmRpdGlvbk9wZXJhbmQobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHBhcmFtU3RyKTtcbiAgfVxuICBwcml2YXRlIHJlYWRQYXJhbWV0ZXJzKCk6IEFycmF5PE9wZXJhbmQ+IHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuQnJhY2tldCh0aGlzLmNoKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICh0aGlzLmF0IDwgdGhpcy5sZW5ndGggJiYgIXRoaXMuaXNDbG9zZUJyYWNrZXQodGhpcy5jaCkpIHtcbiAgICAgIHRoaXMuYXQrKztcbiAgICAgIHZhciBvcGVyYW5kID0gdGhpcy5yZWFkUGFyYW1ldGVyKCk7IC8vdGhpcy5yZWFkRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgIGlmIChvcGVyYW5kKSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKG9wZXJhbmQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmF0Kys7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuICBwcml2YXRlIGlzSGlnaFByaW9yaXR5T3BlcmFuZChvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG9wID09IFwiKlwiIHx8IG9wID09IFwiXlwiIHx8IG9wID09IFwiL1wiIHx8IG9wID09IFwiJVwiO1xuICB9XG4gIHByaXZhdGUgcmVhZE9wZXJhbmRPcGVyYXRvcigpOiBzdHJpbmcge1xuICAgIHRoaXMuc2tpcCgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2ggPT0gXCIrXCIgfHxcbiAgICAgIHRoaXMuY2ggPT0gXCItXCIgfHxcbiAgICAgIHRoaXMuY2ggPT0gXCIqXCIgfHxcbiAgICAgIHRoaXMuY2ggPT0gXCJeXCIgfHxcbiAgICAgIHRoaXMuY2ggPT0gXCIvXCIgfHxcbiAgICAgIHRoaXMuY2ggPT0gXCIlXCJcbiAgICApIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLmNoO1xuICAgICAgdGhpcy5hdCsrO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSByZWFkT3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICB0aGlzLnNraXAoKTtcbiAgICB2YXIgY3VyQXQgPSB0aGlzLmF0O1xuICAgIHZhciBvcCA9IHRoaXMucmVhZFN0cmluZygpO1xuICAgIGlmICghb3ApIHJldHVybiBudWxsO1xuICAgIG9wID0gb3AudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3AgPT0gXCI+XCIpIG9wID0gXCJncmVhdGVyXCI7XG4gICAgaWYgKG9wID09IFwiPFwiKSBvcCA9IFwibGVzc1wiO1xuICAgIGlmIChvcCA9PSBcIj49XCIgfHwgb3AgPT0gXCI9PlwiKSBvcCA9IFwiZ3JlYXRlcm9yZXF1YWxcIjtcbiAgICBpZiAob3AgPT0gXCI8PVwiIHx8IG9wID09IFwiPTxcIikgb3AgPSBcImxlc3NvcmVxdWFsXCI7XG4gICAgaWYgKG9wID09IFwiPVwiIHx8IG9wID09IFwiPT1cIikgb3AgPSBcImVxdWFsXCI7XG4gICAgaWYgKG9wID09IFwiPD5cIiB8fCBvcCA9PSBcIiE9XCIpIG9wID0gXCJub3RlcXVhbFwiO1xuICAgIGlmIChvcCA9PSBcImVxdWFsc1wiKSBvcCA9IFwiZXF1YWxcIjtcbiAgICBpZiAob3AgPT0gXCJub3RlcXVhbHNcIikgb3AgPSBcIm5vdGVxdWFsc1wiO1xuICAgIGlmIChvcCA9PSBcImNvbnRhaW5cIiB8fCBvcCA9PSBcIio9XCIpIG9wID0gXCJjb250YWluc1wiO1xuICAgIGlmIChvcCA9PSBcIm5vdGNvbnRhaW5cIikgb3AgPSBcIm5vdGNvbnRhaW5zXCI7XG4gICAgaWYgKENvbmRpdGlvbi5pc0NvcnJlY3RPcGVyYXRvcihvcCkpIHJldHVybiBvcDtcbiAgICB0aGlzLmF0ID0gY3VyQXQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSByZWFkQ29ubmVjdGl2ZSgpOiBzdHJpbmcge1xuICAgIHZhciBjb24gPSB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICBpZiAoIWNvbikgcmV0dXJuIG51bGw7XG4gICAgY29uID0gY29uLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGNvbiA9PSBcIiZcIiB8fCBjb24gPT0gXCImJlwiKSBjb24gPSBcImFuZFwiO1xuICAgIGlmIChjb24gPT0gXCJ8XCIgfHwgY29uID09IFwifHxcIikgY29uID0gXCJvclwiO1xuICAgIGlmIChjb24gIT0gXCJhbmRcIiAmJiBjb24gIT0gXCJvclwiKSBjb24gPSBudWxsO1xuICAgIHJldHVybiBjb247XG4gIH1cbiAgcHJpdmF0ZSBwdXNoRXhwcmVzc2lvbigpIHtcbiAgICB2YXIgbm9kZSA9IG51bGw7XG4gICAgdGhpcy5leHByZXNzaW9uTm9kZXMucHVzaChub2RlKTtcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICB9XG4gIHByaXZhdGUgbWFrZU5vZGVDb25kaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLm5vZGUgfHwgIXRoaXMubm9kZS5jaGlsZHJlbikge1xuICAgICAgdGhpcy5ub2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcbiAgICAgIHRoaXMuZXhwcmVzc2lvbk5vZGVzW3RoaXMuZXhwcmVzc2lvbk5vZGVzLmxlbmd0aCAtIDFdID0gdGhpcy5ub2RlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBvcEV4cHJlc3Npb24oaXNOb3Q6IGJvb2xlYW4pIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuZXhwcmVzc2lvbk5vZGVzLnBvcCgpO1xuICAgIHRoaXMubm9kZSA9IHRoaXMuZXhwcmVzc2lvbk5vZGVzW3RoaXMuZXhwcmVzc2lvbk5vZGVzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmlzTm90ID0gaXNOb3Q7XG4gICAgICB0aGlzLm1ha2VOb2RlQ29uZGl0aW9uKCk7XG4gICAgICB0aGlzLm5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRDb25kaXRpb24oYzogQ29uZGl0aW9uKSB7XG4gICAgdGhpcy5tYWtlTm9kZUNvbmRpdGlvbigpO1xuICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKGMpO1xuICB9XG4gIHByaXZhdGUgYWRkQ29ubmVjdGl2ZShjb246IHN0cmluZykge1xuICAgIHRoaXMubWFrZU5vZGVDb25kaXRpb24oKTtcbiAgICBpZiAodGhpcy5ub2RlLmNoaWxkcmVuLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRoaXMubm9kZS5jb25uZWN0aXZlID0gY29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5ub2RlLmNvbm5lY3RpdmUgIT0gY29uKSB7XG4gICAgICAgIHZhciBvbGRDb24gPSB0aGlzLm5vZGUuY29ubmVjdGl2ZTtcbiAgICAgICAgdmFyIG9sZENoaWxkcmVuID0gdGhpcy5ub2RlLmNoaWxkcmVuO1xuICAgICAgICB0aGlzLm5vZGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5ub2RlLmNvbm5lY3RpdmUgPSBjb247XG4gICAgICAgIHZhciBvbGROb2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcbiAgICAgICAgb2xkTm9kZS5jb25uZWN0aXZlID0gb2xkQ29uO1xuICAgICAgICBvbGROb2RlLmNoaWxkcmVuID0gb2xkQ2hpbGRyZW47XG4gICAgICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKG9sZE5vZGUpO1xuICAgICAgICB2YXIgbmV3Tm9kZSA9IG5ldyBDb25kaXRpb25Ob2RlKCk7XG4gICAgICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICB0aGlzLm5vZGUgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnNQYXJzZXIudHMiLCIvKipcbiAqIFRoZSBjbGFzcyBjb250YWlucyBtZXRob2RzIHRvIHdvcmsgd2l0aCB3d3cuZHhzdXJ2ZXkuY29tIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBkeFN1cnZleVNlcnZpY2Uge1xuICBwdWJsaWMgc3RhdGljIHNlcnZpY2VVcmw6IHN0cmluZyA9IFwiaHR0cHM6Ly9keHN1cnZleWFwaS5henVyZXdlYnNpdGVzLm5ldC9hcGkvU3VydmV5XCI7XG4gIC8vcHVibGljIHN0YXRpYyBzZXJ2aWNlVXJsOiBzdHJpbmcgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6NTA0ODgvYXBpL1N1cnZleVwiO1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBsb2FkU3VydmV5KFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0U3VydmV5P3N1cnZleUlkPVwiICsgc3VydmV5SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgeGhyLnJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleUpzb25BbmRJc0NvbXBsZXRlZChcbiAgICBzdXJ2ZXlJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgc3VydmV5SnNvbjogYW55LFxuICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcbiAgICAgIFwiR0VUXCIsXG4gICAgICBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArXG4gICAgICAgIFwiL2dldFN1cnZleUFuZElzQ29tcGxldGVkP3N1cnZleUlkPVwiICtcbiAgICAgICAgc3VydmV5SWQgK1xuICAgICAgICBcIiZjbGllbnRJZD1cIiArXG4gICAgICAgIGNsaWVudElkXG4gICAgKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgdmFyIHN1cnZleUpzb24gPSByZXN1bHQgPyByZXN1bHQuc3VydmV5IDogbnVsbDtcbiAgICAgIHZhciBpc0NvbXBsZXRlZCA9IHJlc3VsdCA/IHJlc3VsdC5pc0NvbXBsZXRlZCA6IG51bGw7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHN1cnZleUpzb24sIGlzQ29tcGxldGVkLCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyxcbiAgICByZXN1bHQ6IEpTT04sXG4gICAgb25TZW5kUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkgPT4gdm9pZCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvcG9zdC9cIik7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHZhciBkYXRhID0geyBwb3N0SWQ6IHBvc3RJZCwgc3VydmV5UmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH07XG4gICAgaWYgKGNsaWVudElkKSAoPGFueT5kYXRhKVtcImNsaWVudElkXCJdID0gY2xpZW50SWQ7XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCkgKDxhbnk+ZGF0YSlbXCJpc1BhcnRpYWxDb21wbGV0ZWRcIl0gPSB0cnVlO1xuICAgIHZhciBkYXRhU3RyaW5naWZ5OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xuICAgICAgb25TZW5kUmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gIH1cbiAgcHVibGljIHNlbmRGaWxlKFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFvblNlbmRGaWxlKSByZXR1cm47XG4gICAgICBvblNlbmRGaWxlKHhoci5zdGF0dXMgPT0gMjAwLCBKU09OLnBhcnNlKHhoci5yZXNwb25zZSkpO1xuICAgIH07XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvdXBsb2FkL1wiLCB0cnVlKTtcbiAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcInBvc3RJZFwiLCBwb3N0SWQpO1xuICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVzdWx0KFxuICAgIHJlc3VsdElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uR2V0UmVzdWx0OiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgZGF0YTogYW55LFxuICAgICAgZGF0YUxpc3Q6IEFycmF5PGFueT4sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJm5hbWU9XCIgKyBuYW1lO1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0UmVzdWx0P1wiICsgZGF0YSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgdmFyIGxpc3QgPSBudWxsO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0LlF1ZXN0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGVsID0geyBuYW1lOiBrZXksIHZhbHVlOiByZXN1bHQuUXVlc3Rpb25SZXN1bHRba2V5XSB9O1xuICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uR2V0UmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIGxpc3QsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBpc0NvbXBsZXRlZChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Jc0NvbXBsZXRlZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJmNsaWVudElkPVwiICsgY2xpZW50SWQ7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9pc0NvbXBsZXRlZD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRnVuY3Rpb25GYWN0b3J5ID0gbmV3IEZ1bmN0aW9uRmFjdG9yeSgpO1xuICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKSA9PiBhbnk+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgZnVuYzogKHBhcmFtczogYW55W10pID0+IGFueSkge1xuICAgIHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdID0gZnVuYztcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlcihuYW1lOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV07XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuZnVuY3Rpb25IYXNoID0ge307XG4gIH1cbiAgcHVibGljIGdldEFsbCgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuZnVuY3Rpb25IYXNoKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcbiAgfVxuICBwdWJsaWMgcnVuKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IGFueVtdLFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBhbnkge1xuICAgIHZhciBmdW5jID0gdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV07XG4gICAgaWYgKCFmdW5jKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgY2xhc3NSdW5uZXIgPSB7XG4gICAgICBmdW5jOiBmdW5jXG4gICAgfTtcblxuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAoPGFueT5jbGFzc1J1bm5lcilba2V5XSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzUnVubmVyLmZ1bmMocGFyYW1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdW0ocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBwYXJhbXNbaV07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcInN1bVwiLCBzdW0pO1xuXG5mdW5jdGlvbiBhdmcocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBwYXJhbXNbaV07XG4gIH1cbiAgcmV0dXJuIHBhcmFtcy5sZW5ndGggPiAwID8gcmVzIC8gcGFyYW1zLmxlbmd0aCA6IDA7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhdmdcIiwgYXZnKTtcblxuZnVuY3Rpb24gc3VtSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKHBhcmFtcy5sZW5ndGggIT0gMikgcmV0dXJuIDA7XG4gIHZhciBhcnIgPSBwYXJhbXNbMF07XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm47XG4gIHZhciBuYW1lID0gcGFyYW1zWzFdO1xuICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIgJiYgIShuYW1lIGluc3RhbmNlb2YgU3RyaW5nKSkgcmV0dXJuIDA7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gYXJyW2ldO1xuICAgIGlmIChpdGVtICYmIGl0ZW1bPHN0cmluZz5uYW1lXSkge1xuICAgICAgcmVzICs9IGl0ZW1bPHN0cmluZz5uYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcInN1bUluQXJyYXlcIiwgc3VtSW5BcnJheSk7XG5cbmZ1bmN0aW9uIGlpZihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXJhbXNbMF0gPyBwYXJhbXNbMV0gOiBwYXJhbXNbMl07XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpaWZcIiwgaWlmKTtcblxuZnVuY3Rpb24gYWdlKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICghcGFyYW1zWzBdKSByZXR1cm4gbnVsbDtcbiAgdmFyIGJpcnRoRGF5ID0gbmV3IERhdGUocGFyYW1zWzBdKTtcbiAgdmFyIGFnZURpZk1zID0gRGF0ZS5ub3coKSAtIGJpcnRoRGF5LmdldFRpbWUoKTtcbiAgdmFyIGFnZURhdGUgPSBuZXcgRGF0ZShhZ2VEaWZNcyk7IC8vIG1pbGlzZWNvbmRzIGZyb20gZXBvY2hcbiAgcmV0dXJuIE1hdGguYWJzKGFnZURhdGUuZ2V0VVRDRnVsbFllYXIoKSAtIDE5NzApO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiYWdlXCIsIGFnZSk7XG5cbmZ1bmN0aW9uIGlzQ29udGFpbmVyUmVhZHkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIGlmICghcGFyYW1zICYmIHBhcmFtcy5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2U7XG4gIGlmICghcGFyYW1zWzBdIHx8ICF0aGlzLnN1cnZleSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgbmFtZSA9IHBhcmFtc1swXTtcbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuc3VydmV5LmdldFBhZ2VCeU5hbWUobmFtZSk7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSB0aGlzLnN1cnZleS5nZXRQYW5lbEJ5TmFtZShuYW1lKTtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybiBmYWxzZTtcbiAgdmFyIHF1ZXN0aW9ucyA9IGNvbnRhaW5lci5xdWVzdGlvbnM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHF1ZXN0aW9uc1tpXS5oYXNFcnJvcnMoZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpc0NvbnRhaW5lclJlYWR5XCIsIGlzQ29udGFpbmVyUmVhZHkpO1xuXG5mdW5jdGlvbiBpc0Rpc3BsYXlNb2RlKCkge1xuICByZXR1cm4gdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEaXNwbGF5TW9kZTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlzRGlzcGxheU1vZGVcIiwgaXNEaXNwbGF5TW9kZSk7XG5cbmZ1bmN0aW9uIGN1cnJlbnREYXRlKCkge1xuICByZXR1cm4gbmV3IERhdGUoKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImN1cnJlbnREYXRlXCIsIGN1cnJlbnREYXRlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuLy9pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVuZ2xpc2hTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90aGVyIChkZXNjcmliZSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5vbmVcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWN0IEFsbFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gb2YgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIlRoZXJlIGlzIG5vIHZpc2libGUgcGFnZSBvciBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRoYW5rIHlvdSBmb3IgY29tcGxldGluZyB0aGUgc3VydmV5IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiT3VyIHJlY29yZHMgc2hvdyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY29tcGxldGVkIHRoaXMgc3VydmV5LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxvYWRpbmcgU3VydmV5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkNob29zZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBhbnN3ZXIgdGhlIHF1ZXN0aW9uLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQbGVhc2UgYW5zd2VyIGF0IGxlYXN0IG9uZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHF1ZXN0aW9ucyBpbiBhbGwgcm93cy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlRoZSB2YWx1ZSBzaG91bGQgYmUgbnVtZXJpYy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIGxlc3MgdGhhbiB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbW9yZSB0aGFuIHswfSBhbmQgbGVzcyB0aGFuIHsxfSBjaGFyYWN0ZXJzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlBsZWFzZSBmaWxsIGluIGF0IGxlYXN0IHswfSByb3dzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IHswfSB2YXJpYW50cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBubyBtb3JlIHRoYW4gezB9IHZhcmlhbnRzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVGhlIGV4cHJlc3Npb246IHswfSBzaG91bGQgcmV0dXJuICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgZGF0YSBvciB0aGUgJ3BhdGgnIHByb3BlcnR5IGlzIGluY29ycmVjdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIlRoZSBmaWxlIHNpemUgc2hvdWxkIG5vdCBleGNlZWQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGVudGVyIHRoZSBvdGhlciB2YWx1ZS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIllvdXIgZmlsZSBpcyB1cGxvYWRpbmcuIFBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMb2FkaW5nLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiQ2hvb3NlIGZpbGUocykuLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCJEbyB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHJlY29yZD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUaGlzIHZhbHVlIHNob3VsZCBiZSB1bmlxdWUuXCIsXG4gIGFkZENvbHVtbjogXCJBZGQgY29sdW1uXCIsXG4gIGFkZFJvdzogXCJBZGQgcm93XCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVcIixcbiAgYWRkUGFuZWw6IFwiQWRkIG5ld1wiLFxuICByZW1vdmVQYW5lbDogXCJSZW1vdmVcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5cIixcbiAgbWF0cml4X3JvdzogXCJSb3dcIixcbiAgc2F2aW5nRGF0YTogXCJUaGUgcmVzdWx0cyBhcmUgc2F2aW5nIG9uIHRoZSBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkFuIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB0aGUgcmVzdWx0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGhlIHJlc3VsdHMgd2VyZSBzYXZlZCBzdWNjZXNzZnVsbHkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUcnkgYWdhaW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UgYW5kIHsxfSBpbiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZSBhbmQgezJ9IG9mIHszfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBpbiB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkNsZWFuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJDbGVhclwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJSZW1vdmUgdGhpcyBmaWxlXCJcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxuLy9zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4vL3N1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJFbmdsaXNoXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2VuZ2xpc2gudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggYmFzZSBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPFRSb3csIFRDb2x1bW4+IGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwcm90ZWN0ZWQgY29sdW1uc1ZhbHVlOiBBcnJheTxUQ29sdW1uPjtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkQ29sdW1uczogQXJyYXk8VENvbHVtbj47XG4gIHByb3RlY3RlZCBmaWx0ZXJlZFJvd3M6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByb3RlY3RlZCBnZW5lcmF0ZWRWaXNpYmxlUm93czogQXJyYXk8VFJvdz4gPSBudWxsO1xuICBwdWJsaWMgdmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbHVtblZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IG51bGw7XG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSBudWxsO1xuICAgIHRoaXMuY29sdW1uc1ZhbHVlID0gdGhpcy5jcmVhdGVDb2x1bW5WYWx1ZXMoKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJyb3dzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4YmFzZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbHVtbnMuIEEgY29sdW1uIGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAqL1xuICBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zVmFsdWU7XG4gIH1cbiAgc2V0IGNvbHVtbnMobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiAhIXRoaXMuZmlsdGVyZWRDb2x1bW5zID8gdGhpcy5maWx0ZXJlZENvbHVtbnMgOiB0aGlzLmNvbHVtbnM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJvd3MuIEEgcm93IGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAqL1xuICBnZXQgcm93cygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuICBzZXQgcm93cyhuZXdWYWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgbmV3VmFsdWUpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVJvd3MoKTogQXJyYXk8VFJvdz4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2aXNpYmxlIHJvd3MgYXMgbW9kZWwgb2JqZWN0cy5cbiAgICogQHNlZSByb3dzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCk6IEFycmF5PFRSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIHJvdyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3NWaXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1Zpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3NWaXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzVmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJdCBydW5zIGFnYWluc3QgZWFjaCBjb2x1bW4gaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgdmlzaWJsZSBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBpbnZpc2libGUuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgY29sdW1uc1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uc1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKSB7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgIXRoaXMuZGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgaGFzQ2hhbmdlcyA9IHRoaXMucnVuQ29uZGl0aW9uc0ZvclJvd3ModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBoYXNDaGFuZ2VzID0gdGhpcy5ydW5Db25kaXRpb25zRm9yQ29sdW1ucyh2YWx1ZXMsIHByb3BlcnRpZXMpIHx8IGhhc0NoYW5nZXM7XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmICghIXRoaXMuZmlsdGVyZWRDb2x1bW5zIHx8ICEhdGhpcy5maWx0ZXJlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZXM7XG4gIH1cbiAgcHJpdmF0ZSBydW5Db25kaXRpb25zRm9yUm93cyhcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBydW5uZXIgPSAhIXRoaXMucm93c1Zpc2libGVJZlxuICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMucm93c1Zpc2libGVJZilcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IFtdO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMucm93cyxcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5yb3dzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZDtcbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNGb3JDb2x1bW5zKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHJ1bm5lciA9ICEhdGhpcy5jb2x1bW5zVmlzaWJsZUlmXG4gICAgICA/IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5jb2x1bW5zVmlzaWJsZUlmKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gW107XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5jb2x1bW5zLFxuICAgICAgPGFueT50aGlzLmZpbHRlcmVkQ29sdW1ucyxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICApO1xuICAgIGlmICh0aGlzLmZpbHRlcmVkQ29sdW1ucy5sZW5ndGggPT09IHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQ7XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbCA9IG51bGw7XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIHZhciBjb2x1bW5zID0gISF0aGlzLmZpbHRlcmVkQ29sdW1ucyA/IHRoaXMuZmlsdGVyZWRDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkgJiZcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKGNvbHVtbnMsIHZhbFtrZXldKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChuZXdWYWwgPT0gbnVsbCkgbmV3VmFsID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbClba2V5XSA9IHZhbFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm1hdHJpeGJhc2VcIixcbiAgW1wiY29sdW1uc1Zpc2libGVJZjpjb25kaXRpb25cIiwgXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiXSxcbiAgdW5kZWZpbmVkLFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbWFydGl4QmFzZS50cyIsImltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBib29sZWFuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Cb29sZWFuTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibGFiZWxcIiwgdGhpcywgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gY2hlY2sgd2lsbCBiZSByZW5kZXJlZCBpbiBpbmRldGVybWluYXRlIG1vZGUuIHZhbHVlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHF1ZXN0aW9uIHZhbHVlIGluIDMgbW9kZXM6IGluZGV0ZXJtaW5hdGUgKHZhbHVlIGlzIGVtcHR5KSwgdHJ1ZSAoY2hlY2sgaXMgc2V0KSBhbmQgZmFsc2UgKGNoZWNrIGlzIHVuc2V0KS5cbiAgICogQHNlZSB2YWx1ZVRydWVcbiAgICogQHNlZSB2YWx1ZUZhbHNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrZWRWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPT0gdGhpcy5nZXRWYWx1ZVRydWUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoZWNrZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbCA9PSB0cnVlID8gdGhpcy5nZXRWYWx1ZVRydWUoKSA6IHRoaXMuZ2V0VmFsdWVGYWxzZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZSBjaGVjazogXCJpbmRldGVybWluYXRlXCIgLSBkZWZhdWx0ICh2YWx1ZSBpcyBlbXB0eS9udWxsKSwgXCJ0cnVlXCIgLSB2YWx1ZSBlcXVhbHMgdmFsdWVUcnVlIG9yIHRydWUsIFwiZmFsc2VcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZUZhbHNlIG9yIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIFwiaW5kZXRlcm1pbmF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJ0cnVlXCJcbiAgICAgID8gdGhpcy5nZXRWYWx1ZVRydWUoKVxuICAgICAgOiB0aGlzLmdldFZhbHVlRmFsc2UoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNoZWNrYm94IGxhYmVsLiBJZiBpdCBpcyBlbXB0eSBhbmQgc2hvd1RpdGxlIGlzIGZhbHNlIHRoZW4gdGl0bGUgaXMgcmVuZGVyZWRcbiAgICogQHNlZSBzaG93VGl0bGVcbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFiZWwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0xhYmVsKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsXCIpO1xuICB9XG4gIGdldCBsb2NEaXNwbGF5TGFiZWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIGlmICh0aGlzLmxvY0xhYmVsLnRleHQpIHJldHVybiB0aGlzLmxvY0xhYmVsO1xuICAgIHJldHVybiB0aGlzLnNob3dUaXRsZSA/IHRoaXMubG9jTGFiZWwgOiB0aGlzLmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgdGhlIHF1ZXN0aW9uIHRpdGxlLiBJdCBpcyBoaWRkZW4gYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZyb20gdHJ1ZSB3aGVuIGNoZWNrIGlzIHNldC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWVUcnVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlVHJ1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlVHJ1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlVHJ1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIGZhbHNlIHdoZW4gY2hlY2sgaXMgdW5zZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlRmFsc2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVGYWxzZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlRmFsc2UodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZUZhbHNlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZVRydWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVRydWUgPyB0aGlzLnZhbHVlVHJ1ZSA6IHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUZhbHNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVGYWxzZSA/IHRoaXMudmFsdWVGYWxzZSA6IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwidHJ1ZVwiKSB0aGlzLmNoZWNrZWRWYWx1ZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiZmFsc2VcIikgdGhpcy5jaGVja2VkVmFsdWUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJpbmRldGVybWluYXRlXCIpIHRoaXMudmFsdWUgPSBudWxsO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiYm9vbGVhblwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWZhdWx0VmFsdWU6ZHJvcGRvd25cIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJib29sZWFuRGVmYXVsdFZhbHVlXCIsXG4gICAgICBkZWZhdWx0OiBcImluZGV0ZXJtaW5hdGVcIixcbiAgICAgIGNob2ljZXM6IFtcImluZGV0ZXJtaW5hdGVcIiwgXCJmYWxzZVwiLCBcInRydWVcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJsYWJlbDp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbFwiIH0sXG4gICAgXCJzaG93VGl0bGU6Ym9vbGVhblwiLFxuICAgIFwidmFsdWVUcnVlXCIsXG4gICAgXCJ2YWx1ZUZhbHNlXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW5Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImJvb2xlYW5cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwiaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjaGVja2JveCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBwcml2YXRlIG5vbmVJdGVtVmFsdWU6IEl0ZW1WYWx1ZSA9IG5ldyBJdGVtVmFsdWUoXCJub25lXCIpO1xuICBwcml2YXRlIHNlbGVjdEFsbEl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcInNlbGVjdGFsbFwiKTtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBub25lSXRlbVRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibm9uZVRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgbm9uZUl0ZW1UZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9uZUl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5ub25lSXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLm5vbmVJdGVtVmFsdWUuc2V0TG9jVGV4dChub25lSXRlbVRleHQpO1xuXG4gICAgdmFyIHNlbGVjdEFsbEl0ZW1UZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwic2VsZWN0QWxsVGV4dFwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHNlbGVjdEFsbEl0ZW1UZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2VsZWN0QWxsSXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLnNlbGVjdEFsbEl0ZW0ubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMuc2VsZWN0QWxsSXRlbS5zZXRMb2NUZXh0KHNlbGVjdEFsbEl0ZW1UZXh0KTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJoYXNOb25lXCIsIFwibm9uZVRleHRcIiwgXCJoYXNTZWxlY3RBbGxcIiwgXCJzZWxlY3RBbGxUZXh0XCJdLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2VsZWN0IGFsbCBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzU2VsZWN0QWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbGVjdEFsbEl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGxJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vbmUgaXRlbS4gQnkgdXNpbmcgdGhpcyBwcm9wZXJ0eSwgeW91IG1heSBjaGFuZ2UgcHJvZ3JhbW1hdGljYWxseSBpdCdzIHZhbHVlIGFuZCB0ZXh0LlxuICAgKiBAc2VlIGhhc05vbmVcbiAgICovXG4gIHB1YmxpYyBnZXQgbm9uZUl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5ub25lSXRlbVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIGRpZmZlcmVudCB0ZXh0IGZvciBub25lIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vbmVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJub25lVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vbmVJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBub25lVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibm9uZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTm9uZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibm9uZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIFNlbGVjdCBBbGwgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwic2VsZWN0QWxsVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNlbGVjdEFsbEl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlbGVjdEFsbFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInNlbGVjdEFsbFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jU2VsZWN0QWxsVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJzZWxlY3RBbGxUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBcIlNlbGVjdCBBbGxcIiBpdGVtIG9uIHRoZSB0b3AuIElmIGVuZC11c2VyIGNoZWNrcyB0aGlzIGl0ZW0sIHRoZW4gYWxsIGl0ZW1zIGFyZSBjaGVja2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNTZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc1NlbGVjdEFsbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNTZWxlY3RBbGwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzU2VsZWN0QWxsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkXG4gICAqIEBzZWUgdG9nZ2xlU2VsZWN0QWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMubm9uZUl0ZW0pKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGFsbEl0ZW1Db3VudCA9IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmhhc090aGVyKSBhbGxJdGVtQ291bnQtLTtcbiAgICBpZiAodGhpcy5oYXNOb25lKSBhbGxJdGVtQ291bnQtLTtcbiAgICBpZiAodGhpcy5oYXNTZWxlY3RBbGwpIGFsbEl0ZW1Db3VudC0tO1xuICAgIHZhciBzZWxlY3RlZENvdW50ID0gdmFsLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pc0l0ZW1TZWxlY3RlZCh0aGlzLm90aGVySXRlbSkpIHNlbGVjdGVkQ291bnQtLTtcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA9PT0gYWxsSXRlbUNvdW50O1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbGxTZWxlY3RlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEl0IHdpbGwgc2VsZWN0IGFsbCBpdGVtcywgZXhjZXB0IG90aGVyIGFuZCBub25lLiBJZiBhbGwgaXRlbXMgaGF2ZSBiZWVuIGFscmVhZHkgc2VsZWN0ZWQgdGhlbiBpdCB3aWxsIGNsZWFyIHRoZSB2YWx1ZVxuICAgKiBAc2VlIGlzQWxsU2VsZWN0ZWRcbiAgICogQHNlZSBzZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gIXRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgfVxuICAvKipcbiAgICogU2VsZWN0IGFsbCBpdGVtcywgZXhjZXB0IG90aGVyIGFuZCBub25lLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpIHtcbiAgICB2YXIgdmFsID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMudmlzaWJsZUNob2ljZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gPT09IHRoaXMubm9uZUl0ZW0gfHxcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5vdGhlckl0ZW0gfHxcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5zZWxlY3RBbGxJdGVtXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFsLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgdGhlIFwiTm9uZVwiIGl0ZW0gb24gdGhlIGJvdHRvbS4gSWYgZW5kLXVzZXIgY2hlY2tzIHRoaXMgaXRlbSwgYWxsIG90aGVyIGl0ZW1zIHdvdWxkIGJlIHVuY2hlY2tlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzTm9uZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNOb25lKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc05vbmVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0ZW0gaXMgY2hlY2tlZFxuICAgKiBAcGFyYW0gaXRlbSBjaGVja2JveCBpdGVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0gPT09IHRoaXMuc2VsZWN0QWxsSXRlbSkgcmV0dXJuIHRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHZhbC5pbmRleE9mKGl0ZW0udmFsdWUpID4gLTE7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5oYXNOb25lKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICB2YXIgcHJldk5vbmVJbmRleCA9IHRoaXMubm9uZUluZGV4SW5BcnJheSh2YWx1ZSk7XG4gICAgICAgIHZhciBuZXdOb25lSW5kZXggPSB0aGlzLm5vbmVJbmRleEluQXJyYXkobmV3VmFsdWUpO1xuICAgICAgICBpZiAocHJldk5vbmVJbmRleCA+IC0xKSB7XG4gICAgICAgICAgaWYgKG5ld05vbmVJbmRleCA+IC0xICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlLnNwbGljZShuZXdOb25lSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobmV3Tm9uZUluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW3RoaXMubm9uZUl0ZW0udmFsdWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBub25lSW5kZXhJbkFycmF5KHZhbDogYW55KSB7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIC0xO1xuICAgIHZhciBub25lVmFsdWUgPSB0aGlzLm5vbmVJdGVtLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsW2ldID09IG5vbmVWYWx1ZSkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuVXNlRmlsdGVyZWRDaG9pY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5oYXNOb25lICYmICF0aGlzLmhhc1NlbGVjdEFsbCAmJiBzdXBlci5jYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkVG9WaXNpYmxlQ2hvaWNlcyhpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGlmICh0aGlzLmhhc1NlbGVjdEFsbCkge1xuICAgICAgaXRlbXMudW5zaGlmdCh0aGlzLnNlbGVjdEFsbEl0ZW0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNOb25lKSB7XG4gICAgICBpdGVtcy5wdXNoKHRoaXMubm9uZUl0ZW0pO1xuICAgIH1cbiAgICBzdXBlci5hZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBcIlwiO1xuICAgIHZhciBpdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWU7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWxTdHIgPSB0aGlzLmdldENob2ljZXNEaXNwbGF5VmFsdWUoaXRlbXMsIHZhbHVlc1tpXSk7XG4gICAgICBpZiAodmFsU3RyKSB7XG4gICAgICAgIGlmIChzdHIpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIHN0ciArPSB2YWxTdHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFySW5jb3JyZWN0VmFsdWVzQ29yZSgpIHtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXMoZmFsc2UpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckRpc2FibGVkVmFsdWVzQ29yZSgpIHtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXModHJ1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckluY29ycmVjdEFuZERpc2FibGVkVmFsdWVzKGNsZWFyRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpIHx8IHZhbC5sZW5ndGggPT0gMCkge1xuICAgICAgaWYgKCFjbGVhckRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICAoIWNsZWFyRGlzYWJsZWQgJiYgIXRoaXMuaGFzVW5rbm93blZhbHVlKHZhbFtpXSwgdHJ1ZSkpIHx8XG4gICAgICAgIChjbGVhckRpc2FibGVkICYmICF0aGlzLmlzVmFsdWVEaXNhYmxlZCh2YWxbaV0pKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1ZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB2YWwubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgdmFyIGpzb24gPSBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgaWYgKG9wZXJhdG9yID09IFwiY29udGFpbnNcIiB8fCBvcGVyYXRvciA9PSBcIm5vdGNvbnRhaW5zXCIpIHtcbiAgICAgIGpzb25bXCJ0eXBlXCJdID0gXCJyYWRpb2dyb3VwXCI7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFZhbHVlQ29yZSgpIHx8IFtdO1xuICB9XG4gIHB1YmxpYyBpc0Fuc3dlckNvcnJlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNBcnJheUNvbnRhaW5zRXF1YWwodGhpcy52YWx1ZSwgdGhpcy5jb3JyZWN0QW5zd2VyKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlV2l0aE90aGVycygpIHtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUZyb21EYXRhQ29yZSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB2YWwuaW5kZXhPZih0aGlzLm90aGVySXRlbS52YWx1ZSkgPj0gMDtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwpIHJldHVybiB2YWw7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBbdmFsXTtcbiAgICByZXR1cm4gc3VwZXIudmFsdWVGcm9tRGF0YSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHJldHVybiB2YWw7XG4gICAgICBpZiAodGhpcy5oYXNVbmtub3duVmFsdWUodmFsW2ldKSkge1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSB2YWxbaV07XG4gICAgICAgIHZhciBuZXdWYWwgPSB2YWwuc2xpY2UoKTtcbiAgICAgICAgbmV3VmFsW2ldID0gdGhpcy5vdGhlckl0ZW0udmFsdWU7XG4gICAgICAgIHJldHVybiBuZXdWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwgfHwgIXZhbC5sZW5ndGgpIHJldHVybiB2YWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29tbWVudCgpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMuZ2V0Q29tbWVudCgpO1xuICAgICAgICAgIHJldHVybiBuZXdWYWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNoZWNrYm94XCI7XG4gIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiY2hlY2tib3hcIixcbiAgW1xuICAgIFwiaGFzU2VsZWN0QWxsOmJvb2xlYW5cIixcbiAgICBcImhhc05vbmU6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTm9uZVRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJzZWxlY3RBbGxUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NTZWxlY3RBbGxUZXh0XCIgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY2hlY2tib3hcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGNvbW1lbnQgcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tbWVudE1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW1pbSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5tYXhUZXh0TGVuZ3RoIDogLTFcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgcm93cyBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCA0KTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3ModmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIGNvbHMgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2xzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHNcIiwgNTApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29scyh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgfVxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjtcbiAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjb21tZW50XCIsXG4gIFtcbiAgICB7IG5hbWU6IFwibWF4TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHsgbmFtZTogXCJjb2xzOm51bWJlclwiLCBkZWZhdWx0OiA1MCB9LFxuICAgIHsgbmFtZTogXCJyb3dzOm51bWJlclwiLCBkZWZhdWx0OiA0IH0sXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjb21tZW50XCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsImltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYW4gcXVlc3Rpb24gdGhhdCByZW5kZXJzIGVtcHR5IFwiZGl2XCIgdGFnLiBJdCB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3Igc29tZSBjdXN0b20gd2lkZ2V0c1xuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FbXB0eU1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJlbXB0eVwiO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiZW1wdHlcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25FbXB0eU1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZW1wdHkudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGV4cHJlc3Npb24gcXVlc3Rpb24uIEl0IGlzIGEgcmVhZC1vbmx5IHF1ZXN0aW9uLiBJdCBjYWxjdWxhdGVzIHZhbHVlIGJhc2VkIG9uIGVweHJlc3Npb24gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBleHByZXNzaW9uSXNSdW5uaW5nOiBib29sZWFuO1xuICBwcml2YXRlIGV4cHJlc3Npb25SdW5uZXI6IEV4cHJlc3Npb25SdW5uZXI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiZm9ybWF0XCIsIHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiZXhwcmVzc2lvblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgICAgc2VsZi5leHByZXNzaW9uUnVubmVyID0gbmV3IEV4cHJlc3Npb25SdW5uZXIoc2VsZi5leHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb25cIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4geW91ciBvd24gZm9ybWF0LiBNYWtlIHN1cmUgeW91IGhhdmUgXCJ7MH1cIiBzdWJzdHJpbmcgaW4geW91ciBzdHJpbmcsIHRvIGRpc3BsYXkgdGhlIGFjdHVhbCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZm9ybWF0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZm9ybWF0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRm9ybWF0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImZvcm1hdFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIEV4cHJlc3Npb24gdGhhdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcXVlc3Rpb24gdmFsdWUuIFlvdSBtYXkgdXNlIHN0YW5kYXJkIG9wZXJhdG9ycyBsaWtlICssIC0sICogYW5kIC8sIHNxdWFyZXMgKCkuIEhlcmUgaXMgdGhlIGV4YW1wbGUgb2YgYWNjZXNzaW5nIHRoZSBxdWVzdGlvbiB2YWx1ZSB7cXVlc3Rpb25uYW1lfS5cbiAgICogPGJyLz5FeGFtcGxlOiBcIih7cXVhbnRpdHl9ICoge3ByaWNlfSkgKiAoMTAwIC0ge2Rpc2NvdW50fSkgLyAxMDBcIlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbiB8fCB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy5leHByZXNzaW9uUnVubmVyKVxuICAgICAgdGhpcy5leHByZXNzaW9uUnVubmVyID0gbmV3IEV4cHJlc3Npb25SdW5uZXIodGhpcy5leHByZXNzaW9uKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5leHByZXNzaW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIHVzZS4gUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIDAgdG8gMjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xIGFuZCBpdCBtZWFucyB0aGF0IHRoaXMgcHJvcGVydHkgaXMgbm90IHVzZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heGltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4aW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgdG8gdXNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gMCB0byAyMC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEgYW5kIGl0IG1lYW5zIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWluaW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5pbXVtRnJhY3Rpb25EaWdpdHModmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgLTEgfHwgdmFsID4gMjApIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgdmFsID0gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSkgPyB0aGlzLmRlZmF1bHRWYWx1ZSA6IHRoaXMudmFsdWU7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBcIlwiO1xuICAgIHZhciBzdHIgPSB0aGlzLmdldFZhbHVlQXNTdHIodmFsKTtcbiAgICBpZiAoIXRoaXMuZm9ybWF0KSByZXR1cm4gc3RyO1xuICAgIHJldHVybiAoPGFueT50aGlzLmZvcm1hdClbXCJmb3JtYXRcIl0oc3RyKTtcbiAgfVxuICAvKipcbiAgICogWW91IG1heSBzZXQgdGhpcyBwcm9wZXJ0eSB0byBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiIG9yIFwicGVyY2VudFwiLiBJZiB5b3Ugc2V0IGl0IHRvIFwiY3VycmVuY3lcIiwgeW91IG1heSB1c2UgdGhlIGN1cnJlbmN5IHByb3BlcnR5IHRvIGRpc3BsYXkgdGhlIHZhbHVlIGluIGN1cnJlbmN5IGRpZmZlcmVudCBmcm9tIFVTRC5cbiAgICogQHNlZSBjdXJyZW5jeVxuICAgKi9cbiAgcHVibGljIGdldCBkaXNwbGF5U3R5bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVN0eWxlXCIsIFwibm9uZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRpc3BsYXlTdHlsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlTdHlsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gdGhlIGN1cnJlbmN5IGRpZmZlcmVuIGZyb20gVVNELiBUaGUgZGlzcGxheVN0eXBlIHNob3VsZCBiZSBzZXQgdG8gXCJjdXJyZW5jeVwiLlxuICAgKiBAc2VlIGRpc3BsYXlTdHlsZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiLCBcIlVTRFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbmN5KHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKGdldEN1cnJlY3lDb2RlcygpLmluZGV4T2YodmFsKSA8IDApIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdXNlR3JvdXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVzZUdyb3VwaW5nXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlR3JvdXBpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVBc1N0cih2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kaXNwbGF5U3R5bGUgIT0gXCJub25lXCIgJiZcbiAgICAgICFpc05hTihwYXJzZUZsb2F0KHZhbCkpICYmXG4gICAgICBpc0Zpbml0ZSh2YWwpXG4gICAgKSB7XG4gICAgICB2YXIgbG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoKTtcbiAgICAgIGlmICghbG9jYWxlKSBsb2NhbGUgPSBcImVuXCI7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3R5bGU6IHRoaXMuZGlzcGxheVN0eWxlLFxuICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSxcbiAgICAgICAgdXNlR3JvdXBpbmc6IHRoaXMudXNlR3JvdXBpbmdcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPiAtMSkge1xuICAgICAgICAoPGFueT5vcHRpb25zKVtcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiXSA9IHRoaXMubWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWluaW11bUZyYWN0aW9uRGlnaXRzID4gLTEpIHtcbiAgICAgICAgKDxhbnk+b3B0aW9ucylbXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIl0gPSB0aGlzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlY3lDb2RlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgcmV0dXJuIFtcbiAgICBcIkFFRFwiLFxuICAgIFwiQUZOXCIsXG4gICAgXCJBTExcIixcbiAgICBcIkFNRFwiLFxuICAgIFwiQU5HXCIsXG4gICAgXCJBT0FcIixcbiAgICBcIkFSU1wiLFxuICAgIFwiQVVEXCIsXG4gICAgXCJBV0dcIixcbiAgICBcIkFaTlwiLFxuICAgIFwiQkFNXCIsXG4gICAgXCJCQkRcIixcbiAgICBcIkJEVFwiLFxuICAgIFwiQkdOXCIsXG4gICAgXCJCSERcIixcbiAgICBcIkJJRlwiLFxuICAgIFwiQk1EXCIsXG4gICAgXCJCTkRcIixcbiAgICBcIkJPQlwiLFxuICAgIFwiQk9WXCIsXG4gICAgXCJCUkxcIixcbiAgICBcIkJTRFwiLFxuICAgIFwiQlROXCIsXG4gICAgXCJCV1BcIixcbiAgICBcIkJZTlwiLFxuICAgIFwiQlpEXCIsXG4gICAgXCJDQURcIixcbiAgICBcIkNERlwiLFxuICAgIFwiQ0hFXCIsXG4gICAgXCJDSEZcIixcbiAgICBcIkNIV1wiLFxuICAgIFwiQ0xGXCIsXG4gICAgXCJDTFBcIixcbiAgICBcIkNOWVwiLFxuICAgIFwiQ09QXCIsXG4gICAgXCJDT1VcIixcbiAgICBcIkNSQ1wiLFxuICAgIFwiQ1VDXCIsXG4gICAgXCJDVVBcIixcbiAgICBcIkNWRVwiLFxuICAgIFwiQ1pLXCIsXG4gICAgXCJESkZcIixcbiAgICBcIkRLS1wiLFxuICAgIFwiRE9QXCIsXG4gICAgXCJEWkRcIixcbiAgICBcIkVHUFwiLFxuICAgIFwiRVJOXCIsXG4gICAgXCJFVEJcIixcbiAgICBcIkVVUlwiLFxuICAgIFwiRkpEXCIsXG4gICAgXCJGS1BcIixcbiAgICBcIkdCUFwiLFxuICAgIFwiR0VMXCIsXG4gICAgXCJHSFNcIixcbiAgICBcIkdJUFwiLFxuICAgIFwiR01EXCIsXG4gICAgXCJHTkZcIixcbiAgICBcIkdUUVwiLFxuICAgIFwiR1lEXCIsXG4gICAgXCJIS0RcIixcbiAgICBcIkhOTFwiLFxuICAgIFwiSFJLXCIsXG4gICAgXCJIVEdcIixcbiAgICBcIkhVRlwiLFxuICAgIFwiSURSXCIsXG4gICAgXCJJTFNcIixcbiAgICBcIklOUlwiLFxuICAgIFwiSVFEXCIsXG4gICAgXCJJUlJcIixcbiAgICBcIklTS1wiLFxuICAgIFwiSk1EXCIsXG4gICAgXCJKT0RcIixcbiAgICBcIkpQWVwiLFxuICAgIFwiS0VTXCIsXG4gICAgXCJLR1NcIixcbiAgICBcIktIUlwiLFxuICAgIFwiS01GXCIsXG4gICAgXCJLUFdcIixcbiAgICBcIktXRFwiLFxuICAgIFwiS1lEXCIsXG4gICAgXCJLWlRcIixcbiAgICBcIkxBS1wiLFxuICAgIFwiTEJQXCIsXG4gICAgXCJMS1JcIixcbiAgICBcIkxSRFwiLFxuICAgIFwiTFNMXCIsXG4gICAgXCJMWURcIixcbiAgICBcIk1BRFwiLFxuICAgIFwiTURMXCIsXG4gICAgXCJNR0FcIixcbiAgICBcIk1LRFwiLFxuICAgIFwiTU1LXCIsXG4gICAgXCJNTlRcIixcbiAgICBcIk1PUFwiLFxuICAgIFwiTVJPXCIsXG4gICAgXCJNVVJcIixcbiAgICBcIk1WUlwiLFxuICAgIFwiTVdLXCIsXG4gICAgXCJNWE5cIixcbiAgICBcIk1YVlwiLFxuICAgIFwiTVlSXCIsXG4gICAgXCJNWk5cIixcbiAgICBcIk5BRFwiLFxuICAgIFwiTkdOXCIsXG4gICAgXCJOSU9cIixcbiAgICBcIk5PS1wiLFxuICAgIFwiTlBSXCIsXG4gICAgXCJOWkRcIixcbiAgICBcIk9NUlwiLFxuICAgIFwiUEFCXCIsXG4gICAgXCJQRU5cIixcbiAgICBcIlBHS1wiLFxuICAgIFwiUEhQXCIsXG4gICAgXCJQS1JcIixcbiAgICBcIlBMTlwiLFxuICAgIFwiUFlHXCIsXG4gICAgXCJRQVJcIixcbiAgICBcIlJPTlwiLFxuICAgIFwiUlNEXCIsXG4gICAgXCJSVUJcIixcbiAgICBcIlJXRlwiLFxuICAgIFwiU0FSXCIsXG4gICAgXCJTQkRcIixcbiAgICBcIlNDUlwiLFxuICAgIFwiU0RHXCIsXG4gICAgXCJTRUtcIixcbiAgICBcIlNHRFwiLFxuICAgIFwiU0hQXCIsXG4gICAgXCJTTExcIixcbiAgICBcIlNPU1wiLFxuICAgIFwiU1JEXCIsXG4gICAgXCJTU1BcIixcbiAgICBcIlNURFwiLFxuICAgIFwiU1ZDXCIsXG4gICAgXCJTWVBcIixcbiAgICBcIlNaTFwiLFxuICAgIFwiVEhCXCIsXG4gICAgXCJUSlNcIixcbiAgICBcIlRNVFwiLFxuICAgIFwiVE5EXCIsXG4gICAgXCJUT1BcIixcbiAgICBcIlRSWVwiLFxuICAgIFwiVFREXCIsXG4gICAgXCJUV0RcIixcbiAgICBcIlRaU1wiLFxuICAgIFwiVUFIXCIsXG4gICAgXCJVR1hcIixcbiAgICBcIlVTRFwiLFxuICAgIFwiVVNOXCIsXG4gICAgXCJVWUlcIixcbiAgICBcIlVZVVwiLFxuICAgIFwiVVpTXCIsXG4gICAgXCJWRUZcIixcbiAgICBcIlZORFwiLFxuICAgIFwiVlVWXCIsXG4gICAgXCJXU1RcIixcbiAgICBcIlhBRlwiLFxuICAgIFwiWEFHXCIsXG4gICAgXCJYQVVcIixcbiAgICBcIlhCQVwiLFxuICAgIFwiWEJCXCIsXG4gICAgXCJYQkNcIixcbiAgICBcIlhCRFwiLFxuICAgIFwiWENEXCIsXG4gICAgXCJYRFJcIixcbiAgICBcIlhPRlwiLFxuICAgIFwiWFBEXCIsXG4gICAgXCJYUEZcIixcbiAgICBcIlhQVFwiLFxuICAgIFwiWFNVXCIsXG4gICAgXCJYVFNcIixcbiAgICBcIlhVQVwiLFxuICAgIFwiWFhYXCIsXG4gICAgXCJZRVJcIixcbiAgICBcIlpBUlwiLFxuICAgIFwiWkFSXCIsXG4gICAgXCJaTVdcIixcbiAgICBcIlpXTFwiXG4gIF07XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiZXhwcmVzc2lvblwiLFxuICBbXG4gICAgXCJleHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICB7IG5hbWU6IFwiZm9ybWF0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NGb3JtYXRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGlzcGxheVN0eWxlXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImN1cnJlbmN5XCIsXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRDdXJyZWN5Q29kZXMoKTtcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiBcIlVTRFwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWF4aW11bUZyYWN0aW9uRGlnaXRzOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHsgbmFtZTogXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcInVzZUdyb3VwaW5nOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJjb21tZW50VGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJlbmFibGVJZlwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJpc1JlcXVpcmVkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlYWRPbmx5XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInZhbGlkYXRvcnNcIiwgdmlzaWJsZTogZmFsc2UgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIEV2ZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IsIEV4Y2VlZFNpemVFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBmaWxlIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZpbGVNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBpc1VwbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHF1ZXN0aW9uIHN0YXRlIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAqIDxici8+IHNlbmRlciB0aGUgcXVlc3Rpb24gb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuc3RhdGUgbmV3IHF1ZXN0aW9uIHN0YXRlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG9uU3RhdGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBRdWVzdGlvbkZpbGVNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogUXVlc3Rpb25GaWxlTW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIHB1YmxpYyBwcmV2aWV3VmFsdWU6IGFueVtdID0gW107XG4gIHB1YmxpYyBjdXJyZW50U3RhdGUgPSBcImVtcHR5XCI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZpbGVcIjtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgdGhlIHByZXZpZXcgZm9yIHRoZSBpbWFnZSBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1ByZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2aWV3XCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1ByZXZpZXcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZpZXdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGFsbG93IHNlbGVjdCBtdWx0aXBsZSBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dNdWx0aXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dNdWx0aXBsZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd011bHRpcGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93TXVsdGlwbGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIGhlaWdodC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWNjZXB0ZWQgZmlsZSB0eXBlcy4gUGFzc2VkIHRvIHRoZSAnYWNjZXB0JyBhdHRyaWJ1dGUgb2YgdGhlIGZpbGUgaW5wdXQgdGFnLiBTZWUgaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2F0dF9pbnB1dF9hY2NlcHQuYXNwIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjY2VwdGVkVHlwZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWNjZXB0ZWRUeXBlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFjY2VwdGVkVHlwZXModmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhY2NlcHRlZFR5cGVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2VyaWFsaXplIGZpbGUgY29udGVudCBhcyB0ZXh0IGluIHRoZSBzdXJ2ZXkuZGF0YS5cbiAgICogSW4gdGhpcyBjYXNlLCB5b3UgaGF2ZSB0byB3cml0ZSB0aGUgY29kZSBvblVwbG9hZEZpbGVzIGV2ZW50IHRvIHN0b3JlIHRoZSBmaWxlIGNvbnRlbnQuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwub25VcGxvYWRGaWxlc1xuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZURhdGFBc1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0b3JlRGF0YUFzVGV4dFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlRGF0YUFzVGV4dCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdG9yZURhdGFBc1RleHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gd2FpdCB1bnRpbCBmaWxlcyB3aWxsIGJlIHVwbG9hZGVkIHRvIHlvdXIgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YWl0Rm9yVXBsb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3YWl0Rm9yVXBsb2FkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdhaXRGb3JVcGxvYWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2FpdEZvclVwbG9hZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXR1cCB0aGUgbWF4aW11bSBhbGxvd2VkIGZpbGUgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhTaXplXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4U2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsZWFuIGZpbGVzIHZhbHVlIGJ1dHRvbiBjYXB0aW9uLlxuICAgKi9cbiAgZ2V0IGNsZWFuQnV0dG9uQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYW5DYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGZpbGUgYnV0dG9uIGNhcHRpb24uXG4gICAqL1xuICBnZXQgcmVtb3ZlRmlsZUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZUZpbGVDYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGl0bGUgdmFsdWUuXG4gICAqL1xuICBnZXQgaW5wdXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKSByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImxvYWRpbmdGaWxlXCIpO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9vc2VGaWxlXCIpO1xuICAgIHJldHVybiBcIiBcIjtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdmFsdWUgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcihkb25lQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyh0aGlzLm5hbWUsIHRoaXMudmFsdWUsIG51bGwsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgICEhZG9uZUNhbGxiYWNrICYmIGRvbmVDYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgZmlsZSBpdGVtIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRmlsZShjb250ZW50OiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyhcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBjb250ZW50Lm5hbWUsXG4gICAgICAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvbGRWYWx1ZS5maWx0ZXIoZiA9PiBmLm5hbWUgIT09IGNvbnRlbnQubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogTG9hZCBtdWx0aXBsZSBmaWxlcyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmlsZXNcbiAgICovXG4gIHB1YmxpYyBsb2FkRmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXNPayhmaWxlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRpbmdcIik7XG5cbiAgICB2YXIgbG9hZEZpbGVzUHJvYyA9ICgpID0+IHtcbiAgICAgIHZhciBjb250ZW50ID0gPEFycmF5PGFueT4+W107XG4gICAgICBpZiAodGhpcy5zdG9yZURhdGFBc1RleHQpIHtcbiAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICBsZXQgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNvbmNhdChbXG4gICAgICAgICAgICAgIHsgbmFtZTogZmlsZS5uYW1lLCB0eXBlOiBmaWxlLnR5cGUsIGNvbnRlbnQ6IGZpbGVSZWFkZXIucmVzdWx0IH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5jb25jYXQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkudXBsb2FkRmlsZXModGhpcy5uYW1lLCBmaWxlcywgKHN0YXR1cywgZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KFxuICAgICAgICAgICAgICBkYXRhLm1hcCgocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHIuZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgdHlwZTogci5maWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiByLmNvbnRlbnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgbG9hZEZpbGVzUHJvYygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyKGxvYWRGaWxlc1Byb2MpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2FuUHJldmlld0ltYWdlKGZpbGVJdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFmaWxlSXRlbSAmJiB0aGlzLmlzRmlsZUltYWdlKGZpbGVJdGVtKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IFtdO1xuICAgIHZhciBzdGF0ZSA9XG4gICAgICAoIUFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmICEhbmV3VmFsdWUpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiYgbmV3VmFsdWUubGVuZ3RoID4gMClcbiAgICAgICAgPyB0aGlzLnNob3dQcmV2aWV3XG4gICAgICAgICAgPyBcImxvYWRpbmdcIlxuICAgICAgICAgIDogXCJsb2FkZWRcIlxuICAgICAgICA6IFwiZW1wdHlcIjtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChzdGF0ZSk7XG4gICAgaWYgKCF0aGlzLnNob3dQcmV2aWV3IHx8ICFuZXdWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKVxuICAgICAgPyBuZXdWYWx1ZVxuICAgICAgOiAhIW5ld1ZhbHVlXG4gICAgICAgID8gW25ld1ZhbHVlXVxuICAgICAgICA6IFtdO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVEYXRhQXNUZXh0KSB7XG4gICAgICBuZXdWYWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdmFsdWUuY29udGVudCB8fCB2YWx1ZTtcbiAgICAgICAgdGhpcy5wcmV2aWV3VmFsdWUgPSB0aGlzLnByZXZpZXdWYWx1ZS5jb25jYXQoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChzdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHRoaXMuc3RhdGVDaGFuZ2VkKFwibG9hZGVkXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWYWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdmFsdWUuY29udGVudCB8fCB2YWx1ZTtcbiAgICAgICAgdGhpcy5zdXJ2ZXkuZG93bmxvYWRGaWxlKHRoaXMubmFtZSwgdmFsdWUsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3VmFsdWUgPSB0aGlzLnByZXZpZXdWYWx1ZS5jb25jYXQoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogZGF0YSxcbiAgICAgICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aWV3VmFsdWUubGVuZ3RoID09PSBuZXdWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwibG9hZGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImVycm9yXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKHRoaXMuaXNVcGxvYWRpbmcgJiYgdGhpcy53YWl0Rm9yVXBsb2FkKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IEN1c3RvbUVycm9yKHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cGxvYWRpbmdGaWxlXCIpLCB0aGlzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHN0YXRlQ2hhbmdlZChzdGF0ZTogc3RyaW5nKSB7XG4gICAgaWYgKHN0YXRlID09PSBcImxvYWRpbmdcIikge1xuICAgICAgdGhpcy5pc1VwbG9hZGluZyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gXCJsb2FkZWRcIikge1xuICAgICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB7IHN0YXRlOiBzdGF0ZSB9KTtcbiAgfVxuICBwcml2YXRlIGFsbEZpbGVzT2soZmlsZXM6IEZpbGVbXSk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvckxlbmd0aCA9IHRoaXMuZXJyb3JzID8gdGhpcy5lcnJvcnMubGVuZ3RoIDogMDtcbiAgICAoZmlsZXMgfHwgW10pLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAodGhpcy5tYXhTaXplID4gMCAmJiBmaWxlLnNpemUgPiB0aGlzLm1heFNpemUpIHtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgRXhjZWVkU2l6ZUVycm9yKHRoaXMubWF4U2l6ZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlcnJvckxlbmd0aCA9PT0gdGhpcy5lcnJvcnMubGVuZ3RoO1xuICB9XG4gIHByaXZhdGUgaXNGaWxlSW1hZ2UoZmlsZToge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gIH0pOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbGUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBpbWFnZVByZWZpeCA9IFwiZGF0YTppbWFnZVwiO1xuICAgIHZhciBzdWJTdHIgPSBmaWxlLmNvbnRlbnQgJiYgZmlsZS5jb250ZW50LnN1YnN0cigwLCBpbWFnZVByZWZpeC5sZW5ndGgpO1xuICAgIHN1YlN0ciA9IHN1YlN0ciAmJiBzdWJTdHIudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzdWx0ID1cbiAgICAgIHN1YlN0ciA9PT0gaW1hZ2VQcmVmaXggfHxcbiAgICAgICghIWZpbGUudHlwZSAmJiBmaWxlLnR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiaW1hZ2UvXCIpID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImZpbGVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJzaG93UHJldmlldzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcImFsbG93TXVsdGlwbGU6Ym9vbGVhblwiLFxuICAgIFwiaW1hZ2VIZWlnaHRcIixcbiAgICBcImltYWdlV2lkdGhcIixcbiAgICBcImFjY2VwdGVkVHlwZXNcIixcbiAgICB7IG5hbWU6IFwic3RvcmVEYXRhQXNUZXh0OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJ3YWl0Rm9yVXBsb2FkOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBcIm1heFNpemU6bnVtYmVyXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZU1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZmlsZS50cyIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uTm9uVmFsdWUgfSBmcm9tIFwiLi9xdWVzdGlvbm5vbnZhbHVlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgaHRtbCBxdWVzdGlvbi4gVW5saWtlIG90aGVyIHF1ZXN0aW9ucyBpdCBkb2Vzbid0IGhhdmUgdmFsdWUgYW5kIHRpdGxlLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25IdG1sTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk5vblZhbHVlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBsb2NIdG1sID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGxvY0h0bWwub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbihzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gISFzZWxmLnN1cnZleSA/IHNlbGYuc3VydmV5LnByb2Nlc3NIdG1sKHN0cikgOiBzdHI7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImh0bWxcIjtcbiAgfVxuICAvKipcbiAgICogU2V0IGh0bWwgdG8gZGlzcGxheSBpdFxuICAgKi9cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGh0bWwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkSHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5wcm9jZXNzSHRtbCh0aGlzLmh0bWwpIDogdGhpcy5odG1sO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImh0bWxcIixcbiAgW3sgbmFtZTogXCJodG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0h0bWxcIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWxNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJub252YWx1ZVwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJodG1sXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25faHRtbC50cyIsImltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzZWxlY3QgaW1hZ2UgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNvbENvdW50ID0gMDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImltYWdlcGlja2VyXCI7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIE11bHRpIHNlbGVjdCBvcHRpb24uIElmIHNldCB0byB0cnVlLCB0aGVuIGFsbG93cyB0byBzZWxlY3QgbXVsdGlwbGUgaW1hZ2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBtdWx0aVNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibXVsdGlTZWxlY3RcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgbXVsdGlTZWxlY3QobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtdWx0aVNlbGVjdFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNob3cgbGFiZWwgdW5kZXIgdGhlIGltYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TGFiZWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TGFiZWxcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFZhbHVlQ29yZSgpIHx8ICh0aGlzLm11bHRpU2VsZWN0ICYmIFtdKSB8fCB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIDE1MCk7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIDIwMCk7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZVdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgZml0IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlRml0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIsIFwiY29udGFpblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlRml0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29udGVudE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIiwgXCJpbWFnZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnRNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIiwgdmFsKTtcbiAgICBpZiAodmFsID09PSBcInZpZGVvXCIpIHtcbiAgICAgIHRoaXMuc2hvd0xhYmVsID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJpbWFnZWl0ZW12YWx1ZVwiLFxuICBbXCJpbWFnZUxpbmtcIl0sXG4gIG51bGwsXG4gIFwiaXRlbXZhbHVlXCJcbik7XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiaW1hZ2VwaWNrZXJcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNPdGhlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbnRlbnRNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImltYWdlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbWFnZVwiLCBcInZpZGVvXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlRml0XCIsXG4gICAgICBkZWZhdWx0OiBcImNvbnRhaW5cIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiaW1hZ2VIZWlnaHQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDE1MCB9LFxuICAgIHsgbmFtZTogXCJpbWFnZVdpZHRoOm51bWJlclwiLCBkZWZhdWx0OiAyMDAgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwic2hvd0xhYmVsOmJvb2xlYW5cIixcbiAgZGVmYXVsdDogZmFsc2Vcbn0pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgZGVmYXVsdDogMCxcbiAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdXG59KTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwibXVsdGlTZWxlY3Q6Ym9vbGVhblwiLFxuICBkZWZhdWx0OiBmYWxzZVxufSk7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcImNob2ljZXM6aW1hZ2VpdGVtdmFsdWVbXVwiXG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZXBpY2tlclwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsKG5hbWUpO1xuICAvL3EuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9pbWFnZXBpY2tlci50cyIsImltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWwgfSBmcm9tIFwiLi9tYXJ0aXhCYXNlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nLCBJTG9jYWxpemFibGVPd25lciB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuaW1wb3J0IHsgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERhdGEge1xuICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhSb3dNb2RlbCB7XG4gIHByaXZhdGUgZGF0YTogSU1hdHJpeERhdGE7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBwcm90ZWN0ZWQgcm93VmFsdWU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogSU1hdHJpeERhdGEsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5yb3dWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS50ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5yb3dWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZGF0YS5vbk1hdHJpeFJvd0NoYW5nZWQodGhpcyk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeENlbGxzT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldFJvd3MoKTogQXJyYXk8YW55PjtcbiAgZ2V0Q29sdW1ucygpOiBBcnJheTxhbnk+O1xufVxuXG5leHBvcnQgY2xhc3MgTWFydHJpeENlbGxzIHtcbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0Um93TmFtZSA9IFwiZGVmYXVsdFwiO1xuICBwcml2YXRlIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY2VsbHNPd25lcjogSU1hdHJpeENlbGxzT3duZXIpIHt9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBzZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnksIHZhbDogc3RyaW5nKSB7XG4gICAgcm93ID0gdGhpcy5nZXRDZWxsUm93Q29sdW1uVmFsdWUocm93LCB0aGlzLnJvd3MpO1xuICAgIGNvbHVtbiA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKGNvbHVtbiwgdGhpcy5jb2x1bW5zKTtcbiAgICBpZiAoIXJvdyB8fCAhY29sdW1uKSByZXR1cm47XG4gICAgaWYgKHZhbCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddKSB0aGlzLnZhbHVlc1tyb3ddID0ge307XG4gICAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSlcbiAgICAgICAgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dID0gdGhpcy5jcmVhdGVTdHJpbmcoKTtcbiAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXS50ZXh0ID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy52YWx1ZXNbcm93XSAmJiB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0pIHtcbiAgICAgICAgdmFyIGxvYyA9IHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgbG9jLnRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobG9jLmlzRW1wdHkpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnZhbHVlc1tyb3ddKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW3Jvd107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uOiBhbnksIHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRDZWxsVGV4dChNYXJ0cml4Q2VsbHMuRGVmYXVsdFJvd05hbWUsIGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbExvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxMb2NUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsTG9jVGV4dChNYXJ0cml4Q2VsbHMuRGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5TG9jVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGNlbGxUZXh0ID0gdGhpcy5nZXRDZWxsTG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgaWYgKGNlbGxUZXh0ICYmICFjZWxsVGV4dC5pc0VtcHR5KSByZXR1cm4gY2VsbFRleHQ7XG4gICAgY2VsbFRleHQgPSB0aGlzLmdldENlbGxMb2NUZXh0KE1hcnRyaXhDZWxscy5EZWZhdWx0Um93TmFtZSwgY29sdW1uKTtcbiAgICBpZiAoY2VsbFRleHQgJiYgIWNlbGxUZXh0LmlzRW1wdHkpIHJldHVybiBjZWxsVGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PSBcIm51bWJlclwiKSB7XG4gICAgICBjb2x1bW4gPVxuICAgICAgICBjb2x1bW4gPj0gMCAmJiBjb2x1bW4gPCB0aGlzLmNvbHVtbnMubGVuZ3RoXG4gICAgICAgICAgPyB0aGlzLmNvbHVtbnNbY29sdW1uXVxuICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4ubG9jVGV4dCkgcmV0dXJuIGNvbHVtbi5sb2NUZXh0O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldENlbGxMb2NUZXh0KHJvdywgY29sdW1uKTtcbiAgICByZXR1cm4gbG9jID8gbG9jLnRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldENlbGxMb2NUZXh0KE1hcnRyaXhDZWxscy5EZWZhdWx0Um93TmFtZSwgY29sdW1uKTtcbiAgICByZXR1cm4gbG9jID8gbG9jLnRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheVRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MudGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Um93cygpIDogW107XG4gIH1cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Q29sdW1ucygpIDogW107XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsUm93Q29sdW1uVmFsdWUodmFsOiBhbnksIHZhbHVlczogQXJyYXk8YW55Pik6IGFueSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IHZhbHVlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgdmFsID0gdmFsdWVzW3ZhbF0udmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWwudmFsdWUpIHJldHVybiB2YWwudmFsdWU7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIHJvdyBpbiB0aGlzLnZhbHVlcykge1xuICAgICAgdmFyIHJlc1JvdzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICB2YXIgcm93VmFsdWVzID0gdGhpcy52YWx1ZXNbcm93XTtcbiAgICAgIGZvciAodmFyIGNvbCBpbiByb3dWYWx1ZXMpIHtcbiAgICAgICAgcmVzUm93W2NvbF0gPSByb3dWYWx1ZXNbY29sXS5nZXRKc29uKCk7XG4gICAgICB9XG4gICAgICByZXNbcm93XSA9IHJlc1JvdztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgZm9yICh2YXIgcm93IGluIHZhbHVlKSB7XG4gICAgICBpZiAocm93ID09IFwicG9zXCIpIGNvbnRpbnVlO1xuICAgICAgdmFyIHJvd1ZhbHVlcyA9IHZhbHVlW3Jvd107XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddID0ge307XG4gICAgICBmb3IgKHZhciBjb2wgaW4gcm93VmFsdWVzKSB7XG4gICAgICAgIGlmIChjb2wgPT0gXCJwb3NcIikgY29udGludWU7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmNyZWF0ZVN0cmluZygpO1xuICAgICAgICBsb2Muc2V0SnNvbihyb3dWYWx1ZXNbY29sXSk7XG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sXSA9IGxvYztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0cmluZygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLmNlbGxzT3duZXIsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzaW1wbGUgbWF0cml4IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhNb2RlbFxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPE1hdHJpeFJvd01vZGVsLCBJdGVtVmFsdWU+XG4gIGltcGxlbWVudHMgSU1hdHJpeERhdGEsIElNYXRyaXhDZWxsc093bmVyIHtcbiAgcHJpdmF0ZSBpc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2VsbHNWYWx1ZTogTWFydHJpeENlbGxzO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNvbHVtbnNcIik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jZWxsc1ZhbHVlID0gbmV3IE1hcnRyaXhDZWxscyh0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInJvd3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXNlbGYuZmlsdGVySXRlbXMoKSkge1xuICAgICAgICBzZWxmLm9uUm93c0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeFwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCBpZiB5b3Ugd2FudCBhIHVzZXIgdG8gYW5zd2VyIGFsbCByb3dzLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0FsbFJvd1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0FsbFJvd1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzQWxsUm93UmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbGxSb3dSZXF1aXJlZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByb3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1Jvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5sZW5ndGggPiAwO1xuICB9XG4gIGdldFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm93cztcbiAgfVxuICBnZXRDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4Um93TW9kZWw+KCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93LnZhbHVlKSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaChcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaXhSb3coXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIHRoaXMuaWQgKyBcIl9cIiArIHJvdy52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIHZhbFtyb3cudmFsdWVdXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDAgJiYgIXRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhuZXcgSXRlbVZhbHVlKG51bGwpLCB0aGlzLm5hbWUsIHZhbCkpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmlzaWJsZSByb3dzIGFzIG1vZGVsIG9iamVjdHMuXG4gICAqIEBzZWUgcm93c1Zpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVSb3dzKCk7XG4gIH1cbiAgcHVibGljIGdldCBjZWxscygpOiBNYXJ0cml4Q2VsbHMge1xuICAgIHJldHVybiB0aGlzLmNlbGxzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjZWxscyh2YWx1ZTogTWFydHJpeENlbGxzKSB7XG4gICAgdGhpcy5jZWxscy5zZXRKc29uKHZhbHVlICYmIHZhbHVlLmdldEpzb24gPyB2YWx1ZS5nZXRKc29uKCkgOiBudWxsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NlbGxUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jZWxscy5pc0VtcHR5O1xuICB9XG4gIHB1YmxpYyBzZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnksIHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5jZWxscy5zZXRDZWxsVGV4dChyb3csIGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxscy5nZXRDZWxsVGV4dChyb3csIGNvbHVtbik7XG4gIH1cbiAgcHVibGljIHNldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNlbGxzLnNldERlZmF1bHRDZWxsVGV4dChjb2x1bW4sIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMuZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbik7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5VGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmdldENlbGxEaXNwbGF5VGV4dChyb3csIGNvbHVtbik7XG4gIH1cbiAgcHJpdmF0ZSBlbXB0eUxvY2FsaXphYmxlU3RyaW5nID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMpO1xuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jZWxscy5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MgOiB0aGlzLmVtcHR5TG9jYWxpemFibGVTdHJpbmc7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JJblJvd3MoKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRJbkFsbFJvd3NFcnJvclwiKSxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzQWxsUm93UmVxdWlyZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNWYWx1ZXNJbkFsbFJvd3MoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSByb3dzW2ldLnZhbHVlO1xuICAgICAgaWYgKCF2YWwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgZnVsbE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeFJvd01vZGVsKGl0ZW0sIGZ1bGxOYW1lLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyB8fFxuICAgICAgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoID09IDBcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1swXS52YWx1ZSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICB2YXIgcm93VmFsID0gdmFsW3Jvdy5uYW1lXSA/IHZhbFtyb3cubmFtZV0gOiBudWxsO1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnZhbHVlID0gcm93VmFsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcmVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWVzKSB7XG4gICAgICB2YXIgbmV3S2V5ID0ga2V5c0FzVGV4dFxuICAgICAgICA/IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnJvd3MsIGtleSlcbiAgICAgICAgOiBrZXk7XG4gICAgICBpZiAoIW5ld0tleSkgbmV3S2V5ID0ga2V5O1xuICAgICAgdmFyIG5ld1ZhbHVlID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMuY29sdW1ucywgdmFsdWVzW2tleV0pO1xuICAgICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgIHJlc1tuZXdLZXldID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk5hbWVzKG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnJvd3NbaV0udmFsdWUpIHtcbiAgICAgICAgbmFtZXMucHVzaCh0aGlzLm5hbWUgKyBcIi5cIiArIHRoaXMucm93c1tpXS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIGNvbnRleHQ6IGFueVxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHRoaXMucm93c1tpXTtcbiAgICAgIGlmICghIXJvdy52YWx1ZSkge1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSArIFwiLlwiICsgcm93LnZhbHVlLFxuICAgICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIHJvdy50ZXh0LFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gc3VwZXIuZ2V0Q29uZGl0aW9uSnNvbigpO1xuICAgIHZhciBxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwocGF0aCk7XG4gICAgcXVlc3Rpb24uY2hvaWNlcyA9IHRoaXMuY29sdW1ucztcbiAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHF1ZXN0aW9uKTtcbiAgICBqc29uW1widHlwZVwiXSA9IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICAvL0lNYXRyaXhEYXRhXG4gIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7XG4gICAgaWYgKHRoaXMuaXNSb3dDaGFuZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd3MpIHtcbiAgICAgIHRoaXMuc2V0TmV3VmFsdWUocm93LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICghbmV3VmFsdWUpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICAgIH1cbiAgICAgIG5ld1ZhbHVlW3Jvdy5uYW1lXSA9IHJvdy52YWx1ZTtcbiAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm1hdHJpeFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5zOml0ZW12YWx1ZVtdXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicm93czppdGVtdmFsdWVbXVwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY2VsbHM6Y2VsbHNcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImNlbGxzXCIgfSxcbiAgICBcImlzQWxsUm93UmVxdWlyZWQ6Ym9vbGVhblwiXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeC50cyIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBJTWF0cml4RHJvcGRvd25EYXRhXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5idWlsZENlbGxzKCk7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLnRleHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLmxvY1RleHQ7XG4gIH1cbn1cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggZHJvcGRvd24gcXVlc3Rpb24uIFlvdSBtYXkgdXNlIGEgZHJvcGRvd24sIGNoZWNrYm94LCByYWRpb2dyb3VwLCB0ZXh0IGFuZCBjb21tZW50IHF1ZXN0aW9ucyBhcyBhIGNlbGwgZWRpdG9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2VcbiAgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicm93c1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgc2VsZi5maWx0ZXJJdGVtcygpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25cIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5yb3dzW2ldLnZhbHVlO1xuICAgICAgdmFyIHZhbCA9IHZhbHVlc1tyb3dWYWx1ZV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICBpZiAoa2V5c0FzVGV4dCkge1xuICAgICAgICB2YXIgZGlzcGxheVJvd1ZhbHVlID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgICAgICAgIHRoaXMucm93cyxcbiAgICAgICAgICByb3dWYWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAoISFkaXNwbGF5Um93VmFsdWUpIHtcbiAgICAgICAgICByb3dWYWx1ZSA9IGRpc3BsYXlSb3dWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKDxhbnk+cmVzKVtyb3dWYWx1ZV0gPSB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShyb3dzW2ldLCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMucm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICB2YXIgcHJlZml4ID0gdGhpcy5uYW1lICsgXCIuXCIgKyB0aGlzLnJvd3NbaV0udmFsdWUgKyBcIi5cIjtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIG5hbWVzLnB1c2gocHJlZml4ICsgdGhpcy5jb2x1bW5zW2pdLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV07XG4gICAgICBpZiAoIXJvdy52YWx1ZSkgY29udGludWU7XG4gICAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMubmFtZSArIFwiLlwiICsgcm93LnZhbHVlICsgXCIuXCI7XG4gICAgICB2YXIgcHJlZml4VGl0bGUgPSB0aGlzLnByb2Nlc3NlZFRpdGxlICsgXCIuXCIgKyByb3cudGV4dCArIFwiLlwiO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tqXTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBwcmVmaXhOYW1lICsgY29sdW1uLm5hbWUsXG4gICAgICAgICAgdGV4dDogcHJlZml4VGl0bGUgKyBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgICAgaWYgKGNvbHVtbiA9PSBjb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInJvdy5cIiArIGNvbHVtbi5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicm93LlwiICsgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShyb3dzLCBrZXkpKSB7XG4gICAgICAgIGlmIChuZXdWYWwgPT0gbnVsbCkgbmV3VmFsID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbClba2V5XSA9IHZhbFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+KCk7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghcm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhyb3dzW2ldLCB2YWxbcm93c1tpXS52YWx1ZV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Sb3dNb2RlbChpdGVtLnZhbHVlLCBpdGVtLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCJcbiAgICB9LFxuICAgIFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIlxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhkcm9wZG93bmJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIElNYXRyaXhEcm9wZG93bkRhdGEsXG4gIE1hdHJpeERyb3Bkb3duQ29sdW1uXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEeW5hbWljUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuYnVpbGRDZWxscygpO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbWF0cml4IGR5bWFuaWMgcXVlc3Rpb24uIFlvdSBtYXkgdXNlIGEgZHJvcGRvd24sIGNoZWNrYm94LCByYWRpb2dyb3VwLCB0ZXh0IGFuZCBjb21tZW50IHF1ZXN0aW9ucyBhcyBhIGNlbGwgZWRpdG9ycy5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHJvd3MsIHVubGlrZSBpbiBtYXRyaXggZHJvcGRvd24gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2VcbiAgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgcHVibGljIHN0YXRpYyBNYXhSb3dDb3VudCA9IDEwMDtcbiAgcHJpdmF0ZSByb3dDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSByb3dDb3VudFZhbHVlOiBudW1iZXIgPSAyO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkeW5hbWljXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1Jvd3NEeW5hbWljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgb24gcmVtb3ZpbmcgYSByb3dcbiAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gYSBjb2x1bW4gbmFtZSBhbmQgdGhlIGxpYnJhcnkgc2hvd3MgZHVwbGljYXRpb24gZXJyb3IsIGlmIHRoZXJlIGFyZSBzYW1lIHZhbHVlcyBpbiBkaWZmZXJlbnQgcm93cyBpbiB0aGUgY29sdW1uLlxuICAgKiBAc2VlIGtleUR1cGxpY2F0aW9uRXJyb3JcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5TmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogSWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGV2ZXJ5IG5ldyByb3csIGluY2x1ZGluZyByb3dzIGNyZWF0ZWQgaW5pdGlhbGx5LCB1bmxlc3MgdGhlIGRlZmF1bHRWYWx1ZSBpcyBub3QgZW1wdHlcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1xuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0Um93VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFJvd1ZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFJvd1ZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFJvd1ZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gbmV3IGFkZGVkIHJvdyBmcm9tIHRoZSBsYXN0IHJvdy4gSWYgZGVmYXVsdFJvd1ZhbHVlIGlzIHNldCBhbmQgdGhpcyBwcm9wZXJ0eSBlcXVhbHMgdG8gdHJ1ZSxcbiAgICogdGhlbiB0aGUgdmFsdWUgZm9yIG5ldyBhZGRlZCByb3cgaXMgbWVyZ2luZy5cbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0Um93VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRSb3dWYWx1ZSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0Um93VmFsdWUpIHx8XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpXG4gICAgKSB7XG4gICAgICBzdXBlci5zZXREZWZhdWx0VmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLnJvd0NvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgbmV3VmFsdWUucHVzaCh0aGlzLmRlZmF1bHRSb3dWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBtYXRyaXguXG4gICAqIEBzZWUgbWluUm93Q291bnRcbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCByb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd0NvdW50VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCByb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLk1heFJvd0NvdW50KSByZXR1cm47XG4gICAgdmFyIHByZXZWYWx1ZSA9IHRoaXMucm93Q291bnRWYWx1ZTtcbiAgICB0aGlzLnJvd0NvdW50VmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiB2YWwpIHtcbiAgICAgIHZhciBxVmFsID0gdGhpcy52YWx1ZTtcbiAgICAgIHFWYWwuc3BsaWNlKHZhbCk7XG4gICAgICB0aGlzLnZhbHVlID0gcVZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5zcGxpY2UodmFsKTtcbiAgICAgIGZvciAodmFyIGkgPSBwcmV2VmFsdWU7IGkgPCB2YWw7IGkrKykge1xuICAgICAgICB2YXIgbmV3Um93ID0gdGhpcy5jcmVhdGVNYXRyaXhSb3cobnVsbCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MucHVzaChuZXdSb3cpO1xuICAgICAgICB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChuZXdSb3cpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gcm93IGNvdW50LiBBIHVzZXIgY291bGQgbm90IGRlbGV0ZSBhIHJvdyBpZiB0aGUgcm93Q291bnQgZXF1YWxzIHRvIG1pblJvd0NvdW50XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtaW5Sb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5Sb3dDb3VudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblJvd0NvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHZhbCA9IDA7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluUm93Q291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsID4gdGhpcy5tYXhSb3dDb3VudCkgdGhpcy5tYXhSb3dDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA8IHZhbCkgdGhpcy5yb3dDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gcm93IGNvdW50LiBBIHVzZXIgY291bGQgbm90IGFkZCBhIHJvdyBpZiB0aGUgcm93Q291bnQgZXF1YWxzIHRvIG1heFJvd0NvdW50XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICBcIm1heFJvd0NvdW50XCIsXG4gICAgICBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudFxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgcmV0dXJuO1xuICAgIGlmICh2YWwgPiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudClcbiAgICAgIHZhbCA9IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLk1heFJvd0NvdW50O1xuICAgIGlmICh2YWwgPT0gdGhpcy5tYXhSb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA8IHRoaXMubWluUm93Q291bnQpIHRoaXMubWluUm93Q291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPiB2YWwpIHRoaXMucm93Q291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgYSBuZXcgcm93IGNhbiBiZSBhZGRlZC5cbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKiBAc2VlIGNhblJlbW92ZVJvd1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkFkZFJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSZWFkT25seSAmJiB0aGlzLnJvd0NvdW50IDwgdGhpcy5tYXhSb3dDb3VudDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhIHJvdyBjYW4gYmUgcmVtb3ZlZC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIGNhbkFkZFJvd1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSZWFkT25seSAmJiB0aGlzLnJvd0NvdW50ID4gdGhpcy5taW5Sb3dDb3VudDtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgYWRkIGEgbmV3IHJvdy5cbiAgICovXG4gIHB1YmxpYyBhZGRSb3coKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiB0aGlzLCBjYW5BZGRSb3c6IHRoaXMuY2FuQWRkUm93IH07XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuY2FuQWRkUm93KSByZXR1cm47XG4gICAgdmFyIHByZXZSb3dDb3VudCA9IHRoaXMucm93Q291bnQ7XG4gICAgdGhpcy5yb3dDb3VudCA9IHRoaXMucm93Q291bnQgKyAxO1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRSb3dWYWx1ZSh0cnVlKTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5ydW5DZWxsc0NvbmRpdGlvbihcbiAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgaWYgKHByZXZSb3dDb3VudCArIDEgPT0gdGhpcy5yb3dDb3VudCkge1xuICAgICAgICB0aGlzLnN1cnZleS5tYXRyaXhSb3dBZGRlZCh0aGlzKTtcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0RGVmYXVsdFJvd1ZhbHVlKGlzUm93QWRkZWQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciByZXMgPSBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHRoaXMuY29sdW1uc1tpXS50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgICAgaWYgKCEhcSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkocS5nZXREZWZhdWx0VmFsdWUoKSkpIHtcbiAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAoPGFueT5yZXMpW3RoaXMuY29sdW1uc1tpXS5uYW1lXSA9IHEuZ2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0Um93VmFsdWUpKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kZWZhdWx0Um93VmFsdWUpIHtcbiAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAoPGFueT5yZXMpW2tleV0gPSB0aGlzLmRlZmF1bHRSb3dWYWx1ZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNSb3dBZGRlZCAmJiB0aGlzLmRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICghIXZhbCAmJiBBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA+PSB0aGlzLnJvd0NvdW50IC0gMSkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSB2YWxbdGhpcy5yb3dDb3VudCAtIDJdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIHtcbiAgICAgICAgICByZXMgPSByZXMgfHwge307XG4gICAgICAgICAgKDxhbnk+cmVzKVtrZXldID0gcm93VmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcm93IGJ5IGl0J3MgaW5kZXguIElmIGNvbmZpcm1EZWxldGUgaXMgdHJ1ZSwgc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2dcbiAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAqIEBzZWUgcmVtb3ZlUm93XG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJvd1VJKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSB8fCBjb25maXJtKHRoaXMuY29uZmlybURlbGV0ZVRleHQpKSB7XG4gICAgICB0aGlzLnJlbW92ZVJvdyh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcm93IGJ5IGl0J3MgaW5kZXguXG4gICAqIEBwYXJhbSBpbmRleCBhIHJvdyBpbmRleCwgZnJvbSAwIHRvIHJvd0NvdW50IC0gMVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZVJvdykgcmV0dXJuO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NcbiAgICAgICAgPyB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2luZGV4XVxuICAgICAgICA6IG51bGw7XG4gICAgICB0aGlzLnN1cnZleS5tYXRyaXhSb3dSZW1vdmVkKHRoaXMsIGluZGV4LCByb3cpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyAmJiBpbmRleCA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHZhbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdmFsID0gdGhpcy5kZWxldGVSb3dWYWx1ZSh2YWwsIG51bGwpO1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICB9XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlLS07XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZHVwbGljYXRpb24gdmFsdWUgZXJyb3IgdGV4dC4gU2V0IGl0IHRvIHNob3cgdGhlIHRleHQgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBzZWUga2V5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBrZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5RHVwbGljYXRpb25FcnJvcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NLZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZFJvd1RleHQoKSB7XG4gICAgdmFyIGRlZmF1bHRMb2NOYW1lID0gdGhpcy5pc0NvbHVtbkxheW91dEhvcml6b250YWwgPyBcImFkZFJvd1wiIDogXCJhZGRDb2x1bW5cIjtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImFkZFJvd1RleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoZGVmYXVsdExvY05hbWUpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFkZFJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImFkZFJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQWRkUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlICdBZGQgUm93JyBidXR0b24gaXMgc2hvd24gb24gYm90dG9tIGlmIGNvbHVtbkxheW91dCBpcyBob3Jpem9udGFsIGFuZCBvbiB0b3AgaWYgY29sdW1uTGF5b3V0IGlzIHZlcnRpY2FsLiA8YnIvPlxuICAgKiBZb3UgbWF5IHNldCBpdCB0byBcInRvcFwiLCBcImJvdHRvbVwiIG9yIFwidG9wQm90dG9tXCIgKHRvIHNob3cgb24gdG9wIGFuZCBib3R0b20pLlxuICAgKiBAc2VlIGNvbHVtbkxheW91dFxuICAgKi9cbiAgcHVibGljIGdldCBhZGRSb3dMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhZGRSb3dMb2NhdGlvblwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBhZGRSb3dMb2NhdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFkZFJvd0xvY2F0aW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc0FkZFJvd09uVG9wKCkge1xuICAgIGlmICghdGhpcy5jYW5BZGRSb3cpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5hZGRSb3dMb2NhdGlvbiA9PT0gXCJkZWZhdWx0XCIpXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQgPT09IFwidmVydGljYWxcIjtcbiAgICByZXR1cm4gdGhpcy5hZGRSb3dMb2NhdGlvbiAhPT0gXCJib3R0b21cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWRkUm93T25Cb3R0b20oKSB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZFJvdykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmFkZFJvd0xvY2F0aW9uID09PSBcImRlZmF1bHRcIilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxheW91dCA9PT0gXCJob3Jpem9udGFsXCI7XG4gICAgcmV0dXJuIHRoaXMuYWRkUm93TG9jYXRpb24gIT09IFwidG9wXCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByZW1vdmUgcm93IGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCByZW1vdmVSb3dUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicmVtb3ZlUm93VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZVJvd1wiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCByZW1vdmVSb3dUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZW1vdmVSb3dUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1JlbW92ZVJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZW1vdmVSb3dUZXh0XCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWVzIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlcykpIHJldHVybiB2YWx1ZXM7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGggJiYgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbCA9IHZhbHVlc1tpXTtcbiAgICAgIGlmICghdmFsKSBjb250aW51ZTtcbiAgICAgIHZhbHVlc1tpXSA9IHRoaXMuZ2V0Um93RGlzcGxheVZhbHVlKHJvd3NbaV0sIHZhbCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk5hbWVzKG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVzLnB1c2godGhpcy5uYW1lICsgXCJbMF0uXCIgKyB0aGlzLmNvbHVtbnNbaV0ubmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIGNvbnRleHQ6IGFueVxuICApIHtcbiAgICB2YXIgaGFzQ29udGV4dCA9ICEhY29udGV4dCA/IHRoaXMuY29sdW1ucy5pbmRleE9mKGNvbnRleHQpID4gLTEgOiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSArIFwiWzBdLlwiICsgY29sdW1uLm5hbWUsXG4gICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIlswXS5cIiArIGNvbHVtbi5mdWxsVGl0bGUsXG4gICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNDb250ZXh0ICYmIGNvbHVtbiAhPSBjb250ZXh0KSB7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJyb3cuXCIgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB0ZXh0OiBcInJvdy5cIiArIGNvbHVtbi5mdWxsVGl0bGUsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JJblJvd3MoKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtaW5Sb3dDb3VudEVycm9yXCIpXG4gICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5Sb3dDb3VudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIHByZXZWYWx1ZSA9IHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKCkgfHwgcHJldlZhbHVlO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluUm93Q291bnQgPD0gMCB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICB2YXIgc2V0Um93Q291bnQgPSAwO1xuICAgIGZvciAoXG4gICAgICB2YXIgcm93SW5kZXggPSAwO1xuICAgICAgcm93SW5kZXggPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDtcbiAgICAgIHJvd0luZGV4KytcbiAgICApIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW3Jvd0luZGV4XTtcbiAgICAgIGlmICghcm93LmlzRW1wdHkpIHNldFJvd0NvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBzZXRSb3dDb3VudCA8IHRoaXMubWluUm93Q291bnQ7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZSh0aGlzLmtleU5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGtleVZhbHVlcyA9IDxBcnJheTxhbnk+PltdO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWRJblJvdyhcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLFxuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICBrZXlWYWx1ZXNcbiAgICAgICAgKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZEluUm93KFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBrZXlWYWx1ZXM6IEFycmF5PGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gcm93LmdldFF1ZXN0aW9uQnlDb2x1bW4oY29sdW1uKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8IHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWUgPT0ga2V5VmFsdWVzW2ldKSB7XG4gICAgICAgIHF1ZXN0aW9uLmFkZEVycm9yKG5ldyBDdXN0b21FcnJvcih0aGlzLmtleUR1cGxpY2F0aW9uRXJyb3IsIHRoaXMpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGtleVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEeW5hbWljUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeER5bmFtaWNSb3dNb2RlbD4oKTtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA9PT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YXIgdmFsID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3codGhpcy5nZXRSb3dWYWx1ZUJ5SW5kZXgodmFsLCBpKSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyh2YWx1ZTogYW55KTogTWF0cml4RHluYW1pY1Jvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeER5bmFtaWNSb3dNb2RlbCh0aGlzLnJvd0NvdW50ZXIrKywgdGhpcywgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xuICAgIHZhciBuZXdSb3dDb3VudCA9IHZhbCAmJiBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwubGVuZ3RoIDogMDtcbiAgICBpZiAobmV3Um93Q291bnQgPD0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IG5ld1Jvd0NvdW50O1xuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdWYWx1ZShjdXJWYWx1ZTogYW55KTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gY3VyVmFsdWU7XG4gICAgaWYgKCFyZXN1bHQgfHwgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmVzdWx0ID0gW107XG4gICAgdmFyIHIgPSBbXTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHRoaXMucm93Q291bnQpIHJlc3VsdC5zcGxpY2UodGhpcy5yb3dDb3VudCAtIDEpO1xuICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKTtcbiAgICByb3dWYWx1ZSA9IHJvd1ZhbHVlIHx8IHt9O1xuICAgIGZvciAodmFyIGkgPSByZXN1bHQubGVuZ3RoOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChIZWxwZXJzLmdldFVuYmluZFZhbHVlKHJvd1ZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdChuZXdWYWx1ZVtpXSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWVbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd1ZhbHVlQnlJbmRleChxdWVzdGlvblZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgcXVlc3Rpb25WYWx1ZS5sZW5ndGhcbiAgICAgID8gcXVlc3Rpb25WYWx1ZVtpbmRleF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93VmFsdWVDb3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcXVlc3Rpb25WYWx1ZTogYW55LFxuICAgIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KFxuICAgICAgcXVlc3Rpb25WYWx1ZSxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpXG4gICAgKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgW1xuICAgIHsgbmFtZTogXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyb3dDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMiB9LFxuICAgIHsgbmFtZTogXCJtaW5Sb3dDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4Um93Q291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImtleU5hbWVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0tleUR1cGxpY2F0aW9uRXJyb3JcIlxuICAgIH0sXG4gICAgXCJkZWZhdWx0Um93VmFsdWU6cm93dmFsdWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93OmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIlxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhZGRSb3dMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwidG9wQm90dG9tXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiYWRkUm93VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQWRkUm93VGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInJlbW92ZVJvd1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlbW92ZVJvd1RleHRcIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHluYW1pY1wiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZS5hZGREZWZhdWx0Q29sdW1ucyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXlJbXBsLFxuICBJU3VydmV5LFxuICBJUGFuZWwsXG4gIElFbGVtZW50LFxuICBJVGV4dFByb2Nlc3NvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciwgVmFsaWRhdG9yUnVubmVyIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiwgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gXCIuL3F1ZXN0aW9uX3RleHRcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgQW5zd2VyUmVxdWlyZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXVsdGlwbGVUZXh0RGF0YSBleHRlbmRzIElMb2NhbGl6YWJsZU93bmVyLCBJUGFuZWwge1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvcjtcbiAgZ2V0QWxsVmFsdWVzKCk6IGFueTtcbiAgZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nKTogYW55O1xuICBzZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnk7XG4gIGdldElzUmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCBleHRlbmRzIEJhc2VcbiAgaW1wbGVtZW50cyBJVmFsaWRhdG9yT3duZXIsIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCB7XG4gIHByaXZhdGUgZWRpdG9yVmFsdWU6IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElNdWx0aXBsZVRleHREYXRhO1xuXG4gIHZhbHVlQ2hhbmdlZENhbGxiYWNrOiAobmV3VmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgdmFsaWRhdG9yczogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiA9IG5ldyBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KCk7XG5cbiAgY29uc3RydWN0b3IobmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWRpdG9yVmFsdWUgPSB0aGlzLmNyZWF0ZUVkaXRvcihuYW1lKTtcbiAgICB0aGlzLmVkaXRvci5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci50aXRsZUxvY2F0aW9uID0gXCJsZWZ0XCI7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0aXRlbVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5uYW1lID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMuZWRpdG9yLmxvY1N0cnNDaGFuZ2VkKCk7XG4gIH1cbiAgc2V0RGF0YShkYXRhOiBJTXVsdGlwbGVUZXh0RGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgICB0aGlzLmVkaXRvci5wYXJlbnQgPSBkYXRhO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgaXRlbSBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBmaWxsIHRoZSBpdGVtIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlucHV0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLmlucHV0VHlwZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogSXRlbSB0aXRsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBpdGVtIG5hbWUgaXMgcmVuZGVyZWQgYXMgdGl0bGUuIFRoaXMgcHJvcGVydHkgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IudGl0bGUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBvciBodG1sIGZvciByZW5kZXJpbmcgdGhlIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZnVsbFRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW1pbSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgc3VydmV5ID8gc3VydmV5Lm1heFRleHRMZW5ndGggOiAtMVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnBsYWNlSG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5wbGFjZUhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NQbGFjZUhvbGRlcjtcbiAgfVxuICAvKipcbiAgICogVGhlIGl0ZW0gdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5uYW1lKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRhdGEuc2V0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5uYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKTtcbiAgfVxuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKG5ld1ZhbHVlKTtcbiAgfVxuICAvL0lTdXJ2ZXlJbXBsXG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0VGV4dFByb2Nlc3NvcigpIDogbnVsbDtcbiAgfVxuICAvL0lTdXJ2ZXlEYXRhXG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZSk7XG4gIH1cbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7fVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICBpZiAodGhpcy5kYXRhKSByZXR1cm4gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgLy9JVmFsaWRhdG9yT3duZXJcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50aXRsZTtcbiAgfVxuICBnZXQgdmFsaWRhdGVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBzZXQgdmFsaWRhdGVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9XG4gIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gIH1cbiAgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtdWx0aXBsZSB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uXG4gIGltcGxlbWVudHMgSU11bHRpcGxlVGV4dERhdGEsIElQYW5lbCB7XG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiaXRlbXNcIiwgZnVuY3Rpb24oaXRlbTogYW55KSB7XG4gICAgICBpdGVtLnNldERhdGEoc2VsZik7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcIml0ZW1zXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbENvdW50XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRcIjtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uc2V0RGF0YSh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5jYWxsRWRpdG9yRnVuY3Rpb24oXCJvblN1cnZleUxvYWRcIik7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmVkaXRvcikgaXRlbS5lZGl0b3Iub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoaXRlbS52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2FsbEVkaXRvckZ1bmN0aW9uKGZ1bmNOYW1lOiBzdHJpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmVkaXRvciAmJiAoPGFueT5pdGVtKS5lZGl0b3JbZnVuY05hbWVdKSB7XG4gICAgICAgICg8YW55Pml0ZW0pLmVkaXRvcltmdW5jTmFtZV0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGlucHV0IGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtcyh2YWw6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgdGV4dCBpdGVtLlxuICAgKiBAcGFyYW0gbmFtZSBhIGl0ZW0gbmFtZVxuICAgKiBAcGFyYW0gdGl0bGUgYSBpdGVtIHRpdGxlIChvcHRpb25hbClcbiAgICovXG4gIHB1YmxpYyBhZGRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHZhciBpdGVtID0gdGhpcy5jcmVhdGVUZXh0SXRlbShuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLml0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVzLnB1c2godGhpcy5uYW1lICsgXCIuXCIgKyB0aGlzLml0ZW1zW2ldLm5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUgKyBcIi5cIiArIGl0ZW0ubmFtZSxcbiAgICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgaXRlbS5mdWxsVGl0bGUsXG4gICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5TmFtZShwYXRoKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QoaXRlbSk7XG4gICAganNvbltcInR5cGVcIl0gPSBcInRleHRcIjtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSB8fCB2YWwgPiA1KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGV4dCBpbnB1dCBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiLCAyNSk7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtU2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIml0ZW1TaXplXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVuZGVyZWQgcm93cy5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciBjb2xDb3VudCA9IHRoaXMuY29sQ291bnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgcm93cy5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIHJvd3Nbcm93cy5sZW5ndGggLSAxXS5wdXNoKGl0ZW1zW2ldKTtcbiAgICAgIGluZGV4Kys7XG4gICAgICBpZiAoaW5kZXggPj0gY29sQ291bnQpIHtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuICBwcml2YXRlIGlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uSXRlbVZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVUZXh0SXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKG5hbWUsIHRpdGxlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25JdGVtVmFsdWVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW1WYWx1ZSA9IG51bGw7XG4gICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLml0ZW1zW2ldLm5hbWUgaW4gdGhpcy52YWx1ZSkge1xuICAgICAgICBpdGVtVmFsdWUgPSB0aGlzLnZhbHVlW3RoaXMuaXRlbXNbaV0ubmFtZV07XG4gICAgICB9XG4gICAgICB0aGlzLml0ZW1zW2ldLm9uVmFsdWVDaGFuZ2VkKGl0ZW1WYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBydW5WYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIGVycm9ycyA9IHN1cGVyLnJ1blZhbGlkYXRvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLmlzRW1wdHkoKSkgY29udGludWU7XG5cbiAgICAgIHZhciBpdGVtRXJyb3JzID0gbmV3IFZhbGlkYXRvclJ1bm5lcigpLnJ1bih0aGlzLml0ZW1zW2ldKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlbUVycm9ycy5sZW5ndGg7IGorKykge1xuICAgICAgICBlcnJvcnMucHVzaChpdGVtRXJyb3JzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmlzUmVxdWlyZWQgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkoaXRlbS52YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IEFuc3dlclJlcXVpcmVkRXJyb3IoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vSU11bHRpcGxlVGV4dERhdGFcbiAgZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVtuYW1lXTtcbiAgfVxuICBzZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IHRydWU7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICBuZXdWYWx1ZSA9IHt9O1xuICAgIH1cbiAgICBuZXdWYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleTtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yO1xuICB9XG4gIGdldEFsbFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpIDogbnVsbDtcbiAgfVxuICBnZXRJc1JlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dCA6IFwiXCI7XG4gIH1cbiAgLy9JUGFuZWxcbiAgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge31cbiAgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJsZWZ0XCI7XG4gIH1cbiAgZWxlbWVudFdpZHRoQ2hhbmdlZChlbDogSUVsZW1lbnQpIHt9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwibXVsdGlwbGV0ZXh0aXRlbVwiLFxuICBbXG4gICAgXCJuYW1lXCIsXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwicGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BsYWNlSG9sZGVyXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImlucHV0VHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJ0ZXh0XCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIFwiY29sb3JcIixcbiAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgIFwiZGF0ZXRpbWVcIixcbiAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwibW9udGhcIixcbiAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICBcInJhbmdlXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGV4dFwiLFxuICAgICAgICBcInRpbWVcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ3ZWVrXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICAgIHsgbmFtZTogXCJtYXhMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiXG4gICAgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChcIlwiKTtcbiAgfVxuKTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJtdWx0aXBsZXRleHRcIixcbiAgW1xuICAgIHsgbmFtZTogXCIhaXRlbXM6dGV4dGl0ZW1zXCIsIGNsYXNzTmFtZTogXCJtdWx0aXBsZXRleHRpdGVtXCIgfSxcbiAgICB7IG5hbWU6IFwiaXRlbVNpemU6bnVtYmVyXCIsIGRlZmF1bHQ6IDI1IH0sXG4gICAgeyBuYW1lOiBcImNvbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAxLCBjaG9pY2VzOiBbMSwgMiwgMywgNCwgNV0gfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwobmFtZSk7XG4gIHEuYWRkSXRlbShcInRleHQxXCIpO1xuICBxLmFkZEl0ZW0oXCJ0ZXh0MlwiKTtcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBJRWxlbWVudCxcbiAgQmFzZSxcbiAgSVBhbmVsLFxuICBTdXJ2ZXlFcnJvcixcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiwgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhIHtcbiAgZ2V0SXRlbUluZGV4KGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSk6IG51bWJlcjtcbiAgZ2V0UGFuZWxJdGVtRGF0YShpdGVtOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0pOiBhbnk7XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLCBuYW1lOiBzdHJpbmcsIHZhbDogYW55KTogYW55O1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSVRleHRQcm9jZXNzb3Ige1xuICBwdWJsaWMgc3RhdGljIEl0ZW1WYXJpYWJsZU5hbWUgPSBcInBhbmVsXCI7XG4gIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInBhbmVsSW5kZXhcIjtcbiAgcHJpdmF0ZSBwYW5lbFZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGE7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgY29uc3RydWN0b3IoZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSwgcGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFuZWxWYWx1ZSA9IHBhbmVsO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbihcbiAgICAgIHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlXG4gICAgKSB7XG4gICAgICBzZWxmLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5zZXRTdXJ2ZXlJbXBsKCk7XG4gICAgdGhpcy5wYW5lbC51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gIH1cbiAgcHVibGljIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKCkge1xuICAgIHRoaXMucGFuZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdGhpcy5wYW5lbC5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5kYXRhLmdldFBhbmVsSXRlbURhdGEodGhpcyk7XG4gICAgcmV0dXJuIHZhbHVlc1tuYW1lXTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhLnNldFBhbmVsSXRlbURhdGEodGhpcywgbmFtZSwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWUobmFtZSArIEJhc2UuY29tbWVudFByZWZpeCk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lICsgQmFzZS5jb21tZW50UHJlZml4LCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5VmFsdWVDaGFuZ2VkKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsLnF1ZXN0aW9ucztcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5kYXRhLmdldFBhbmVsSXRlbURhdGEodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgcS5vblN1cnZleVZhbHVlQ2hhbmdlZCh2YWx1ZXNbcS5nZXRWYWx1ZU5hbWUoKV0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIsIHNob3dJbmRleDogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKCFzaG93SW5kZXgpIHtcbiAgICAgIHRoaXMucGFuZWwuc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYW5lbC5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICB9XG5cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIGFsbFZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgdmFyIHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHsgcGFuZWw6IGFsbFZhbHVlcyB9O1xuICAgIGZvciAodmFyIGtleSBpbiBhbGxWYWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gYWxsVmFsdWVzW2tleV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy9JVGV4dFByb2Nlc3NvclxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkge1xuICAgIGlmICghdGV4dFZhbHVlKSByZXR1cm47XG4gICAgaWYgKHRleHRWYWx1ZS5uYW1lID09IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JbmRleFZhcmlhYmxlTmFtZSkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZGF0YS5nZXRJdGVtSW5kZXgodGhpcykgKyAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gZmlyc3ROYW1lID09IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lO1xuICAgIHRleHRWYWx1ZS5jYW5Qcm9jZXNzID0gdGV4dFZhbHVlLmlzRXhpc3RzO1xuICAgIGlmICghdGV4dFZhbHVlLmNhblByb2Nlc3MpIHJldHVybjtcbiAgICAvL25hbWUgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBhbmVsXG4gICAgdGV4dFZhbHVlLm5hbWUgPSB0ZXh0VmFsdWUubmFtZS5yZXBsYWNlKFxuICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWUgKyBcIi5cIixcbiAgICAgIFwiXCJcbiAgICApO1xuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+dGhpcy5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGZpcnN0TmFtZSk7XG4gICAgdmFyIHZhbHVlcyA9IHt9O1xuICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZVxuICAgICAgICA6IHF1ZXN0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYWxsVmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICAgIGlmIChhbGxWYWx1ZXMpIHtcbiAgICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gYWxsVmFsdWVzW2ZpcnN0TmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSwgdmFsdWVzKTtcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGV4dCA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgcmV0dXJuIHN1cnZleSA/IHN1cnZleS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpIDogdGV4dDtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogYW55IHtcbiAgICB0ZXh0ID0gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB7IGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSwgdGV4dDogdGV4dCB9O1xuICAgIGlmICh0aGlzLmdldFN1cnZleSgpKSB7XG4gICAgICByZXMgPSB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPVxuICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biAmJiBoYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhbmVsLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIHRoaXMucGFuZWwub25BbnlWYWx1ZUNoYW5nZWQoUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBwYW5lbCBkeW1hbmljIHF1ZXN0aW9uLiBZb3Ugc2V0dXAgdGhlIHRlbXBsYXRlIHBhbmVsLCBidXQgYWRkaW5nIGVsZW1lbnRzIChhbnkgcXVlc3Rpb24gb3IgYSBwYW5lbCkgYW5kIGFzc2lnbiBhIHRleHQgdG8gaXQncyB0aXRsZSwgYW5kIHRoaXMgcGFuZWwgd2lsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpbmcgZHluYW1pYyBwYW5lbHMuIFRoZSBudW1iZXIgb2YgcGFuZWxzIGlzIGRlZmluZWQgYnkgcGFuZWxDb3VudCBwcm9wZXJ0eS5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHBhbmVscywgdW5sZXNzIHlvdSBmb3JiaWRkZW4gdGhpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBwdWJsaWMgc3RhdGljIE1heFBhbmVsQ291bnQgPSAxMDA7XG4gIHByaXZhdGUgdGVtcGxhdGVWYWx1ZTogUGFuZWxNb2RlbDtcbiAgcHJpdmF0ZSBpdGVtc1ZhbHVlOiBBcnJheTxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+ID0gbmV3IEFycmF5PFxuICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICA+KCk7XG4gIHByaXZhdGUgbG9hZGluZ1BhbmVsQ291bnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjdXJyZW50SW5kZXhWYWx1ZTogbnVtYmVyID0gLTE7XG5cbiAgcmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcGFuZWxDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFsdWUgPSB0aGlzLmNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgdGhpcy50ZW1wbGF0ZS5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnbiA9IHRoaXM7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGVtcGxhdGUuYWRkRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgc2VsZi5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQpO1xuICAgICAgc2VsZi5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbW92ZUVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIHNlbGYucmVidWlsZFBhbmVscygpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJwYW5lbHNTdGF0ZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICB0aGlzLnRlbXBsYXRlLnNldFN1cnZleUltcGwodGhpcy5zdXJ2ZXlJbXBsKTtcbiAgfVxuICBwcml2YXRlIGFzc2lnbk9uUHJvcGVydHlDaGFuZ2VkVG9UZW1wbGF0ZSgpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnRlbXBsYXRlLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayhlbGVtZW50c1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayhlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAoPEJhc2U+KDxhbnk+ZWxlbWVudCkpLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICBzZWxmLm9uVGVtcGxhdGVFbGVtZW50UHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICg8UGFuZWxNb2RlbD4oPGFueT5lbGVtZW50KSkuYWRkRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICBzZWxmLmFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG9uVGVtcGxhdGVFbGVtZW50UHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQ6IGFueSwgb3B0aW9uczogYW55KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgdGhpcy5pc0Rlc2lnbk1vZGUgfHxcbiAgICAgICF0aGlzLml0ZW1zIHx8XG4gICAgICB0aGlzLml0ZW1zLmxlbmd0aCA9PSAwXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eSA9IEpzb25PYmplY3QubWV0YURhdGEuZmluZFByb3BlcnR5KFxuICAgICAgZWxlbWVudC5nZXRUeXBlKCksXG4gICAgICBvcHRpb25zLm5hbWVcbiAgICApO1xuICAgIGlmICghcHJvcGVydHkpIHJldHVybjtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHBhbmVsc1tpXS5nZXRRdWVzdGlvbkJ5TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgICAgaWYgKCEhcXVlc3Rpb24gJiYgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gIT09IG9wdGlvbnMubmV3VmFsdWUpIHtcbiAgICAgICAgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsZHluYW1pY1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbC4gVGhpcyBwYW5lbCBpcyB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpZ24gZHluYW1pYyBwYW5lbHNcbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsKCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCBlbGVtZW50cywgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS50aXRsZSA9IG5ld1ZhbHVlO1xuICB9XG4gIGdldCBsb2NUZW1wbGF0ZVRpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LlxuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb247XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlLmRlc2NyaXB0aW9uID0gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RlbXBsYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY0Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpdGVtcygpOiBBcnJheTxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1ZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgZHluYW1pYyBwYW5lbHMgY3JlYXRlZCBiYXNlZCBvbiBwYW5lbCB0ZW1wbGF0ZVxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbHMoKTogQXJyYXk8UGFuZWxNb2RlbD4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMuaXRlbXNbaV0ucGFuZWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyAtMSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSB2YWx1ZSBmcm9tIDAgdG8gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaXNSZW5kZXJNb2RlTGlzdCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleFZhbHVlIDwgMCAmJiB0aGlzLnBhbmVsQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgPj0gdGhpcy5wYW5lbENvdW50KSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsID49IHRoaXMucGFuZWxDb3VudCkgdmFsID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdmFsO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGR5bmFtaWNhbCBwYW5lbCB3aGVuIHRoZSByZW5kZXJNb2RlIGlzIG5vdCBcImxpc3RcIi4gSWYgdGhlcmUgaXMgbm8gZHltYW1pYyBwYW5lbCAocGFuZWxDb3VudCA9IDApIG9yIHJlbmRlck1vZGUgZXF1YWxzIFwibGlzdFwiIGl0IHJldHVybnMgbnVsbC5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleDtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW2luZGV4XTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIG9uIHJlbW92aW5nIGEgcGFuZWxcbiAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gYSBxdWVzdGlvbiBuYW1lIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHBhbmVsIGFuZCB0aGUgbGlicmFyeSBzaG93cyBkdXBsaWNhdGlvbiBlcnJvciwgaWYgdGhlcmUgYXJlIHNhbWUgdmFsdWVzIGluIGRpZmZlcmVudCBwYW5lbHMgb2YgdGhpcyBxdWVzdGlvbi5cbiAgICogQHNlZSBrZXlEdXBsaWNhdGlvbkVycm9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjb25maXJtRGVsZXRlXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb25maXJtRGVsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgKiBAc2VlIGtleU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5RHVwbGljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleUR1cGxpY2F0aW9uRXJyb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jS2V5RHVwbGljYXRpb25FcnJvcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJldmlvdXMgYnV0dG9uIHRleHQuIFByZXZpb3VzIGJ1dHRvbiBzaG93cyB0aGUgcHJldmlvdXMgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFByZXZUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbFByZXZUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGFnZVByZXZUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsUHJldlRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsUHJldlRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgbmV4dCBidXR0b24gdGV4dC4gTmV4dCBidXR0b24gc2hvd3MgdGhlIG5leHQgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbE5leHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGFnZU5leHRUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsTmV4dFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsTmV4dFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxOZXh0VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYWRkIHBhbmVsIGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbEFkZFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbEFkZFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRQYW5lbFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbEFkZFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxBZGRUZXh0XCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxBZGRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSBwYW5lbCBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxSZW1vdmVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxSZW1vdmVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUGFuZWxcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxSZW1vdmVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFJlbW92ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxSZW1vdmVUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUmVtb3ZlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwicHJvZ3Jlc3NUb3BcIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcm9ncmVzc1RvcFNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wXCIgfHwgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZW5kZXJNb2RlIGVxdWFscyB0byBcInByb2dyZXNzQm90dG9tXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJvZ3Jlc3NCb3R0b21TaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc0JvdHRvbVwiIHx8XG4gICAgICB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gY3VycmVudEluZGV4IGlzIG1vcmUgdGhhbiAwLlxuICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAqIEBzZWUgY3VycmVuUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcmV2QnV0dG9uU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBjdXJyZW50SW5kZXggaXMgbW9yZSB0aGFuIG9yIGVxdWFsIDAgYW5kIGxlc3MgdGhlbiBwYW5lbENvdW50IC0gMS5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIGN1cnJlblBhbmVsXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBpc05leHRCdXR0b25TaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMuY3VycmVudEluZGV4IDwgdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gc2hvd1JhbmdlSW5Qcm9ncmVzcyBlcXVhbHMgdG8gdHJ1ZSwgcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiIGFuZCBwYW5lbENvdW50IGlzID49IDIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmFuZ2VTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNob3dSYW5nZUluUHJvZ3Jlc3MgJiZcbiAgICAgICh0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMucGFuZWxDb3VudCA+IDEpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiBpbmNsdWRlSGlkZGVuID8gW3RoaXMudGVtcGxhdGVdIDogdGhpcy50ZW1wbGF0ZUVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQvc2V0IHRoZSBudW1iZXIgb2YgZHluYW1pYyBwYW5lbHMuXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgKiBAc2VlIGFkZFBhbmVsXG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxcbiAgICogQHNlZSByZW1vdmVQYW5lbFVJXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZVxuICAgICAgPyB0aGlzLmxvYWRpbmdQYW5lbENvdW50XG4gICAgICA6IHRoaXMuaXRlbXMubGVuZ3RoO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMubG9hZGluZ1BhbmVsQ291bnQgPSB2YWw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgPT0gdGhpcy5pdGVtcy5sZW5ndGggfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wYW5lbENvdW50OyBpIDwgdmFsOyBpKyspIHtcbiAgICAgIHZhciBuZXdJdGVtID0gdGhpcy5jcmVhdGVOZXdJdGVtKCk7XG4gICAgICB0aGlzLml0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICBpZiAodGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiICYmIHRoaXMucGFuZWxzU3RhdGUgIT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzU3RhdGUgPT09IFwiZXhwYW5kXCIpIHtcbiAgICAgICAgICBuZXdJdGVtLnBhbmVsLmV4cGFuZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0l0ZW0ucGFuZWwuY29sbGFwc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsIDwgdGhpcy5wYW5lbENvdW50KSB0aGlzLml0ZW1zLnNwbGljZSh2YWwsIHRoaXMucGFuZWxDb3VudCAtIHZhbCk7XG4gICAgdGhpcy5zZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCk7XG4gICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGFsbG93IHRoZSBlbmQtdXNlciB0byBjb2xsYXBzZS9leHBhbmQgdGhlIHBhbmVscy4gSXQgd29ya3Mgb25seSBpZiB0aGUgcmVuZGVyTW9kZSBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJsaXN0XCIgYW5kIHRlbXBsYXRlVGl0bGUgcHJvcGVydHkgaXMgbm90IGVtcHR5LiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYXZhaWxhYmxlOlxuICAgKiA8YnIvPiBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZXIgY2FuJ3QgY29sbHBhc2UvZXhwYW5kIHBhbmVsc1xuICAgKiA8YnIvPiBleHBhbmRlZCAtIFVzZXIgY2FuIGNvbGxwYXNlL2V4cGFuZCBwYW5lbHMgYW5kIGFsbCBwYW5lbHMgYXJlIGV4cGFuZGVkIGJ5IGRlZmF1bHRcbiAgICogPGJyLz4gY29sbGFwc2VkIC0gVXNlciBjYW4gY29sbHBhc2UvZXhwYW5kIHBhbmVscyBhbmQgYWxsIHBhbmVscyBhcmUgY29sbGFwc2VkIGJ5IGRlZmF1bHRcbiAgICogPGJyLz4gZmlyc3RFeHBhbmRlZCAtIFVzZXIgY2FuIGNvbGxwYXNlL2V4cGFuZCBwYW5lbHMuIFRoZSBmaXJzdCBwYW5lbCBpcyBleHBhbmRlZCBhbmQgb3RoZXJzIGFyZSBjb2xsYXBzZWRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbHNTdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYW5lbHNTdGF0ZVwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbHNTdGF0ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhbmVsc1N0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbHNTdXJ2ZXlJbXBsKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5zZXRTdXJ2ZXlJbXBsKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxzU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMucmVuZGVyTW9kZSAhPSBcImxpc3RcIikgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy5wYW5lbHNTdGF0ZTtcbiAgICAgIGlmIChzdGF0ZSA9PT0gXCJmaXJzdEV4cGFuZGVkXCIpIHtcbiAgICAgICAgc3RhdGUgPSBpID09PSAwID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXRlbXNbaV0ucGFuZWwuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW107XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gdmFsdWUubGVuZ3RoOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHZhbHVlLnB1c2goe30pO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLnBhbmVsQ291bnQpXG4gICAgICB2YWx1ZS5zcGxpY2UodGhpcy5wYW5lbENvdW50LCB2YWx1ZS5sZW5ndGggLSB0aGlzLnBhbmVsQ291bnQpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gcGFuZWwgY291bnQuIEEgdXNlciBjb3VsZCBub3QgZGVsZXRlIGEgcGFuZWwgaWYgdGhlIHBhbmVsQ291bnQgZXF1YWxzIHRvIG1pblBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtaW5QYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblBhbmVsQ291bnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5QYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHZhbCA9IDA7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm1pblBhbmVsQ291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5QYW5lbENvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA+IHRoaXMubWF4UGFuZWxDb3VudCkgdGhpcy5tYXhQYW5lbENvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnBhbmVsQ291bnQgPCB2YWwpIHRoaXMucGFuZWxDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gcGFuZWwgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcGFuZWwgaWYgdGhlIHBhbmVsQ291bnQgZXF1YWxzIHRvIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhQYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgIFwibWF4UGFuZWxDb3VudFwiLFxuICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5NYXhQYW5lbENvdW50XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFBhbmVsQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHJldHVybjtcbiAgICBpZiAodmFsID4gUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5NYXhQYW5lbENvdW50KVxuICAgICAgdmFsID0gUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5NYXhQYW5lbENvdW50O1xuICAgIGlmICh2YWwgPT0gdGhpcy5tYXhQYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4UGFuZWxDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPCB0aGlzLm1pblBhbmVsQ291bnQpIHRoaXMubWluUGFuZWxDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5wYW5lbENvdW50ID4gdmFsKSB0aGlzLnBhbmVsQ291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdBZGQgTmV3JyBidXR0b25cbiAgICogQHNlZSBhbGxvd1JlbW92ZVBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93QWRkUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93QWRkUGFuZWxcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0FkZFBhbmVsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93QWRkUGFuZWxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgJ1JlbW92ZScgYnV0dG9uXG4gICAqIEBzZWUgYWxsb3dBZGRQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd1JlbW92ZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd1JlbW92ZVBhbmVsXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dSZW1vdmVQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd1JlbW92ZVBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoZSB0ZW1wbGF0ZSBxdWVzdGlvbnMuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgUGFuZWxNb2RlbEJhc2UucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNob3cvaGlkZSB0aGUgbnVtYmVycyBpbiB0aXRsZXMgaW4gcXVlc3Rpb25zIGluc2lkZSBhIGR5bmFtaWMgcGFuZWwuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIFwib2ZmXCIuIFlvdSBtYXkgc2V0IGl0IHRvIFwib25QYW5lbFwiIGFuZCB0aGUgZmlyc3QgcXVlc3Rpb24gaW5zaWRlIGEgZHluYW1pYyBwYW5lbCB3aWxsIHN0YXJ0IHdpdGggMSBvciBcIm9uU3VydmV5XCIgdG8gaW5jbHVkZSBuZXN0ZWQgcXVlc3Rpb25zIGluIGR5bWFtaWMgcGFuZWxzIGludG8gZ2xvYmFsIHN1cnZleSBxdWVzdGlvbiBudW1iZXJpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCBcIm9mZlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dRdWVzdGlvbk51bWJlcnModmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTaG93cyB0aGUgcmFuZ2UgZnJvbSAxIHRvIHBhbmVsQ291bnQgd2hlbiByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuIFNldCB0byBmYWxzZSB0byBoaWRlIHRoaXMgZWxlbWVudC5cbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UmFuZ2VJblByb2dyZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJsaXN0XCIgYW5kIGFsbCBkeW5hbWljIHBhbmVscyBhcmUgcmVuZGVyZWQgb25lIGJ5IG9uZSBvbiB0aGUgcGFnZS4gWW91IG1heSBjaGFuZ2UgaXQgdG86IFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIiB0byByZW5kZXIgb25seSBvbmUgZHluYW1pYyBwYW5lbCBhdCBvbmNlLiBUaGUgcHJvZ3Jlc3MgYW5kIG5hdmlnYXRpb24gZWxlbWVudHMgY2FuIGJlIHJlbmRyZWQgb24gdG9wLCBib3R0b20gb3IgYm90aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJNb2RlXCIsIFwibGlzdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbmRlck1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJNb2RlXCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5yZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gcmVuZGVyTW9kZSBlcXVhbHMgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlbmRlck1vZGVMaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlck1vZGUgPT0gXCJsaXN0XCI7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSByZXR1cm4gMDtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uU3VydmV5XCIgPyB2YWx1ZSA6IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY291bnRlciA9IHRoaXMuaXRlbXNbaV0uc2V0VmlzaWJsZUluZGV4KFxuICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvZmZcIlxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblN1cnZleVwiKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggKz0gY291bnRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuc2V0VmlzaWJsZUluZGV4KHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9uU3VydmV5XCIgPyB2YWx1ZSA6IC0xKTtcbiAgICByZXR1cm4gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25TdXJ2ZXlcIiA/IDEgOiBzdGFydEluZGV4IC0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGFuIGVuZCB1c2VyIG1heSBhZGQgYSBuZXcgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGxlc3MgdGhhbiBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkFkZFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd0FkZFBhbmVsICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnBhbmVsQ291bnQgPCB0aGlzLm1heFBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBlbmQgdXNlciBtYXkgcmVtb3ZlIGEgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGlzIG1vcmUgdGhhbiBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd1JlbW92ZVBhbmVsICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnBhbmVsQ291bnQgPiB0aGlzLm1pblBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZWJ1aWxkUGFuZWxzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIGl0ZW1zID0gbmV3IEFycmF5PFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbT4oKTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCB0aGlzLnRlbXBsYXRlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHtcbiAgICAgICAgaXRlbXMucHVzaCh0aGlzLmNyZWF0ZU5ld0l0ZW0oKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB0aGlzLml0ZW1zVmFsdWUgPSBpdGVtcztcbiAgICB0aGlzLnJlUnVuQ29uZGl0aW9uKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogSWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGV2ZXJ5IG5ldyBwYW5lbCwgaW5jbHVkaW5nIHBhbmVscyBjcmVhdGVkIGluaXRpYWxseSwgdW5sZXNzIHRoZSBkZWZhdWx0VmFsdWUgaXMgbm90IGVtcHR5XG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFBhbmVsVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFBhbmVsVmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0UGFuZWxWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRQYW5lbFZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gbmV3IGFkZGVkIHBhbmVsIGZyb20gdGhlIGxhc3QgcGFuZWwuIElmIGRlZmF1bHRQYW5lbFZhbHVlIGlzIHNldCBhbmQgdGhpcyBwcm9wZXJ0eSBlcXVhbHMgdG8gdHJ1ZSxcbiAgICogdGhlbiB0aGUgdmFsdWUgZm9yIG5ldyBhZGRlZCBwYW5lbCBpcyBtZXJnaW5nLlxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRQYW5lbFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWxcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKVxuICAgICkge1xuICAgICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgfHwgdGhpcy5wYW5lbENvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5pc1Jvd0VtcHR5KHZhbFtpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1Jvd0VtcHR5KHZhbDogYW55KSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkocHJvcCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGR5bmFtaWMgcGFuZWwgYmFzZWQgb24gdGhlIHRlbXBsYXRlIFBhbmVsLiBJdCBjaGVja3MgaWYgY2FuQWRkUGFuZWwgcmV0dXJucyB0cnVlIGFuZCB0aGVuIGNhbGxzIGFkZFBhbmVsIG1ldGhvZC5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBjYW5BZGRQYW5lbFxuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsVUkoKTogUGFuZWxNb2RlbCB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZFBhbmVsKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbmV3UGFuZWwgPSB0aGlzLmFkZFBhbmVsKCk7XG4gICAgaWYgKHRoaXMucmVuZGVyTW9kZSA9PT0gXCJsaXN0XCIgJiYgdGhpcy5wYW5lbHNTdGF0ZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgIG5ld1BhbmVsLmV4cGFuZCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UGFuZWw7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBkeW5hbWljIHBhbmVsIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBQYW5lbC5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbHNcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB0aGlzLnBhbmVsQ291bnQrKztcbiAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBoYXNNb2RpZmllZCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFuZXdWYWx1ZSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJlxuICAgICAgICBuZXdWYWx1ZS5sZW5ndGggPT0gdGhpcy5wYW5lbENvdW50XG4gICAgICApIHtcbiAgICAgICAgaGFzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvcHlWYWx1ZShuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSwgdGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbCAmJlxuICAgICAgISFuZXdWYWx1ZSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiZcbiAgICAgIG5ld1ZhbHVlLmxlbmd0aCA+IDEgJiZcbiAgICAgIG5ld1ZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnRcbiAgICApIHtcbiAgICAgIGhhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29weVZhbHVlKFxuICAgICAgICBuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSxcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMl1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChoYXNNb2RpZmllZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbEFkZGVkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLml0ZW1zW3RoaXMucGFuZWxDb3VudCAtIDFdLnBhbmVsO1xuICB9XG4gIHByaXZhdGUgY29weVZhbHVlKHNyYzogYW55LCBkZXN0OiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGVzdCkge1xuICAgICAgc3JjW2tleV0gPSBkZXN0W2tleV07XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIHJlbW92ZVBhbmVsIGZ1bmN0aW9uLiBEbyBub3RoaW5nIGlzIGNhblJlbW92ZVBhbmVsIHJldHVybnMgZmFsc2UuIElmIGNvbmZpcm1EZWxldGUgc2V0IHRvIHRydWUsIGl0IHNob3dzIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZpcnN0LlxuICAgKiBAcGFyYW0gdmFsdWUgYSBwYW5lbCBvciBwYW5lbCBpbmRleFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVxuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVUZXh0XG4gICAqIEBzZWUgY2FuUmVtb3ZlUGFuZWxcbiAgICpcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbFVJKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUGFuZWwpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSB8fCBjb25maXJtKHRoaXMuY29uZmlybURlbGV0ZVRleHQpKSB7XG4gICAgICB0aGlzLnJlbW92ZVBhbmVsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQYW5lbFJlbW92aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZHluYW1pYyBwYW5lbCBmcm9tIHRoZSBwYW5lbHMgYXJyYXkuXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHBhbmVsIG9yIHBhbmVsIGluZGV4XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbCh2YWx1ZTogYW55KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRQYW5lbEluZGV4KHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGluZGV4ID49IHZhbHVlLmxlbmd0aCkgcmV0dXJuO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5pc1BhbmVsUmVtb3ZpbmcgPSB0cnVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLmlzUGFuZWxSZW1vdmluZyA9IGZhbHNlO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxSZW1vdmVkKHRoaXMsIGluZGV4KTtcbiAgfVxuICBwcml2YXRlIGdldFBhbmVsSW5kZXgodmFsOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICghaXNOYU4ocGFyc2VGbG9hdCh2YWwpKSAmJiBpc0Zpbml0ZSh2YWwpKSByZXR1cm4gdmFsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXRlbXNbaV0gPT09IHZhbCB8fCB0aGlzLml0ZW1zW2ldLnBhbmVsID09PSB2YWwpIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYW5lbHNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXNJblBhbmVsKGkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICAgIHBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIHZhbHVlcyA9ICEhdmFsICYmIGluZGV4IDwgdmFsLmxlbmd0aCA/IHZhbFtpbmRleF0gOiBudWxsO1xuICAgIGlmICghdmFsdWVzKSByZXR1cm47XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIGlmICghcGFuZWwuZ2V0UXVlc3Rpb25CeU5hbWUoa2V5KSkge1xuICAgICAgICBkZWxldGUgdmFsdWVzW2tleV07XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHZhbFtpbmRleF0gPSB2YWx1ZXM7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB2YXIgcHJlZml4ID0gdGhpcy5uYW1lICsgXCJbMF0uXCI7XG4gICAgdmFyIHBhbmVsTmFtZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy50ZW1wbGF0ZS5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5hZGRDb25kaXRpb25OYW1lcyhwYW5lbE5hbWVzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lcy5wdXNoKHByZWZpeCArIHBhbmVsTmFtZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHRcbiAgICAgID8gdGhpcy50ZW1wbGF0ZS5xdWVzdGlvbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xXG4gICAgICA6IGZhbHNlO1xuICAgIHZhciBwcmVmaXhOYW1lID0gdGhpcy5uYW1lICsgXCJbMF0uXCI7XG4gICAgdmFyIHByZWZpeFRleHQgPSB0aGlzLnByb2Nlc3NlZFRpdGxlICsgXCJbMF0uXCI7XG4gICAgdmFyIHBhbmVsT2JqcyA9IG5ldyBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PigpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnRlbXBsYXRlLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLmFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQocGFuZWxPYmpzLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbE9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgIG5hbWU6IHByZWZpeE5hbWUgKyBwYW5lbE9ianNbaV0ubmFtZSxcbiAgICAgICAgdGV4dDogcHJlZml4VGV4dCArIHBhbmVsT2Jqc1tpXS50ZXh0LFxuICAgICAgICBxdWVzdGlvbjogcGFuZWxPYmpzW2ldLnF1ZXN0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxPYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYW5lbE9ianNbaV0ucXVlc3Rpb24gPT0gY29udGV4dCkgY29udGludWU7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJwYW5lbC5cIiArIHBhbmVsT2Jqc1tpXS5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicGFuZWwuXCIgKyBwYW5lbE9ianNbaV0udGV4dCxcbiAgICAgICAgICBxdWVzdGlvbjogcGFuZWxPYmpzW2ldLnF1ZXN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gc3VwZXIuZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvciwgcGF0aCk7XG4gICAgdmFyIHF1ZXN0aW9uTmFtZSA9IHBhdGg7XG4gICAgdmFyIHBvcyA9IHBhdGguaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKHBvcyA+IC0xKSB7XG4gICAgICBxdWVzdGlvbk5hbWUgPSBwYXRoLnN1YnN0cigwLCBwb3MpO1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKHBvcyArIDEpO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnRlbXBsYXRlLmdldFF1ZXN0aW9uQnlOYW1lKHF1ZXN0aW9uTmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHF1ZXN0aW9uLmdldENvbmRpdGlvbkpzb24ob3BlcmF0b3IsIHBhdGgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5vblN1cnZleUxvYWQoKTtcbiAgICBpZiAodGhpcy5sb2FkaW5nUGFuZWxDb3VudCA+IDApIHtcbiAgICAgIHRoaXMucGFuZWxDb3VudCA9IHRoaXMubG9hZGluZ1BhbmVsQ291bnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0UGFuZWxzU3VydmV5SW1wbCgpO1xuICAgIHRoaXMuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB0aGlzLmFzc2lnbk9uUHJvcGVydHlDaGFuZ2VkVG9UZW1wbGF0ZSgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIHRoaXMudGVtcGxhdGUub25GaXJzdFJlbmRlcmluZygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5wYW5lbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5QYW5lbHNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJlUnVuQ29uZGl0aW9uKCkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdGhpcy5ydW5Db25kaXRpb24oXG4gICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBydW5QYW5lbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICB2YXIgbmV3VmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAodmFsdWVzICYmIHZhbHVlcyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgbmV3VmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZXMpKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZXNbXG4gICAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lXG4gICAgICBdID0gdGhpcy5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMuaXRlbXNbaV0pO1xuICAgICAgbmV3VmFsdWVzW1F1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JbmRleFZhcmlhYmxlTmFtZV0gPSBpO1xuICAgICAgdGhpcy5pdGVtc1tpXS5ydW5Db25kaXRpb24obmV3VmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICB2YXIgZXJyb3NJblBhbmVscyA9IHRoaXMuaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCBlcnJvc0luUGFuZWxzO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFuZWxzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tqXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYW5lbHNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHF1ZXN0aW9uc1tqXS5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIHZhciBrZXlWYWx1ZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBubEVycm9yID0gcGFuZWxzW2ldLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spO1xuICAgICAgcG5sRXJyb3IgPSB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKHBhbmVsc1tpXSwga2V5VmFsdWVzKSB8fCBwbmxFcnJvcjtcbiAgICAgIGlmICghdGhpcy5pc1JlbmRlck1vZGVMaXN0ICYmIHBubEVycm9yICYmICFyZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpO1xuICAgICAgfVxuICAgICAgcmVzID0gcG5sRXJyb3IgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWQocGFuZWw6IFBhbmVsTW9kZWwsIGtleVZhbHVlczogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5rZXlOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPnBhbmVsLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodGhpcy5rZXlOYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8IHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWUgPT0ga2V5VmFsdWVzW2ldKSB7XG4gICAgICAgIHF1ZXN0aW9uLmFkZEVycm9yKG5ldyBDdXN0b21FcnJvcih0aGlzLmtleUR1cGxpY2F0aW9uRXJyb3IsIHRoaXMpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGtleVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0l0ZW0oKTogUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCB0aGlzLmNyZWF0ZU5ld1BhbmVsKCkpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTtcbiAgICB2YXIganNvbiA9IHRoaXMudGVtcGxhdGUudG9KU09OKCk7XG4gICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBwYW5lbCk7XG4gICAgcGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbE9iamVjdCgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBwYW5lbC5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0VGVtcGxhdGVRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcml2YXRlIGdldFRlbXBsYXRlUXVlc3Rpb25UaXRsZUxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVGl0bGVMb2NhdGlvbiAhPSBcImRlZmF1bHRcIlxuICAgICAgPyB0aGlzLnRlbXBsYXRlVGl0bGVMb2NhdGlvblxuICAgICAgOiB0aGlzLmdldFRpdGxlTG9jYXRpb25Db3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5KSByZXR1cm47XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIG5ld1BhbmVsQ291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XG4gICAgaWYgKFxuICAgICAgIVF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuaXNQYW5lbFJlbW92aW5nICYmXG4gICAgICBuZXdQYW5lbENvdW50IDw9IHRoaXMucGFuZWxDb3VudFxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnBhbmVsQ291bnQgPSBuZXdQYW5lbENvdW50O1xuICB9XG4gIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5vblN1cnZleVZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7XG4gICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlLnNldFN1cnZleUltcGwodGhpcy5zdXJ2ZXlJbXBsKTtcbiAgICAgIHRoaXMucmVidWlsZFBhbmVscygpO1xuICAgIH1cbiAgfVxuICAvL0lRdWVzdGlvblBhbmVsRHluYW1pY0RhdGFcbiAgZ2V0SXRlbUluZGV4KGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgfVxuICBnZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSk6IGFueSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciBxVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChcbiAgICAgIGluZGV4IDwgMCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShxVmFsdWUpICYmXG4gICAgICBxVmFsdWUubGVuZ3RoID4gdGhpcy5pdGVtcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIGluZGV4ID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB7fTtcbiAgICBpZiAoIXFWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShxVmFsdWUpIHx8IHFWYWx1ZS5sZW5ndGggPD0gaW5kZXgpIHJldHVybiB7fTtcbiAgICByZXR1cm4gcVZhbHVlW2luZGV4XTtcbiAgfVxuICBzZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIHZhciBxVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghcVZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHFWYWx1ZSkpIHtcbiAgICAgIHFWYWx1ZSA9IFtdO1xuICAgIH1cbiAgICBpZiAocVZhbHVlLmxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgZm9yICh2YXIgaSA9IHFWYWx1ZS5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICBxVmFsdWUucHVzaCh7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcVZhbHVlW2luZGV4XSkgcVZhbHVlW2luZGV4XSA9IHt9O1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgcVZhbHVlW2luZGV4XVtuYW1lXSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHFWYWx1ZVtpbmRleF1bbmFtZV07XG4gICAgfVxuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgdGhpcy52YWx1ZSA9IHFWYWx1ZTtcbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgcGFuZWw6IGl0ZW0ucGFuZWwsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGl0ZW1JbmRleDogaW5kZXgsXG4gICAgICAgIGl0ZW1WYWx1ZTogcVZhbHVlW2luZGV4XSxcbiAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJwYW5lbGR5bmFtaWNcIixcbiAgW1xuICAgIHsgbmFtZTogXCJ0ZW1wbGF0ZUVsZW1lbnRzXCIsIGFsdGVybmF0aXZlTmFtZTogXCJxdWVzdGlvbnNcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidGVtcGxhdGVUaXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZW1wbGF0ZVRpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRGVzY3JpcHRpb246dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlRGVzY3JpcHRpb25cIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFsbG93QWRkUGFuZWw6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImFsbG93UmVtb3ZlUGFuZWw6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICAgIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJtaW5QYW5lbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhQYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5NYXhQYW5lbENvdW50XG4gICAgfSxcbiAgICBcImRlZmF1bHRQYW5lbFZhbHVlOnBhbmVsdmFsdWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWw6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxzU3RhdGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImNvbGxhcHNlZFwiLCBcImV4cGFuZGVkXCIsIFwiZmlyc3RFeHBhbmRlZFwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcImtleU5hbWVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0tleUR1cGxpY2F0aW9uRXJyb3JcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNvbmZpcm1EZWxldGU6Ym9vbGVhblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbmZpcm1EZWxldGVUZXh0XCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJwYW5lbEFkZFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsQWRkVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUmVtb3ZlVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxSZW1vdmVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxQcmV2VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxQcmV2VGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsTmV4dFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsTmV4dFRleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICAgIGNob2ljZXM6IFtcIm9mZlwiLCBcIm9uUGFuZWxcIiwgXCJvblN1cnZleVwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInNob3dSYW5nZUluUHJvZ3Jlc3NcIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVuZGVyTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJsaXN0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJsaXN0XCIsIFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiLCBcInByb2dyZXNzVG9wQm90dG9tXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXVxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSByYWRpb2dyb3VwIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhZGlvZ3JvdXBcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0SWQgKyBcIl8wXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNob3cgXCJjbGVhciBidXR0b25cIiBmbGFnLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93Q2xlYXJCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dDbGVhckJ1dHRvblwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93Q2xlYXJCdXR0b24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NsZWFyQnV0dG9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBjbGVhckJ1dHRvbkNhcHRpb24oKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjbGVhckNhcHRpb25cIik7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJyYWRpb2dyb3VwXCIsXG4gIFt7IG5hbWU6IFwic2hvd0NsZWFyQnV0dG9uOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSByYXRpbmcgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhdGluZ01vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwdWJsaWMgc3RhdGljIE1heGltdW1SYXRlVmFsdWVDb3VudDogbnVtYmVyID0gMjA7XG4gIHByaXZhdGUgcmF0ZXM6IEFycmF5PEl0ZW1WYWx1ZT47XG5cbiAgcmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5yYXRlcyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJhdGVzXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicmF0ZXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uKHNlbmRlcjogYW55LCBvcHRpb25zOiBhbnkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZU1pblwiIHx8XG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVNYXhcIiB8fFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlU3RlcFwiXG4gICAgICApIHtcbiAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBsb2NNaW5SYXRlRGVzY3JpcHRpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHZhciBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGxvY01pblJhdGVEZXNjcmlwdGlvblZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0ICsgXCIgXCIgOiB0ZXh0O1xuICAgIH07XG4gICAgbG9jTWF4UmF0ZURlc2NyaXB0aW9uVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IFwiIFwiICsgdGV4dCA6IHRleHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJhdGUgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uIElmIGl0IGlzIGVtcHR5IHRoZSBhcnJheSBpcyBnZW5lcmF0ZWQgYnkgdXNpbmcgcmF0ZU1pbiwgcmF0ZU1heCBhbmQgcmF0ZVN0ZXAgcHJvcGVydGllcy5cbiAgICogQHNlZSByYXRlTWluXG4gICAqIEBzZWUgcmF0ZU1heFxuICAgKiBAc2VlIHJhdGVTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmF0ZXM7XG4gIH1cbiAgcHVibGljIHNldCByYXRlVmFsdWVzKHZhbDogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBnZW5lcmF0ZSByYXRlIHZhbHVlcyBpZiByYXRlVmFsdWVzIGFycmF5IGlzIGVtcHR5LiBJdCBpcyB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIHJhdGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS5cbiAgICogQHNlZSByYXRlVmFsdWVzXG4gICAqIEBzZWUgcmF0ZU1heFxuICAgKiBAc2VlIHJhdGVTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVNaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1pblwiLCAxKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVNaW4odmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsID4gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlU3RlcCkgdmFsID0gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlU3RlcDtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlTWluXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBnZW5lcmF0ZSByYXRlIHZhbHVlcyBpZiByYXRlVmFsdWVzIGFycmF5IGlzIGVtcHR5LiBJdCBpcyB0aGUgbGFzdCB2YWx1ZSBpbiB0aGUgcmF0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LlxuICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICogQHNlZSByYXRlTWluXG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZU1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyYXRlTWF4XCIsIDUpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZU1heCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCB0aGlzLnJhdGVNaW4gKyB0aGlzLnJhdGVTdGVwKSB2YWwgPSB0aGlzLnJhdGVNaW4gKyB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBzdGVwIHZhbHVlLiBUaGUgbnVtYmVyIG9mIHJhdGUgdmFsdWVzIGFyZSAocmF0ZU1heCAtIHJhdGVNaW4pIC8gcmF0ZVN0ZXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZVN0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHZhbCA9IDE7XG4gICAgaWYgKHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbikgdmFsID0gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlTWluO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbik6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcmVzID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgICAgdGhpcy52aXNpYmxlUmF0ZVZhbHVlcyxcbiAgICAgIHRoaXMudmFsdWVcbiAgICApO1xuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IHRoaXMudmFsdWU7XG4gIH1cbiAgZ2V0IHZpc2libGVSYXRlVmFsdWVzKCk6IEl0ZW1WYWx1ZVtdIHtcbiAgICBpZiAodGhpcy5yYXRlVmFsdWVzLmxlbmd0aCA+IDApIHJldHVybiB0aGlzLnJhdGVWYWx1ZXM7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMucmF0ZU1pbjtcbiAgICB3aGlsZSAoXG4gICAgICB2YWx1ZSA8PSB0aGlzLnJhdGVNYXggJiZcbiAgICAgIHJlcy5sZW5ndGggPCBRdWVzdGlvblJhdGluZ01vZGVsLk1heGltdW1SYXRlVmFsdWVDb3VudFxuICAgICkge1xuICAgICAgcmVzLnB1c2gobmV3IEl0ZW1WYWx1ZSh2YWx1ZSkpO1xuICAgICAgdmFsdWUgKz0gdGhpcy5yYXRlU3RlcDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhdGluZ1wiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWluaW11bSAoZmlyc3QpIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJhdGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pblJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblJhdGVEZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWluUmF0ZURlc2NyaXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY01pblJhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJtaW5SYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiBtYXhpbXVtIChsYXN0KSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhSYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhSYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1heFJhdGVEZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNYXhSYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInJhdGluZ1wiLFxuICBbXG4gICAgXCJoYXNDb21tZW50OmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInJhdGVWYWx1ZXM6aXRlbXZhbHVlW11cIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInJhdGVNaW46bnVtYmVyXCIsIGRlZmF1bHQ6IDEgfSxcbiAgICB7IG5hbWU6IFwicmF0ZU1heDpudW1iZXJcIiwgZGVmYXVsdDogNSB9LFxuICAgIHsgbmFtZTogXCJyYXRlU3RlcDpudW1iZXJcIiwgZGVmYXVsdDogMSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwibWluaW51bVJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY01pblJhdGVEZXNjcmlwdGlvblwiXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcIm1heGltdW1SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNYXhSYXRlRGVzY3JpcHRpb25cIlxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZ01vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhdGluZ1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZ01vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIG5vbiB2YWx1ZSBxdWVzdGlvbi4gVGhpcyBxdWVzdGlvbiBkb2Vzbid0IGFkZCBhbnkgbmV3IGZ1bmN0aW9uYWxpdHkuIEl0IGhpZGVzIHNvbWUgcHJvcGVydGllcywgaW5jbHVkaW5nIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTm9uVmFsdWUgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5vbnZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHt9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIGNvbnRleHQ6IGFueVxuICApIHt9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJub252YWx1ZVwiLFxuICBbXG4gICAgeyBuYW1lOiBcInRpdGxlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvbW1lbnRUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInZhbHVlTmFtZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJlbmFibGVJZlwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJpc1JlcXVpcmVkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlYWRPbmx5XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInZhbGlkYXRvcnNcIiwgdmlzaWJsZTogZmFsc2UgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTm9uVmFsdWUoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbm5vbnZhbHVlLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xuZXhwb3J0IGNsYXNzIFN0eWxlc01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBTdXJ2ZXlKU1N0eWxlc1NoZWV0SWQgPSBcInN1cnZleWpzXCI7XG5cbiAgcHVibGljIHN0YXRpYyBTdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2Nzc1wiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDI3NXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1wiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X2NvbnRhaW5lclwiOlxuICAgIC8vICAgXCJtYXgtd2lkdGg6IDgwJTsgbWFyZ2luOiBhdXRvOyBwb3NpdGlvbjogcmVsYXRpdmU7IGNvbG9yOiAjNmQ3MDcyOyBwYWRkaW5nOiAwIDFlbTtcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5wYW5lbC1ib2R5XCI6XG4gICAgLy8gICBcImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxZW0gMWVtIDVlbSAxZW07IGJvcmRlci10b3A6IDJweCBzb2xpZCBsaWdodGdyYXk7XCIsXG5cbiAgICBcIi5zdl9tYWluIHNwYW5cIjogXCJ3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiBsZWdlbmRcIjogXCJib3JkZXI6IG5vbmU7IG1hcmdpbjogMDtcIixcblxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG5cIjogXCJwYWRkaW5nOiAwLjVlbSAxZW0gMS41ZW0gMWVtO1wiLFxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FjYmMgaW5wdXRbdHlwZT1jaGVja2JveF0sIC5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9cmFkaW9dXCI6XG4gICAgICBcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1hcmdpbi10b3A6IC0xcHhcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuIGZpZWxkc2V0XCI6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biAgLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lOyBwb3NpdGlvbjogc3RhdGljO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveFwiOlxuICAgICAgXCJtYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O1wiLFxuXG4gICAgXCIuc3Zfcm93XCI6IFwiY2xlYXI6IGJvdGg7XCIsXG4gICAgXCIuc3Zfcm93IC5zdl9xc3RuXCI6IFwiZmxvYXQ6IGxlZnRcIixcbiAgICBcIi5zdl9yb3cgLnN2X3FzdG46bGFzdC1jaGlsZFwiOiBcImZsb2F0OiBub25lXCIsXG4gICAgXCIuc3ZfcXN0blwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgb3ZlcmZsb3c6IGF1dG87XCIsXG4gICAgXCIucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlO1wiLFxuICAgIFwiLnByb2dyZXNzLWJhclwiOiBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcbiAgICBcIi5zdl9wX2NvbnRhaW5lclwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgICBcIi5zdl9xYmxuIC5jaGVja2JveC1tYXRlcmlhbFwiOiBcIm1hcmdpbi1yaWdodDogM3B4O1wiLFxuICAgIFwiLnN2X3FjYnggLmNoZWNrYm94LW1hdGVyaWFsXCI6IFwibWFyZ2luLXJpZ2h0OiA1cHg7XCIsXG4gICAgXCIuc3ZfcWNieCAuY2hlY2tib3ggbGFiZWxcIjogXCJqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIC5yYWRpbyBsYWJlbFwiOiBcImp1c3RpZnktY29udGVudDogbGVmdDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6IFwicG9zaXRpb246IGFic29sdXRlOyBtYXJnaW46IDA7XCIsXG4gICAgXCIuc3ZfcXN0biB0ZFwiOiBcInBvc2l0aW9uOiByZWxhdGl2ZTtcIixcbiAgICBcIi5zdl9xX210X2l0ZW1fdmFsdWVcIjogXCJmbG9hdDogbGVmdDtcIixcbiAgICBcIi5zdl9xc3RuLnN2X3FzdG5fbGVmdFwiOiBcIm1hcmdpbi10b3A6IDAuNzVlbTtcIixcbiAgICBcIi5zdl9xc3RuIC50aXRsZS1sZWZ0XCI6IFwiZmxvYXQ6IGxlZnQ7IG1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gLmNvbnRlbnQtbGVmdFwiOiBcIm92ZXJmbG93OiBoaWRkZW5cIixcbiAgICBcIi5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lIC5zdl9xX3JhZGlvZ3JvdXBfb3RoZXJcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9jaGVja2JveF9pbmxpbmUgLnN2X3FfY2hlY2tib3hfb3RoZXJcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9jaGVja2JveF9pbmxpbmUsIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lLCAuc3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIjpcbiAgICAgIFwibGluZS1oZWlnaHQ6IDIuNWVtO1wiLFxuICAgIFwiLmZvcm0taW5saW5lIC5zdl9xX2NoZWNrYm94X2lubGluZTpub3QoOmxhc3QtY2hpbGQpXCI6IFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuZm9ybS1pbmxpbmUgLnN2X3FfcmFkaW9ncm91cF9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOlxuICAgICAgXCJtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9pbWdzZWwgLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldFwiOiBcImJvcmRlcjogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfZmlsZV9wbGFjZWhvbGRlclwiOiBcImRpc3BsYXk6bm9uZVwiLFxuXG4gICAgXCIuc3ZfcF90aXRsZVwiOiBcInBhZGRpbmctbGVmdDogMWVtOyBwYWRkaW5nLWJvdHRvbTogMC4zZW07XCIsXG4gICAgXCIuc3ZfcF90aXRsZV9leHBhbmRhYmxlXCI6IFwiY3Vyc29yOiBwb2ludGVyO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb25cIjogXCJmbG9hdDogcmlnaHQ7IG1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb246OmJlZm9yZVwiOlxuICAgICAgXCJjb250ZW50OiAnJzsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyBwYWRkaW5nOiAwLjVlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF5TWk0d0xqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaVRHRjVaWEpmTVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZUQwaU1IQjRJaUI1UFNJd2NIZ2lEUW9KSUhacFpYZENiM2c5SWpBZ01DQXhNQ0F4TUNJZ2MzUjViR1U5SW1WdVlXSnNaUzFpWVdOclozSnZkVzVrT201bGR5QXdJREFnTVRBZ01UQTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0TkNqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrRFFvSkxuTjBNSHRtYVd4c09pTTJSRGN3TnpJN2ZRMEtQQzl6ZEhsc1pUNE5Danh3YjJ4NVoyOXVJR05zWVhOelBTSnpkREFpSUhCdmFXNTBjejBpTWl3eUlEQXNOQ0ExTERrZ01UQXNOQ0E0TERJZ05TdzFJQ0l2UGcwS1BDOXpkbWMrRFFvPSk7XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvbi5zdl9leHBhbmRlZDo6YmVmb3JlXCI6XG4gICAgICBcInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCIsXG5cbiAgICBcIi5zdl9xX2ZpbGUgPiBpbnB1dFt0eXBlPWZpbGVdLCAuc3ZfcV9maWxlID4gYnV0dG9uXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlld1wiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsgcGFkZGluZzogNXB4OyBtYXJnaW4tdG9wOiAxMHB4O1wiLFxuICAgIFwiLnN2X3FfZmlsZV9wcmV2aWV3ID4gYVwiOlxuICAgICAgXCJkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgdmVydGljYWwtYWxpZ246IHRvcDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XCIsXG4gICAgXCIuc3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIjogXCJsaW5lLWhlaWdodDogbm9ybWFsO1wiLFxuICAgIFwiLnN2X3FfZmlsZV9yZW1vdmVcIjogXCJkaXNwbGF5OiBibG9jazsgY3Vyc29yOiBwb2ludGVyO1wiLFxuXG4gICAgXCIuc3ZfcV9tX2NlbGxfdGV4dFwiOiBcImN1cnNvcjogcG9pbnRlcjtcIixcblxuICAgIFwiLnN2X3FfZGRfb3RoZXJcIjogXCJtYXJnaW4tdG9wOiAxZW07XCIsXG4gICAgXCIuc3ZfcV9kZF9vdGhlciBpbnB1dFwiOiBcIndpZHRoOiAxMDAlO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMVwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMlwiOlxuICAgICAgXCJ3aWR0aDogNTAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC0zXCI6XG4gICAgICBcIndpZHRoOiAzMy4zMzMzMyU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTRcIjpcbiAgICAgIFwid2lkdGg6IDI1JTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtNVwiOlxuICAgICAgXCJ3aWR0aDogMjAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3FfZmlsZV9pbnB1dFwiOiBcImNvbG9yOiB0cmFuc3BhcmVudDtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2XCI6XG4gICAgICBcIm92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBwYWRkaW5nOiA0cHg7IGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsgYm9yZGVyLXJhZGl1czogNHB4O1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2ID4gaW1nLCAuc3ZfcXN0biAuc3ZfcV9pbWdzZWwgbGFiZWwgPiBkaXYgPiBlbWJlZFwiOlxuICAgICAgXCJkaXNwbGF5OiBibG9jaztcIixcblxuICAgIFwiLnN2X3FzdG4gdGFibGUgdHIgdGQgLnN2X3FfbV9jZWxsX2xhYmVsXCI6XG4gICAgICBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgcmlnaHQ6IDA7IHRvcDogMDsgYm90dG9tOiAwO1wiXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBNZWRpYTogeyBba2V5OiBzdHJpbmddOiB7IG1lZGlhOiBzdHJpbmc7IHN0eWxlOiBzdHJpbmcgfSB9ID0ge1xuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTFcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC0yXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtM1wiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTRcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC01XCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIlxuICAgIH0sXG5cbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC50aXRsZS1sZWZ0XCI6IHtcbiAgICAgIHN0eWxlOiBcImZsb2F0OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9jaGVja2JveF9pbmxpbmUsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZVwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0aGVhZFwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRib2R5LCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0ciwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdGRcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGU6bm90KC5zdl9xX21hdHJpeCkgdGQ6YmVmb3JlXCI6IHtcbiAgICAgIHN0eWxlOiBcImNvbnRlbnQ6IGF0dHIoaGVhZGVycyk7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUuc3ZfcV9tYXRyaXggdGQ6YWZ0ZXJcIjoge1xuICAgICAgc3R5bGU6IFwiY29udGVudDogYXR0cihoZWFkZXJzKTsgcGFkZGluZy1sZWZ0OiAxZW1cIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAucmFkaW8gbGFiZWwsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5jaGVja2JveCBsYWJlbFwiOiB7XG4gICAgICBzdHlsZTogXCJsaW5lLWhlaWdodDogMTJweDsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY3VzdG9tX2hlYWRlclwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDEzMDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5zdl9oZWFkZXIgaDNcIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAxLjVlbTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiAxMzAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAuc3ZfaGVhZGVyIGgzIHNwYW5cIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAwLjc1ZW07XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpXCJcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBUaGVtZUNvbG9yczogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0gPSB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZTdlN2U3XCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y0ZjRmNFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzFhYjM5NFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMwYWEzODRcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCJcbiAgICB9LFxuICAgIG9yYW5nZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y4ZjhmOFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiI2Y3ODExOVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiNlNzcxMDlcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiI2Y3ODExOVwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCJcbiAgICB9LFxuICAgIGRhcmtibHVlOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkOWQ4ZGRcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjZmN2YyXCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjM2M0ZjZkXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzJjM2Y1ZFwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgZGFya3Jvc2U6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2RkZDJjZVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmN2VmZWRcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiM2ODY1NmVcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjNTg1NTVlXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiXG4gICAgfSxcbiAgICBzdG9uZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjY2RjY2QyXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2VmZWRmNFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMxOTE5NTVcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCJcbiAgICB9LFxuICAgIHdpbnRlcjoge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjODJiOGRhXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2RhZTFlN1wiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzNjM2I0MFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMxZTFkMjBcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCJcbiAgICB9LFxuICAgIHdpbnRlcnN0b25lOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiMzMjMyMzJcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjhmOGY4XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjNWFjOGZhXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzA2YTFlN1wiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH1cbiAgfTtcbiAgcHVibGljIHN0YXRpYyBUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9kZWZhdWx0X2Nzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaHJcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXSwgLnN2X2RlZmF1bHRfY3NzIGJ1dHRvblwiOlxuICAgICAgXCJjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ106aG92ZXIsIC5zdl9kZWZhdWx0X2NzcyBidXR0b246aG92ZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfaGVhZGVyXCI6IFwiY29sb3I6ICRoZWFkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2N1c3RvbV9oZWFkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXJcIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2JvZHlcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzc19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX3Jvb3QgPiAuc3Zfcm93XCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX3Jvb3QgPiAuc3Zfcm93Om50aC1jaGlsZChvZGQpXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3c6bnRoLWNoaWxkKGV2ZW4pXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Ffb3RoZXIgaW5wdXRcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9kcm9wZG93bl9jb250cm9sXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0ndGV4dCddXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3Mgc2VsZWN0XCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGV4dGFyZWFcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9vdGhlciBpbnB1dDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfdGV4dF9yb290OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9kcm9wZG93bl9jb250cm9sOmZvY3VzXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0ndGV4dCddOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBzZWxlY3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRleHRhcmVhOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9zZWxlY3Rfd3JhcHBlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9zZWxlY3Rfd3JhcHBlcjo6YmVmb3JlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0uYWN0aXZlIC5zdl9xX3JhdGluZ19pdGVtX3RleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3JhdGluZ19pdGVtIC5zdl9xX3JhdGluZ19pdGVtX3RleHRcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3JhdGluZ19pdGVtIC5zdl9xX3JhdGluZ19pdGVtX3RleHQ6aG92ZXJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4IHRyXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2Ryb3Bkb3duIHRyXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyB0YWJsZS5zdl9xX21hdHJpeF9keW5hbWljIHRyXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX21fY2VsbF9zZWxlY3RlZFwiOlxuICAgICAgXCJjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9xX2ZpbGVfcmVtb3ZlOmhvdmVyXCI6IFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuMjllbTtcIlxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuICAgIFwiLnN2X21haW4gLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuNjZlbTtcIlxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwbWF0ZXJpYWxUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cC5pcy1mb2N1c2VkIC5mb3JtLWNvbnRyb2xcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCRtYWluLWNvbG9yLCAkbWFpbi1jb2xvciksIGxpbmVhci1ncmFkaWVudCgjRDJEMkQyLCAjRDJEMkQyKTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cC5pcy1mb2N1c2VkIGxhYmVsXCI6XG4gICAgICBcImNvbG9yOiRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrOmJlZm9yZVwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrOmJlZm9yZVwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaXJjbGVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBsYWJlbC5yYWRpby1pbmxpbmUgaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaXJjbGVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaGVja1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBsYWJlbC5yYWRpby1pbmxpbmUgaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaGVja1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLWRlZmF1bHQuYWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLWRlZmF1bHQ6YWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLXNlY29uZGFyeS5hY3RpdmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5idG4tc2Vjb25kYXJ5OmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ10uYnRuLXByaW1hcnksIC5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBidXR0b24uYnRuLXByaW1hcnlcIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLmJ0bi1wcmltYXJ5OmhvdmVyLCAuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgYnV0dG9uLmJ0bi1wcmltYXJ5OmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FfaW1nc2VsLmNoZWNrZWQgbGFiZWw+ZGl2XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9maWxlX3JlbW92ZTpob3ZlclwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cCBpbnB1dFt0eXBlPWZpbGVdXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgb3BhY2l0eTogMTtcIlxuICB9O1xuXG4gIHByaXZhdGUgc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSBudWxsO1xuXG4gIHN0YXRpYyBmaW5kU2hlZXQoc3R5bGVTaGVldElkOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZG9jdW1lbnQuc3R5bGVTaGVldHNbaV0ub3duZXJOb2RlICYmXG4gICAgICAgICg8YW55PmRvY3VtZW50KS5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGVbXCJpZFwiXSA9PT0gc3R5bGVTaGVldElkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDxDU1NTdHlsZVNoZWV0PmRvY3VtZW50LnN0eWxlU2hlZXRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlU2hlZXRJZDtcbiAgICAvLyBBZGQgYSBtZWRpYSAoYW5kL29yIG1lZGlhIHF1ZXJ5KSBoZXJlIGlmIHlvdSdkIGxpa2UhXG4gICAgLy8gc3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgXCJzY3JlZW5cIilcbiAgICAvLyBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBcIm9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMTAyNHB4KVwiKVxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+c3R5bGUuc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwcGx5VGhlbWUoXG4gICAgdGhlbWVOYW1lOiBzdHJpbmcgPSBcImRlZmF1bHRcIixcbiAgICB0aGVtZVNlbGVjdG9yOiBzdHJpbmcgPSBcIi5zdl9tYWluXCJcbiAgKSB7XG4gICAgbGV0IFRoZW1lQ3NzOiBhbnk7XG4gICAgaWYgKFtcImJvb3RzdHJhcFwiLCBcImJvb3RzdHJhcG1hdGVyaWFsXCJdLmluZGV4T2YodGhlbWVOYW1lKSAhPT0gLTEpIHtcbiAgICAgIFRoZW1lQ3NzID0gKDxhbnk+U3R5bGVzTWFuYWdlcilbdGhlbWVOYW1lICsgXCJUaGVtZUNzc1wiXTtcbiAgICAgIHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IHRoZW1lTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgVGhlbWVDc3MgPSBTdHlsZXNNYW5hZ2VyLlRoZW1lQ3NzO1xuICAgICAgc3VydmV5Q3NzLmN1cnJlbnRUeXBlID0gXCJzdGFuZGFyZFwiO1xuICAgIH1cblxuICAgIGxldCBzaGVldCA9IFN0eWxlc01hbmFnZXIuZmluZFNoZWV0KHRoZW1lTmFtZSArIHRoZW1lU2VsZWN0b3IpO1xuICAgIGlmICghc2hlZXQpIHtcbiAgICAgIHNoZWV0ID0gU3R5bGVzTWFuYWdlci5jcmVhdGVTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgIGxldCB0aGVtZSA9XG4gICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbdGhlbWVOYW1lXSB8fFxuICAgICAgICBTdHlsZXNNYW5hZ2VyLlRoZW1lQ29sb3JzW1wiZGVmYXVsdFwiXTtcblxuICAgICAgT2JqZWN0LmtleXMoVGhlbWVDc3MpLmZvckVhY2goc2VsZWN0b3IgPT4ge1xuICAgICAgICBsZXQgY3NzUnVsZVRleHQgPSBUaGVtZUNzc1tzZWxlY3Rvcl07XG4gICAgICAgIE9iamVjdC5rZXlzKHRoZW1lKS5mb3JFYWNoKFxuICAgICAgICAgIGNvbG9yVmFyaWFibGVOYW1lID0+XG4gICAgICAgICAgICAoY3NzUnVsZVRleHQgPSBjc3NSdWxlVGV4dC5yZXBsYWNlKFxuICAgICAgICAgICAgICBuZXcgUmVnRXhwKFwiXFxcXFwiICsgY29sb3JWYXJpYWJsZU5hbWUsIFwiZ1wiKSxcbiAgICAgICAgICAgICAgdGhlbWVbY29sb3JWYXJpYWJsZU5hbWVdXG4gICAgICAgICAgICApKVxuICAgICAgICApO1xuICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgIHRoZW1lU2VsZWN0b3IgKyBzZWxlY3RvciArIFwiIHsgXCIgKyBjc3NSdWxlVGV4dCArIFwiIH1cIixcbiAgICAgICAgICAwXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNoZWV0ID0gU3R5bGVzTWFuYWdlci5maW5kU2hlZXQoU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWQpO1xuICAgIGlmICghdGhpcy5zaGVldCkge1xuICAgICAgdGhpcy5zaGVldCA9IFN0eWxlc01hbmFnZXIuY3JlYXRlU2hlZXQoXG4gICAgICAgIFN0eWxlc01hbmFnZXIuU3VydmV5SlNTdHlsZXNTaGVldElkXG4gICAgICApO1xuICAgICAgdGhpcy5pbml0aWFsaXplU3R5bGVzKHRoaXMuc2hlZXQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplU3R5bGVzKHNoZWV0OiBDU1NTdHlsZVNoZWV0KSB7XG4gICAgT2JqZWN0LmtleXMoU3R5bGVzTWFuYWdlci5TdHlsZXMpLmZvckVhY2goc2VsZWN0b3IgPT5cbiAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgIHNlbGVjdG9yICsgXCIgeyBcIiArIFN0eWxlc01hbmFnZXIuU3R5bGVzW3NlbGVjdG9yXSArIFwiIH1cIixcbiAgICAgICAgMFxuICAgICAgKVxuICAgICk7XG4gICAgT2JqZWN0LmtleXMoU3R5bGVzTWFuYWdlci5NZWRpYSkuZm9yRWFjaChzZWxlY3RvciA9PiB7XG4gICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICBTdHlsZXNNYW5hZ2VyLk1lZGlhW3NlbGVjdG9yXS5tZWRpYSArXG4gICAgICAgICAgXCIgeyBcIiArXG4gICAgICAgICAgc2VsZWN0b3IgK1xuICAgICAgICAgIFwiIHsgXCIgK1xuICAgICAgICAgIFN0eWxlc01hbmFnZXIuTWVkaWFbc2VsZWN0b3JdLnN0eWxlICtcbiAgICAgICAgICBcIiB9IH1cIixcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N0eWxlc21hbmFnZXIudHMiLCJpbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHN1cnZleSBydW5uaW5nIGluIHRoZSBXaW5kb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlXaW5kb3dNb2RlbCBleHRlbmRzIEJhc2Uge1xuICBwdWJsaWMgc3RhdGljIHN1cnZleUVsZW1lbnROYW1lID0gXCJ3aW5kb3dTdXJ2ZXlKU1wiO1xuICBzdXJ2ZXlWYWx1ZTogU3VydmV5TW9kZWw7XG4gIHdpbmRvd0VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xuXG4gIHRlbXBsYXRlVmFsdWU6IHN0cmluZztcbiAgZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHNob3dpbmdDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGNsb3NlV2luZG93T25Db21wbGV0ZUNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSwgaW5pdGlhbE1vZGVsOiBTdXJ2ZXlNb2RlbCA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChpbml0aWFsTW9kZWwpIHtcbiAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSBpbml0aWFsTW9kZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSB0aGlzLmNyZWF0ZVN1cnZleShqc29uT2JqKTtcbiAgICB9XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZS5zaG93VGl0bGUgPSBmYWxzZTtcbiAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGRvY3VtZW50KSB7XG4gICAgICB0aGlzLndpbmRvd0VsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc3VydmV5Lm9uQ29tcGxldGUuYWRkKGZ1bmN0aW9uKHN1cnZleSwgb3B0aW9ucykge1xuICAgICAgc2VsZi5vblN1cnZleUNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ3aW5kb3dcIjtcbiAgfVxuICAvKipcbiAgICogQSBzdXJ2ZXkgb2JqZWN0LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1cnZleSgpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHZhbHVlIHRvIG5lZ2F0aXZlIHZhbHVlLCBmb3IgZXhhbXBsZSAtMSwgdG8gYXZvaWQgY2xvc2luZyB0aGUgd2luZG93IG9uIGNvbXBsZXRpbmcgdGhlIHN1cnZleS4gTGVhdmUgaXQgZXF1YWxzIHRvIDAgKGRlZmF1bHQgdmFsdWUpIHRvIGNsb3NlIHRoZSB3aW5kb3cgaW1tZWRpYXRlbHksIG9yIHNldCBpdCB0byAzLCA1LCAxMCwgLi4uIHRvIGNsb3NlIHRoZSB3aW5kb3cgaW4gMywgNSwgMTAgc2Vjb25kcy5cbiAgICovXG4gIHB1YmxpYyBjbG9zZU9uQ29tcGxldGVUaW1lb3V0OiBudW1iZXIgPSAwO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHNob3dpbmcuIFNldCBpdCB0byB0cnVlIHRvIHNob3cgdGhlIHdpbmRvdyBhbmQgZmFsc2UgdG8gaGlkZSBpdC5cbiAgICogQHNlZSBzaG93XG4gICAqIEBzZWUgaGlkZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1Nob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzU2hvd2luZ1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1Nob3dpbmcodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU2hvd2luZ1wiLCB2YWwpO1xuICAgIGlmICh0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIC8qKlxuICAgKiBTaG93IHRoZSB3aW5kb3dcbiAgICogQHNlZSBoaWRlXG4gICAqIEBzZWUgaXNTaG93aW5nXG4gICAqL1xuICBwdWJsaWMgc2hvdygpIHtcbiAgICB0aGlzLmlzU2hvd2luZyA9IHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEhpZGUgdGhlIHdpbmRvd1xuICAgKiBAc2VlIHNob3dcbiAgICogQHNlZSBpc1Nob3dpbmdcbiAgICovXG4gIHB1YmxpYyBoaWRlKCkge1xuICAgIHRoaXMuaXNTaG93aW5nID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGV4cGFuZGVkLiBTZXQgaXQgdG8gdHJ1ZSB0byBleHBhbmQgdGhlIHdpbmRvdyBvciBmYWxzZSB0byBjb2xsYXBzZSBpdC5cbiAgICogQHNlZSBleHBhbmRcbiAgICogQHNlZSBjb2xsYXBzZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0V4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0V4cGFuZGVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRXhwYW5kZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNFeHBhbmRlZFwiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrKVxuICAgICAgdGhpcy5leHBhbmRlZENoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgd2luZG93IGFuZCBzdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc3VydmV5LnRpdGxlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubG9jVGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgd2luZG93IHRvIHNob3cgdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBleHBhbmQoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZSh0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQ29sbGFwc2UgdGhlIHdpbmRvdyBhbmQgc2hvdyBzdXJ2ZXkgdGl0bGUgb25seS5cbiAgICovXG4gIHB1YmxpYyBjb2xsYXBzZSgpIHtcbiAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5KGpzb25PYmo6IGFueSk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleU1vZGVsKGpzb25PYmopO1xuICB9XG4gIHByb3RlY3RlZCBleHBhbmRjb2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNFeHBhbmRlZCA9IHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBvblN1cnZleUNvbXBsZXRlKCkge1xuICAgIGlmICh0aGlzLmNsb3NlT25Db21wbGV0ZVRpbWVvdXQgPCAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCA9PSAwKSB7XG4gICAgICB0aGlzLmNsb3NlV2luZG93T25Db21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdGltZXJJZDogYW55ID0gbnVsbDtcbiAgICAgIHZhciBmdW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCk7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRpbWVySWQpO1xuICAgICAgfTtcbiAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuYywgdGhpcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0ICogMTAwMCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjbG9zZVdpbmRvd09uQ29tcGxldGUoKSB7XG4gICAgaWYgKCEhdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjaykge1xuICAgICAgdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleVdpbmRvdy50cyIsImltcG9ydCB7IEV2ZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgdmFyIHN1cnZleVRpbWVyRnVuY3Rpb25zID0ge1xuICBzZXRJbnRlcnZhbDogZnVuY3Rpb24oZnVuYzogKCkgPT4gYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gd2luZG93LnNldEludGVydmFsKGZ1bmMsIDEwMDApO1xuICB9LFxuICBjbGVhckludGVydmFsOiBmdW5jdGlvbih0aW1lcklkOiBudW1iZXIpIHtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoIVN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUpIHtcbiAgICAgIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBsaXN0ZW5lckNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHRpbWVySWQgPSAtMTtcbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHN0YXJ0KGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLmFkZChmdW5jKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmRvVGltZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyQ291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBzdG9wKGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLnJlbW92ZShmdW5jKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXItLTtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50ZXIgPT0gMCAmJiB0aGlzLnRpbWVySWQgPiAtMSkge1xuICAgICAgc3VydmV5VGltZXJGdW5jdGlvbnMuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySWQpO1xuICAgICAgdGhpcy50aW1lcklkID0gLTE7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkb1RpbWVyKCkge1xuICAgIGlmICh0aGlzLnRpbWVySWQgPCAwKSByZXR1cm47XG4gICAgdGhpcy5vblRpbWVyLmZpcmUodGhpcywge30pO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5dGltZXIudHMiLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuXG5leHBvcnQgdmFyIGRlZmF1bHRCb290c3RyYXBDc3MgPSB7XG4gIHJvb3Q6IFwic3ZfbWFpbiBzdl9ib290c3RyYXBfY3NzXCIsXG4gIGhlYWRlcjogXCJwYW5lbC1oZWFkaW5nIGNhcmQtaGVhZGVyXCIsXG4gIGJvZHk6IFwicGFuZWwtYm9keSBjYXJkLWJsb2NrIG10LTRcIixcbiAgZm9vdGVyOiBcInBhbmVsLWZvb3RlciBjYXJkLWZvb3RlclwiLFxuICBuYXZpZ2F0aW9uQnV0dG9uOiBcIlwiLFxuICBjb21wbGV0ZWRQYWdlOiBcIlwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwiYnRuIHN2X2NvbXBsZXRlX2J0blwiLFxuICAgIHByZXY6IFwiYnRuIHN2X3ByZXZfYnRuXCIsXG4gICAgbmV4dDogXCJidG4gc3ZfbmV4dF9idG5cIixcbiAgICBzdGFydDogXCJidG4gc3Zfc3RhcnRfYnRuXCJcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfSxcbiAgcGFnZVRpdGxlOiBcIlwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG5cIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBoYXNFcnJvcjogXCJoYXMtZXJyb3JcIixcbiAgICBpbmRlbnQ6IDIwXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsIHN2X3BfZGVzY3JpcHRpb25cIixcbiAgICBjb250YWluZXI6IFwic3ZfcF9jb250YWluZXJcIlxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiXG4gIH0sXG5cbiAgYm9vbGVhbjoge1xuICAgIHJvb3Q6IFwic3ZfcWJsbiBmb3JtLWlubGluZSBjaGVja2JveFwiLFxuICAgIGl0ZW06IFwiXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2hlY2tib3gtbWF0ZXJpYWxcIlxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4IGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxuICAgIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXIgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIlxuICB9LFxuICBtYXRyaXg6IHtcbiAgICByb290OiBcInRhYmxlIHN2X3FfbWF0cml4XCIsXG4gICAgbGFiZWw6IFwic3ZfcV9tX2xhYmVsXCIsXG4gICAgY2VsbFRleHQ6IFwic3ZfcV9tX2NlbGxfdGV4dFwiLFxuICAgIGNlbGxUZXh0U2VsZWN0ZWQ6IFwic3ZfcV9tX2NlbGxfc2VsZWN0ZWQgYmctcHJpbWFyeVwiLFxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgYnV0dG9uOiBcImJ1dHRvblwiLFxuICAgIGJ1dHRvblByZXY6IFwiXCIsXG4gICAgYnV0dG9uTmV4dDogXCJcIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIG11bHRpcGxldGV4dDoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBpdGVtVGl0bGU6IFwiXCIsXG4gICAgaXRlbVZhbHVlOiBcInN2X3FfbXRfaXRlbV92YWx1ZSBmb3JtLWNvbnRyb2xcIlxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJyYWRpb1wiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvblwiXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2ltZ3NlbF9jb250cm9sX2l0ZW1cIixcbiAgICBpbWFnZTogXCJzdl9xX2ltZ3NlbF9pbWFnZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXJcIlxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcImJ0bi1ncm91cFwiLFxuICAgIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnlcIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiXG4gIH0sXG4gIHRleHQ6IFwiZm9ybS1jb250cm9sXCIsXG4gIGV4cHJlc3Npb246IFwiZm9ybS1jb250cm9sXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxuICAgIHBsYWNlaG9sZGVySW5wdXQ6IFwic3ZfcV9maWxlX3BsYWNlaG9sZGVyXCIsXG4gICAgcHJldmlldzogXCJzdl9xX2ZpbGVfcHJldmlld1wiLFxuICAgIHJlbW92ZUJ1dHRvbjogXCJzdl9xX2ZpbGVfcmVtb3ZlX2J1dHRvblwiLFxuICAgIGZpbGVJbnB1dDogXCJzdl9xX2ZpbGVfaW5wdXRcIixcbiAgICByZW1vdmVGaWxlOiBcInN2X3FfZmlsZV9yZW1vdmVcIlxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIixcbiAgICBlcnJvcjogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBzdWNjZXNzOiBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCJcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJtb2RhbC1jb250ZW50XCIsXG4gICAgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcIm1vZGFsLWhlYWRlciBwYW5lbC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiXG4gICAgfVxuICB9XG59O1xuKDxhbnk+c3VydmV5Q3NzKVtcImJvb3RzdHJhcFwiXSA9IGRlZmF1bHRCb290c3RyYXBDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXAudHMiLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuXG5leHBvcnQgdmFyIGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2Jvb3RzdHJhcG1hdGVyaWFsX2Nzc1wiLFxuICBoZWFkZXI6IFwicGFuZWwtaGVhZGluZ1wiLFxuICBib2R5OiBcInBhbmVsLWJvZHlcIixcbiAgZm9vdGVyOiBcInBhbmVsLWZvb3RlclwiLFxuICBuYXZpZ2F0aW9uQnV0dG9uOiBcIlwiLFxuICBjb21wbGV0ZWRQYWdlOiBcIlwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwiYnRuIHN2X2NvbXBsZXRlX2J0biBidG4tcHJpbWFyeVwiLFxuICAgIHByZXY6IFwiYnRuIHN2X3ByZXZfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgbmV4dDogXCJidG4gc3ZfbmV4dF9idG4gYnRuLXByaW1hcnlcIixcbiAgICBzdGFydDogXCJidG4gc3Zfc3RhcnRfYnRuIGJ0bi1wcmltYXJ5XCJcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfSxcbiAgcGFnZVRpdGxlOiBcIlwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG4gZm9ybS1ncm91cFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjBcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGwgc3ZfcF9kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiXG4gIH0sXG4gIGVycm9yOiB7XG4gICAgcm9vdDogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBpY29uOiBcImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiLFxuICAgIGl0ZW06IFwiXCJcbiAgfSxcblxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xYmxuIGZvcm0taW5saW5lIGNoZWNrYm94XCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2J4IGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxuICAgIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXIgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIlxuICB9LFxuICBtYXRyaXg6IHtcbiAgICByb290OiBcInRhYmxlIHN2X3FfbWF0cml4XCIsXG4gICAgcm93OiBcImZvcm0tZ3JvdXBcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWwgcmFkaW8taW5saW5lXCIsXG4gICAgY2VsbFRleHQ6IFwic3ZfcV9tX2NlbGxfdGV4dFwiLFxuICAgIGNlbGxUZXh0U2VsZWN0ZWQ6IFwic3ZfcV9tX2NlbGxfc2VsZWN0ZWQgYmctcHJpbWFyeVwiLFxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiLFxuICAgIGl0ZW1WYWx1ZTogXCJmb3JtLWNvbnRyb2xcIlxuICB9LFxuICBtYXRyaXhkcm9wZG93bjogeyByb290OiBcInRhYmxlXCIsIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwXCIgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBidXR0b246IFwiYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgaXRlbVZhbHVlOiBcImZvcm0tZ3JvdXBcIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgYnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGJ1dHRvblByZXY6IFwiXCIsXG4gICAgYnV0dG9uTmV4dDogXCJcIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIG11bHRpcGxldGV4dDoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBpdGVtVGl0bGU6IFwiXCIsXG4gICAgcm93OiBcImZvcm0tZ3JvdXBcIixcbiAgICBpdGVtVmFsdWU6IFwic3ZfcV9tdF9pdGVtX3ZhbHVlIGZvcm0tY29udHJvbFwiXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcIlwiLFxuICAgIGl0ZW06IFwicmFkaW9cIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvbiBidG4gYnRuLXByaW1hcnlcIlxuICB9LFxuICBpbWFnZXBpY2tlcjoge1xuICAgIHJvb3Q6IFwic3ZfaW1nc2VsXCIsXG4gICAgaXRlbTogXCJzdl9xX2ltZ3NlbFwiLFxuICAgIGxhYmVsOiBcInN2X3FfaW1nc2VsX2xhYmVsXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9pbWdzZWxfY29udHJvbF9pdGVtXCIsXG4gICAgaW1hZ2U6IFwic3ZfcV9pbWdzZWxfaW1hZ2VcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX2ltZ3NlbF90ZXh0XCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCJcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcm9vdDogXCJidG4tZ3JvdXBcIixcbiAgICBpdGVtOiBcImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5XCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIlxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJmb3JtLWdyb3VwIGlzLWZpbGVpbnB1dCBzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcIlwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIixcbiAgICBmaWxlSW5wdXQ6IFwic3ZfcV9maWxlX2lucHV0XCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCJcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJhbGVydCBhbGVydC1pbmZvXCIsXG4gICAgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgc3VjY2VzczogXCJhbGVydCBhbGVydC1zdWNjZXNzXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwibW9kYWwtY29udGVudFwiLFxuICAgIGJvZHk6IFwibW9kYWwtYm9keVwiLFxuICAgIGhlYWRlcjoge1xuICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgcGFuZWwtdGl0bGVcIixcbiAgICAgIHRpdGxlOiBcInB1bGwtbGVmdFwiLFxuICAgICAgYnV0dG9uOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0XCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi11cFwiLFxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLWRvd25cIlxuICAgIH1cbiAgfVxufTtcbig8YW55PnN1cnZleUNzcylbXCJib290c3RyYXBtYXRlcmlhbFwiXSA9IGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsLnRzIiwiaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2FyYWJpY1wiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2NhdGFsYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9jemVjaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2RhbmlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2R1dGNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZmlubmlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2ZyZW5jaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dlb3JnaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZ2VybWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZ3JlZWtcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9oZWJyZXdcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9odW5nYXJpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9pY2VsYW5kaWNcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9pdGFsaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24va29yZWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbGF0dmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2xpdGh1YW5pYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9wZXJzaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcG9saXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcG9ydHVndWVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3JvbWFuaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcnVzc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3NwYW5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zd2VkaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdHVya2lzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3RyYWRpdGlvbmFsLWNoaW5lc2VcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9sb2NhbGl6YXRpb24udHMiLCIvLyBzdHlsZXNcbmltcG9ydCBcIi4uLy4uL21haW4uc2Nzc1wiO1xuXG5leHBvcnQgbGV0IFZlcnNpb246IHN0cmluZztcblZlcnNpb24gPSBgJHtwcm9jZXNzLmVudi5WRVJTSU9OfWA7XG5cbmV4cG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi4vLi4vaGVscGVyc1wiO1xuZXhwb3J0IHtcbiAgQW5zd2VyQ291bnRWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBOdW1lcmljVmFsaWRhdG9yLFxuICBSZWdleFZhbGlkYXRvcixcbiAgU3VydmV5VmFsaWRhdG9yLFxuICBUZXh0VmFsaWRhdG9yLFxuICBWYWxpZGF0b3JSZXN1bHQsXG4gIFZhbGlkYXRvclJ1bm5lclxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9yXCI7XG5leHBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vLi4vaXRlbXZhbHVlXCI7XG5leHBvcnQgeyBCYXNlLCBFdmVudCwgU3VydmV5RXJyb3IsIElTdXJ2ZXksIFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuZXhwb3J0IHtcbiAgQ3VzdG9tRXJyb3IsXG4gIEFuc3dlclJlcXVpcmVkRXJyb3IsXG4gIE9uZUFuc3dlclJlcXVpcmVkRXJyb3IsXG4gIFJlcXVyZU51bWVyaWNFcnJvcixcbiAgRXhjZWVkU2l6ZUVycm9yXG59IGZyb20gXCIuLi8uLi9lcnJvclwiO1xuZXhwb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4uLy4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5leHBvcnQgeyBDaG9pY2VzUmVzdGZ1bGwgfSBmcm9tIFwiLi4vLi4vY2hvaWNlc1Jlc3RmdWxsXCI7XG5leHBvcnQgeyBGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuZXhwb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBDb25kaXRpb25Ob2RlLFxuICBDb25kaXRpb25SdW5uZXIsXG4gIEV4cHJlc3Npb25SdW5uZXJcbn0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNcIjtcbmV4cG9ydCB7IENvbmRpdGlvbnNQYXJzZXIgfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1BhcnNlclwiO1xuZXhwb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuZXhwb3J0IHtcbiAgSnNvbkVycm9yLFxuICBKc29uSW5jb3JyZWN0VHlwZUVycm9yLFxuICBKc29uTWV0YWRhdGEsXG4gIEpzb25NZXRhZGF0YUNsYXNzLFxuICBKc29uTWlzc2luZ1R5cGVFcnJvcixcbiAgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlLFxuICBKc29uT2JqZWN0LFxuICBKc29uT2JqZWN0UHJvcGVydHksXG4gIEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IsXG4gIEpzb25Vbmtub3duUHJvcGVydHlFcnJvclxufSBmcm9tIFwiLi4vLi4vanNvbm9iamVjdFwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHJvcGRvd25DZWxsLFxuICBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcyxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2Vcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbCxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHluYW1pY1Jvd01vZGVsLFxuICBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHtcbiAgTWF0cml4Um93TW9kZWwsXG4gIE1hcnRyaXhDZWxscyxcbiAgUXVlc3Rpb25NYXRyaXhNb2RlbFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5leHBvcnQge1xuICBNdWx0aXBsZVRleHRJdGVtTW9kZWwsXG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuZXhwb3J0IHsgUGFuZWxNb2RlbCwgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi4vLi4vcGFuZWxcIjtcbmV4cG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuLi8uLi9wYWdlXCI7XG5leHBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi8uLi9xdWVzdGlvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbm5vbnZhbHVlXCI7XG5leHBvcnQgeyBRdWVzdGlvbkVtcHR5TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ2hlY2tib3hCYXNlLFxuICBRdWVzdGlvblNlbGVjdEJhc2Vcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY29tbWVudFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5leHBvcnQgeyBRdWVzdGlvbkZhY3RvcnksIEVsZW1lbnRGYWN0b3J5IH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GaWxlTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZmlsZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25IdG1sTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faHRtbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYXRpbmdNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9yYXRpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2V4cHJlc3Npb25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3RleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7IFN1cnZleVRpbWVyIH0gZnJvbSBcIi4uLy4uL3N1cnZleXRpbWVyXCI7XG5leHBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlcIjtcbmV4cG9ydCB7XG4gIFN1cnZleVRyaWdnZXIsXG4gIFN1cnZleVRyaWdnZXJDb21wbGV0ZSxcbiAgU3VydmV5VHJpZ2dlclNldFZhbHVlLFxuICBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSxcbiAgVHJpZ2dlclxufSBmcm9tIFwiLi4vLi4vdHJpZ2dlclwiO1xuZXhwb3J0IHsgU3VydmV5V2luZG93TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5V2luZG93XCI7XG5leHBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yIH0gZnJvbSBcIi4uLy4uL3RleHRQcmVQcm9jZXNzb3JcIjtcblxuZXhwb3J0IHsgZHhTdXJ2ZXlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2R4U3VydmV5U2VydmljZVwiO1xuZXhwb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vbG9jYWxpemF0aW9uL2VuZ2xpc2hcIjtcbmV4cG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiwgc3VydmV5U3RyaW5ncyB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlTdHJpbmdzXCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkN1c3RvbVdpZGdldCxcbiAgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvblxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5cbmV4cG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vc3R5bGVzbWFuYWdlclwiO1xuXG4vL1VuY29tbWVudCB0byBpbmNsdWRlIHRoZSBcImRhdGVcIiBxdWVzdGlvbiB0eXBlLlxuLy9leHBvcnQge2RlZmF1bHQgYXMgUXVlc3Rpb25EYXRlTW9kZWx9IGZyb20gXCIuLi8uLi9wbHVnaW5zL3F1ZXN0aW9uX2RhdGVcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5V2luZG93TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5V2luZG93XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFN1cnZleSB9IGZyb20gXCIuL2tvc3VydmV5XCI7XG52YXIga29UZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vdGVtcGxhdGVzL3dpbmRvdy93aW5kb3cuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVdpbmRvdyBleHRlbmRzIFN1cnZleVdpbmRvd01vZGVsIHtcbiAga29FeHBhbmRlZDogYW55O1xuICBrb0V4cGFuZGVkQ3NzOiBhbnk7XG4gIGRvRXhwYW5kOiBhbnk7XG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwsIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoanNvbk9iaiwgaW5pdGlhbE1vZGVsKTtcbiAgICB0aGlzLmtvRXhwYW5kZWQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLmtvRXhwYW5kZWRDc3MgPSBrby5vYnNlcnZhYmxlKHRoaXMuZ2V0QnV0dG9uQ3NzKCkpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvRXhwYW5kZWQoc2VsZi5pc0V4cGFuZGVkKTtcbiAgICAgIHNlbGYua29FeHBhbmRlZENzcyhzZWxmLmdldEJ1dHRvbkNzcygpKTtcbiAgICB9O1xuICAgIHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5kb1Nob3dpbmdDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLmRvRXhwYW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmNoYW5nZUV4cGFuZGVkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5KGpzb25PYmo6IGFueSk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleShqc29uT2JqKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCkge1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhbHVlID8gdGhpcy50ZW1wbGF0ZVZhbHVlIDogdGhpcy5nZXREZWZhdWx0VGVtcGxhdGUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IHRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9TaG93aW5nQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1Nob3dpbmcpIHtcbiAgICAgIHRoaXMud2luZG93RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAga28uY2xlYW5Ob2RlKHRoaXMud2luZG93RWxlbWVudCk7XG4gICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMsIHRoaXMud2luZG93RWxlbWVudCk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMud2luZG93RWxlbWVudCk7XG4gICAgICAoPFN1cnZleT50aGlzLnN1cnZleSkucmVuZGVyKFN1cnZleVdpbmRvdy5zdXJ2ZXlFbGVtZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIHRoaXMud2luZG93RWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtvVGVtcGxhdGU7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuc3VydmV5W1wiY3NzXCJdO1xuICB9XG4gIHByaXZhdGUgY2hhbmdlRXhwYW5kZWQoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZSghdGhpcy5pc0V4cGFuZGVkKTtcbiAgfVxuICBwcml2YXRlIGdldEJ1dHRvbkNzcygpIHtcbiAgICByZXR1cm4gdGhpcy5rb0V4cGFuZGVkKClcbiAgICAgID8gdGhpcy5jc3Mud2luZG93LmhlYWRlci5idXR0b25Db2xsYXBzZWRcbiAgICAgIDogdGhpcy5jc3Mud2luZG93LmhlYWRlci5idXR0b25FeHBhbmRlZDtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvU3VydmV5V2luZG93LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9ib29sZWFuXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Cb29sZWFuSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29JbmRldGVybWluYXRlOiBhbnk7XG4gIGtvQ2hlY2tlZFZhbHVlOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5rb0luZGV0ZXJtaW5hdGUgPSBrby5vYnNlcnZhYmxlKFxuICAgICAgKDxRdWVzdGlvbkJvb2xlYW4+dGhpcy5xdWVzdGlvbikuaXNJbmRldGVybWluYXRlXG4gICAgKTtcbiAgICB0aGlzLmtvQ2hlY2tlZFZhbHVlID0ga28ub2JzZXJ2YWJsZShcbiAgICAgICg8UXVlc3Rpb25Cb29sZWFuPnRoaXMucXVlc3Rpb24pLmNoZWNrZWRWYWx1ZVxuICAgICk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29DaGVja2VkVmFsdWUuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgIHNlbGYudXBkYXRlQ2hlY2tlZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSW5kZXRlcm1pbmF0ZVwiXSA9IHRoaXMua29JbmRldGVybWluYXRlO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29DaGVja2VkVmFsdWVcIl0gPSB0aGlzLmtvQ2hlY2tlZFZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDaGVja2VkVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgICg8UXVlc3Rpb25Cb29sZWFuPnRoaXMucXVlc3Rpb24pLmNoZWNrZWRWYWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkJvb2xlYW4gZXh0ZW5kcyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25Cb29sZWFuSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1Dc3Mocm93OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgbGV0IGlzQ2hlY2tlZCA9ICg8YW55PnRoaXMpW1wia29DaGVja2VkVmFsdWVcIl0oKTtcbiAgICBsZXQgaXRlbUNsYXNzID0gKDxhbnk+dGhpcylbXCJrb0Nzc1wiXSgpLml0ZW0gKyAoaXNDaGVja2VkID8gXCIgY2hlY2tlZFwiIDogXCJcIik7XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcImJvb2xlYW5cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW4obmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2NoZWNrYm94XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5cbmNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3Ige1xuICBwcml2YXRlIF9rb1ZhbHVlID0ga28ub2JzZXJ2YWJsZUFycmF5PGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5fa29WYWx1ZS5zdWJzY3JpYmUobmV3VmFsdWUgPT4ge1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnF1ZXN0aW9uLCBcImtvVmFsdWVcIiwge1xuICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMuX2tvVmFsdWUoKSwgdGhpcy5xdWVzdGlvbi52YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9rb1ZhbHVlKHRoaXMucXVlc3Rpb24udmFsdWUgfHwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9rb1ZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldDogKG5ld1ZhbHVlOiBBcnJheTxhbnk+IHwgS25vY2tvdXRPYnNlcnZhYmxlQXJyYXk8YW55PikgPT4ge1xuICAgICAgICB2YXIgbmV3VmFsID0gW10uY29uY2F0KGtvLnVud3JhcChuZXdWYWx1ZSkpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gbmV3VmFsO1xuICAgICAgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB7XG4gIGtvQWxsU2VsZWN0ZWQ6IGFueTtcbiAgcHJpdmF0ZSBpc0FsbFNlbGVjdGVkVXBkYXRpbmcgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkNoZWNrYm94SW1wbGVtZW50b3IodGhpcyk7XG4gICAgdGhpcy5rb0FsbFNlbGVjdGVkID0ga28ub2JzZXJ2YWJsZSh0aGlzLmlzQWxsU2VsZWN0ZWQpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgIGlmIChzZWxmLmlzQWxsU2VsZWN0ZWRVcGRhdGluZykgcmV0dXJuO1xuICAgICAgaWYgKG5ld1ZhbHVlKSBzZWxmLnNlbGVjdEFsbCgpO1xuICAgICAgZWxzZSBzZWxmLmNsZWFyVmFsdWUoKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUFsbFNlbGVjdGVkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgdGhpcy51cGRhdGVBbGxTZWxlY3RlZCgpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVBbGxTZWxlY3RlZCgpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWRVcGRhdGluZyA9IHRydWU7XG4gICAgdGhpcy5rb0FsbFNlbGVjdGVkKHRoaXMuaXNBbGxTZWxlY3RlZCk7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkVXBkYXRpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRJdGVtQ2xhc3MoaXRlbTogYW55KSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7IC8vdHJpZ2dlciBkZXBlbmRlbmNpZXMgZnJvbSBrb1ZhbHVlIGZvciBrbm9ja291dFxuICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pO1xuICAgIHZhciBpdGVtQ2xhc3MgPVxuICAgICAgdGhpcy5jc3NDbGFzc2VzLml0ZW0gK1xuICAgICAgKHRoaXMuY29sQ291bnQgPT09IDBcbiAgICAgICAgPyBcIiBzdl9xX2NoZWNrYm94X2lubGluZVwiXG4gICAgICAgIDogXCIgc3YtcS1jb2wtXCIgKyB0aGlzLmNvbENvdW50KTtcblxuICAgIGlmIChpc0NoZWNrZWQpIGl0ZW1DbGFzcyArPSBcIiBjaGVja2VkXCI7XG5cbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwiY2hlY2tib3hcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25DaGVja2JveChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjaGVja2JveFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25DaGVja2JveChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY2hlY2tib3gudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fY29tbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tbWVudCBleHRlbmRzIFF1ZXN0aW9uQ29tbWVudE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwiY29tbWVudFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnQoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnQobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Ecm9wZG93biBleHRlbmRzIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25TZWxlY3RCYXNlSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJkcm9wZG93blwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkRyb3Bkb3duKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImRyb3Bkb3duXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkRyb3Bkb3duKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9kcm9wZG93bi50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25FbXB0eU1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2VtcHR5XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FbXB0eSBleHRlbmRzIFF1ZXN0aW9uRW1wdHlNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcImVtcHR5XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRW1wdHkoXCJcIik7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2VtcHR5LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FeHByZXNzaW9uSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29EaXNwbGF5VmFsdWU6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvRGlzcGxheVZhbHVlID0ga28ub2JzZXJ2YWJsZSh0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSk7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0Rpc3BsYXlWYWx1ZVwiXSA9IHRoaXMua29EaXNwbGF5VmFsdWU7XG4gICAga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5rb0Rpc3BsYXlWYWx1ZSh0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkV4cHJlc3Npb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcImV4cHJlc3Npb25cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmlsZU1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2ZpbGVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29TdGF0ZSA9IGtvLm9ic2VydmFibGU8c3RyaW5nPihcImVtcHR5XCIpO1xuICBrb0hhc1ZhbHVlID0ga28uY29tcHV0ZWQoKCkgPT4gdGhpcy5rb1N0YXRlKCkgPT09IFwibG9hZGVkXCIpO1xuICBrb0RhdGEgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHRoaXMua29IYXNWYWx1ZSgpKSB7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvbkZpbGVNb2RlbD50aGlzLnF1ZXN0aW9uKS5wcmV2aWV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSk7XG4gIGtvSW5wdXRUaXRsZSA9IGtvLm9ic2VydmFibGU8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0RhdGFcIl0gPSB0aGlzLmtvRGF0YTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSGFzVmFsdWVcIl0gPSB0aGlzLmtvSGFzVmFsdWU7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lucHV0VGl0bGVcIl0gPSB0aGlzLmtvSW5wdXRUaXRsZTtcbiAgICB2YXIgdXBkYXRlU3RhdGUgPSAoc3RhdGU6IGFueSkgPT4ge1xuICAgICAgdGhpcy5rb1N0YXRlKHN0YXRlKTtcbiAgICAgIHRoaXMua29JbnB1dFRpdGxlKCg8UXVlc3Rpb25GaWxlTW9kZWw+dGhpcy5xdWVzdGlvbikuaW5wdXRUaXRsZSk7XG4gICAgfTtcbiAgICAoPFF1ZXN0aW9uRmlsZU1vZGVsPnRoaXMucXVlc3Rpb24pLm9uU3RhdGVDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICB1cGRhdGVTdGF0ZShvcHRpb25zLnN0YXRlKTtcbiAgICB9KTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImRvY2hhbmdlXCJdID0gKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdmFyIHNyYyA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50O1xuICAgICAgc2VsZi5vbkNoYW5nZShzcmMpO1xuICAgIH07XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJkb2NsZWFuXCJdID0gKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdmFyIHNyYyA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50O1xuICAgICAgdmFyIGlucHV0ID0gc3JjLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0XCIpWzBdO1xuICAgICAgKDxRdWVzdGlvbkZpbGVNb2RlbD50aGlzLnF1ZXN0aW9uKS5jbGVhcigpO1xuICAgICAgaW5wdXQudmFsdWUgPSBcIlwiO1xuICAgIH07XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJkb3JlbW92ZWZpbGVcIl0gPSAoZGF0YTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICAoPFF1ZXN0aW9uRmlsZU1vZGVsPnRoaXMucXVlc3Rpb24pLnJlbW92ZUZpbGUoZGF0YSk7XG4gICAgfTtcbiAgfVxuICBwcml2YXRlIG9uQ2hhbmdlKHNyYzogYW55KSB7XG4gICAgaWYgKCEoPGFueT53aW5kb3cpW1wiRmlsZVJlYWRlclwiXSkgcmV0dXJuO1xuICAgIGlmICghc3JjIHx8ICFzcmMuZmlsZXMgfHwgc3JjLmZpbGVzLmxlbmd0aCA8IDEpIHJldHVybjtcbiAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgZmlsZXMucHVzaChzcmMuZmlsZXNbaV0pO1xuICAgIH1cbiAgICBzcmMudmFsdWUgPSBcIlwiO1xuICAgICg8UXVlc3Rpb25GaWxlTW9kZWw+dGhpcy5xdWVzdGlvbikubG9hZEZpbGVzKGZpbGVzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlIGV4dGVuZHMgUXVlc3Rpb25GaWxlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uRmlsZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwiZmlsZVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGUoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZmlsZVwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGUobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ZpbGUudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2h0bWxcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSHRtbCBleHRlbmRzIFF1ZXN0aW9uSHRtbE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwiaHRtbFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWwoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2h0bWwudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlUGlja2VyIGV4dGVuZHMgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBuZXcgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBnZXRJdGVtQ2xhc3MoaXRlbTogYW55KSB7XG4gICAgdmFyIGl0ZW1DbGFzcyA9XG4gICAgICB0aGlzLmNzc0NsYXNzZXMuaXRlbSArXG4gICAgICAodGhpcy5jb2xDb3VudCA9PT0gMFxuICAgICAgICA/IFwiIHN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCJcbiAgICAgICAgOiBcIiBzdi1xLWNvbC1cIiArIHRoaXMuY29sQ291bnQpO1xuICAgIGlmICh0aGlzLm11bHRpU2VsZWN0KSB7XG4gICAgICBpZiAoISF0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUuaW5kZXhPZihpdGVtLnZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgaXRlbUNsYXNzICs9IFwiIGNoZWNrZWRcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlID09PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGl0ZW1DbGFzcyArPSBcIiBjaGVja2VkXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJpbWFnZXBpY2tlclwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkltYWdlUGlja2VyKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaW1hZ2VwaWNrZXJcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uSW1hZ2VQaWNrZXIobmFtZSk7XG4gIC8vcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25faW1hZ2VwaWNrZXIudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4TW9kZWwsXG4gIE1hdHJpeFJvd01vZGVsLFxuICBJTWF0cml4RGF0YVxufSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeFJvdyBleHRlbmRzIE1hdHJpeFJvd01vZGVsIHtcbiAgcHJpdmF0ZSBpc1ZhbHVlVXBkYXRpbmcgPSBmYWxzZTtcbiAga29WYWx1ZTogYW55O1xuICBrb0NlbGxDbGljazogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogSU1hdHJpeERhdGEsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICBzdXBlcihpdGVtLCBmdWxsTmFtZSwgZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMua29WYWx1ZSA9IGtvLm9ic2VydmFibGUodGhpcy52YWx1ZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29WYWx1ZS5zdWJzY3JpYmUoZnVuY3Rpb24obmV3VmFsdWU6YW55KSB7XG4gICAgICBpZiAoc2VsZi5pc1ZhbHVlVXBkYXRpbmcpIHRydWU7XG4gICAgICBzZWxmLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5rb0NlbGxDbGljayA9IGZ1bmN0aW9uKGNvbHVtbjphbnkpIHtcbiAgICAgIHNlbGYua29WYWx1ZShjb2x1bW4udmFsdWUpO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHRoaXMuaXNWYWx1ZVVwZGF0aW5nID0gdHJ1ZTtcbiAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLmtvVmFsdWUoKSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMua29WYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1ZhbHVlVXBkYXRpbmcgPSBmYWxzZTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4IGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gIGtvVmlzaWJsZVJvd3M6IGFueTtcbiAga29WaXNpYmxlQ29sdW1uczogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gICAgdGhpcy5rb1Zpc2libGVSb3dzID0ga28ub2JzZXJ2YWJsZSh0aGlzLnZpc2libGVSb3dzKTtcbiAgICB0aGlzLmtvVmlzaWJsZUNvbHVtbnMgPSBrby5vYnNlcnZhYmxlKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuICB9XG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uUm93c0NoYW5nZWQoKTtcbiAgICB0aGlzLmtvVmlzaWJsZVJvd3ModGhpcy52aXNpYmxlUm93cyk7XG4gICAgdGhpcy5rb1Zpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgZnVsbE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeFJvdyhpdGVtLCBmdWxsTmFtZSwgdGhpcywgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQ3NzKHJvdzphbnksIGNvbHVtbjphbnkpIHtcbiAgICB2YXIgaXNDaGVja2VkID0gcm93LmtvVmFsdWUoKSA9PSBjb2x1bW4udmFsdWU7XG4gICAgdmFyIGNlbGxTZWxlY3RlZENsYXNzID0gdGhpcy5oYXNDZWxsVGV4dFxuICAgICAgPyB0aGlzLmNzc0NsYXNzZXMuY2VsbFRleHRTZWxlY3RlZFxuICAgICAgOiBcImNoZWNrZWRcIjtcbiAgICB2YXIgY2VsbENsYXNzID0gdGhpcy5oYXNDZWxsVGV4dFxuICAgICAgPyAoPGFueT50aGlzKVtcImtvQ3NzXCJdKCkuY2VsbFRleHRcbiAgICAgIDogKDxhbnk+dGhpcylbXCJrb0Nzc1wiXSgpLmxhYmVsO1xuICAgIGxldCBpdGVtQ2xhc3MgPSBjZWxsQ2xhc3MgKyAoaXNDaGVja2VkID8gXCIgXCIgKyBjZWxsU2VsZWN0ZWRDbGFzcyA6IFwiXCIpO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJtYXRyaXhcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXgoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeChuYW1lKTtcbiAgcS5yb3dzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRSb3dzO1xuICBxLmNvbHVtbnMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENvbHVtcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX21hdHJpeC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IE1hdHJpeER5bmFtaWNSb3dNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeER5bmFtaWNJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCBoYXNSb3dUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNBZGRSb3dUb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICg8UXVlc3Rpb25NYXRyaXhEeW5hbWljPnRoaXMucXVlc3Rpb24pLmlzQWRkUm93T25Ub3A7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQWRkUm93Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5pc0FkZFJvd09uQm90dG9tO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SZW1vdmVSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgJiZcbiAgICAgICg8UXVlc3Rpb25NYXRyaXhEeW5hbWljPnRoaXMucXVlc3Rpb24pLmNhblJlbW92ZVJvd1xuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVXBkYXRlQ2VsbHMoKSB7XG4gICAgLy9HZW5lcmVhdGUgcm93cyBhZ2Fpbi5cbiAgICB2YXIgcm93cyA9ICg8UXVlc3Rpb25NYXRyaXhEeW5hbWljPnRoaXMucXVlc3Rpb24pW1wiZ2VuZXJhdGVkVmlzaWJsZVJvd3NcIl07XG4gICAgdmFyIGNvbHVtbnMgPSAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jb2x1bW5zO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoID4gMCAmJiBjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMub25Db2x1bW5DaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFJvdygpIHtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5hZGRSb3coKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVtb3ZlUm93KHJvdzogTWF0cml4RHluYW1pY1Jvd01vZGVsKSB7XG4gICAgdmFyIHJvd3MgPSAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS52aXNpYmxlUm93cztcbiAgICB2YXIgaW5kZXggPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikucmVtb3ZlUm93VUkoaW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwge1xuICBrb0NlbGxBZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibWF0cml4ZHluYW1pY1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWMoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkeW5hbWljXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWMobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgcS5yb3dDb3VudCA9IDI7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLFxuICBNdWx0aXBsZVRleHRJdGVtTW9kZWxcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuL2tvcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0SXRlbSBleHRlbmRzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBhbnkgPSBudWxsLCB0aXRsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKG5hbWUsIHRpdGxlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb1Jvd3M6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29Sb3dzID0ga28ub2JzZXJ2YWJsZUFycmF5KFxuICAgICAgKDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnRoaXMucXVlc3Rpb24pLmdldFJvd3MoKVxuICAgICk7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1Jvd3NcIl0gPSB0aGlzLmtvUm93cztcbiAgICB0aGlzLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD50aGlzXG4gICAgICAucXVlc3Rpb24pLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2xDb3VudENoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Jvd3MoKDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnRoaXMucXVlc3Rpb24pLmdldFJvd3MoKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0IGV4dGVuZHMgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW0obmFtZSwgdGl0bGUpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibXVsdGlwbGV0ZXh0aXRlbVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtKFwiXCIpO1xufSk7XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibXVsdGlwbGV0ZXh0XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0KFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibXVsdGlwbGV0ZXh0XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dChuYW1lKTtcbiAgcS5hZGRJdGVtKFwidGV4dDFcIik7XG4gIHEuYWRkSXRlbShcInRleHQyXCIpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsXG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxufSBmcm9tIFwiLi4vcXVlc3Rpb25fcGFuZWxkeW5hbWljXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuLi9wYW5lbFwiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi9rb3BhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29QYW5lbHM6IGFueTtcbiAga29SZWNhbGM6IGFueTtcbiAga29BZGRQYW5lbENsaWNrOiBhbnk7XG4gIGtvUmVtb3ZlUGFuZWxDbGljazogYW55O1xuICBrb1ByZXZQYW5lbENsaWNrOiBhbnk7XG4gIGtvTmV4dFBhbmVsQ2xpY2s6IGFueTtcbiAga29DYW5BZGRQYW5lbDogYW55O1xuICBrb0NhblJlbW92ZVBhbmVsOiBhbnk7XG4gIGtvUGFuZWw6IGFueTtcbiAga29Jc0xpc3Q6IGFueTtcbiAga29Jc1Byb2dyZXNzVG9wOiBhbnk7XG4gIGtvSXNQcm9ncmVzc0JvdHRvbTogYW55O1xuICBrb0lzTmV4dEJ1dHRvbjogYW55O1xuICBrb0lzUHJldkJ1dHRvbjogYW55O1xuICBrb0lzUmFuZ2U6IGFueTtcbiAga29SYW5nZVZhbHVlOiBhbnk7XG4gIGtvUmFuZ2VNYXg6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29SZWNhbGMgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29QYW5lbHMgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5wYW5lbHM7XG4gICAgfSwgdGhpcyk7XG5cbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUGFuZWxzXCJdID0gdGhpcy5rb1BhbmVscztcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0FkZFBhbmVsQ2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuYWRkUGFuZWwoKTtcbiAgICB9O1xuICAgIHRoaXMua29SZW1vdmVQYW5lbENsaWNrID0gZnVuY3Rpb24oZGF0YTogYW55KSB7XG4gICAgICBzZWxmLnJlbW92ZVBhbmVsKGRhdGEpO1xuICAgIH07XG4gICAgdGhpcy5rb1ByZXZQYW5lbENsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleC0tO1xuICAgIH07XG4gICAgdGhpcy5rb05leHRQYW5lbENsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleCsrO1xuICAgIH07XG5cbiAgICB0aGlzLmtvQ2FuQWRkUGFuZWwgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5jYW5BZGRQYW5lbDtcbiAgICB9KTtcbiAgICB0aGlzLmtvQ2FuUmVtb3ZlUGFuZWwgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5jYW5SZW1vdmVQYW5lbDtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNQcmV2QnV0dG9uID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNQcmV2QnV0dG9uU2hvd2luZztcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNOZXh0QnV0dG9uID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNOZXh0QnV0dG9uU2hvd2luZztcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNSYW5nZSA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmlzUmFuZ2VTaG93aW5nO1xuICAgIH0pO1xuICAgIHRoaXMua29QYW5lbCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRQYW5lbDtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNMaXN0ID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNSZW5kZXJNb2RlTGlzdDtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNQcm9ncmVzc1RvcCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmlzUHJvZ3Jlc3NUb3BTaG93aW5nO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc1Byb2dyZXNzQm90dG9tID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNQcm9ncmVzc0JvdHRvbVNob3dpbmc7XG4gICAgfSk7XG5cbiAgICB0aGlzLmtvUmFuZ2VWYWx1ZSA9IGtvLm9ic2VydmFibGUoXG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleFxuICAgICk7XG4gICAgdGhpcy5rb1JhbmdlVmFsdWUuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuY3VycmVudEluZGV4ID0gbmV3VmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5rb1JhbmdlTWF4ID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikucGFuZWxDb3VudCAtIDE7XG4gICAgfSk7XG5cbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQWRkUGFuZWxDbGlja1wiXSA9IHRoaXMua29BZGRQYW5lbENsaWNrO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29SZW1vdmVQYW5lbENsaWNrXCJdID0gdGhpcy5rb1JlbW92ZVBhbmVsQ2xpY2s7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1ByZXZQYW5lbENsaWNrXCJdID0gdGhpcy5rb1ByZXZQYW5lbENsaWNrO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29OZXh0UGFuZWxDbGlja1wiXSA9IHRoaXMua29OZXh0UGFuZWxDbGljaztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ2FuQWRkUGFuZWxcIl0gPSB0aGlzLmtvQ2FuQWRkUGFuZWw7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0NhblJlbW92ZVBhbmVsXCJdID0gdGhpcy5rb0NhblJlbW92ZVBhbmVsO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29QYW5lbFwiXSA9IHRoaXMua29QYW5lbDtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSXNMaXN0XCJdID0gdGhpcy5rb0lzTGlzdDtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSXNQcm9ncmVzc1RvcFwiXSA9IHRoaXMua29Jc1Byb2dyZXNzVG9wO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Jc1Byb2dyZXNzQm90dG9tXCJdID0gdGhpcy5rb0lzUHJvZ3Jlc3NCb3R0b207XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lzUHJldkJ1dHRvblwiXSA9IHRoaXMua29Jc1ByZXZCdXR0b247XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lzTmV4dEJ1dHRvblwiXSA9IHRoaXMua29Jc05leHRCdXR0b247XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lzUmFuZ2VcIl0gPSB0aGlzLmtvSXNSYW5nZTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUmFuZ2VWYWx1ZVwiXSA9IHRoaXMua29SYW5nZVZhbHVlO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29SYW5nZU1heFwiXSA9IHRoaXMua29SYW5nZU1heDtcblxuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29QYW5lbEFmdGVyUmVuZGVyXCJdID0gZnVuY3Rpb24oZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICAgIHNlbGYucGFuZWxBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpc1xuICAgICAgLnF1ZXN0aW9uKS5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uUGFuZWxDb3VudENoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpc1xuICAgICAgLnF1ZXN0aW9uKS5yZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uUmVuZGVyTW9kZUNoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpc1xuICAgICAgLnF1ZXN0aW9uKS5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25DdXJyZW50SW5kZXhDaGFuZ2VkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25QYW5lbENvdW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uQ3VycmVudEluZGV4Q2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblJlbmRlck1vZGVDaGFuZ2VkKCkge1xuICAgIHRoaXMub25DdXJyZW50SW5kZXhDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3VycmVudEluZGV4Q2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvUmVjYWxjKHRoaXMua29SZWNhbGMoKSArIDEpO1xuICAgIHRoaXMua29SYW5nZVZhbHVlKCg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpcy5xdWVzdGlvbikuY3VycmVudEluZGV4KTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkUGFuZWwoKSB7XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5hZGRQYW5lbFVJKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbW92ZVBhbmVsKHZhbDogYW55KSB7XG4gICAgdmFyIHEgPSA8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpcy5xdWVzdGlvbjtcbiAgICBpZiAoIXEuaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgdmFsID0gcS5jdXJyZW50UGFuZWw7XG4gICAgfVxuICAgIHEucmVtb3ZlUGFuZWxVSSh2YWwpO1xuICB9XG4gIHByaXZhdGUgcGFuZWxBZnRlclJlbmRlcihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5xdWVzdGlvbi5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgIHRoaXMucXVlc3Rpb24uc3VydmV5LmFmdGVyUmVuZGVyUGFuZWwoY29uLCBlbCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljIGV4dGVuZHMgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbCgpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwicGFuZWxkeW5hbWljXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicGFuZWxkeW5hbWljXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9wYW5lbGR5bmFtaWMudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYWRpb2dyb3VwIGV4dGVuZHMgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgZ2V0SXRlbUNsYXNzKGl0ZW06IGFueSkge1xuICAgIHZhciBpdGVtQ2xhc3MgPVxuICAgICAgdGhpcy5jc3NDbGFzc2VzLml0ZW0gK1xuICAgICAgKHRoaXMuY29sQ291bnQgPT09IDBcbiAgICAgICAgPyBcIiBzdl9xX3JhZGlvZ3JvdXBfaW5saW5lXCJcbiAgICAgICAgOiBcIiBzdi1xLWNvbC1cIiArIHRoaXMuY29sQ291bnQpO1xuICAgIGlmIChpdGVtLnZhbHVlID09PSB0aGlzLnZhbHVlKSBpdGVtQ2xhc3MgKz0gXCIgY2hlY2tlZFwiO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJyYWRpb2dyb3VwXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmNsYXNzIFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29WaXNpYmxlUmF0ZVZhbHVlczogYW55O1xuICBrb0NoYW5nZTogYW55O1xuICBrb0NzczogYW55O1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5rb1Zpc2libGVSYXRlVmFsdWVzID0ga28ub2JzZXJ2YWJsZUFycmF5KHRoaXMuZ2V0VmFsdWVzKCkpO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29WaXNpYmxlUmF0ZVZhbHVlc1wiXSA9IHRoaXMua29WaXNpYmxlUmF0ZVZhbHVlcztcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0NoYW5nZSA9IGZ1bmN0aW9uKHZhbDogYW55KSB7XG4gICAgICBzZWxmLnF1ZXN0aW9uLnZhbHVlID0gdmFsLml0ZW1WYWx1ZTtcbiAgICB9O1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29DaGFuZ2VcIl0gPSB0aGlzLmtvQ2hhbmdlO1xuICAgICg8UXVlc3Rpb25SYXRpbmc+dGhpcy5xdWVzdGlvbikucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblJhdGVWYWx1ZXNDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvR2V0Q3NzXCJdID0gKHZhbDogYW55KSA9PiB7XG4gICAgICB2YXIgY3NzID0gc2VsZi5xdWVzdGlvbi5jc3NDbGFzc2VzLml0ZW07XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxmLnF1ZXN0aW9uLmNzc0NsYXNzZXMuc2VsZWN0ZWQ7XG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52YWx1ZSA9PT0gdmFsLnZhbHVlID8gY3NzICsgXCIgXCIgKyBzZWxlY3RlZCA6IGNzcztcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvblJhdGVWYWx1ZXNDaGFuZ2VkKCkge1xuICAgIHRoaXMua29WaXNpYmxlUmF0ZVZhbHVlcyh0aGlzLmdldFZhbHVlcygpKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS52aXNpYmxlUmF0ZVZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmcgZXh0ZW5kcyBRdWVzdGlvblJhdGluZ01vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvblJhdGluZ0ltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwicmF0aW5nXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9yYXRpbmcudHMiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktY29tbWVudFxcXCI+XFxuICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBkYXRhLWJpbmQ9XFxcInZhbHVlOiAkZGF0YS5xdWVzdGlvbi5rb0NvbW1lbnQsIHZpc2libGU6ICRkYXRhLnZpc2libGUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5vdGhlciwgYXR0cjogeyBtYXhMZW5ndGg6IHF1ZXN0aW9uLmdldE90aGVyc01heExlbmd0aCgpLCAnYXJpYS1sYWJlbCc6ICEhcXVlc3Rpb24ubG9jVGl0bGUgJiYgcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sIH1cXFwiXFxuICAgIC8+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEucXVlc3Rpb24ua29Db21tZW50LCB2aXNpYmxlOiAkZGF0YS52aXNpYmxlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkub3RoZXJcXFwiPjwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvY29tbWVudC5odG1sXG4vLyBtb2R1bGUgaWQgPSA3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbnRlbnQnLCBhZnRlclJlbmRlcjoga29FdmVudEFmdGVyUmVuZGVyIH0gLS0+XFxuPCEtLSAva28gLS0+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktY29udGVudFxcXCI+XFxuXFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5yb290LCBhZnRlclJlbmRlcjoga29FdmVudEFmdGVyUmVuZGVyXFxcIj5cXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2X2N1c3RvbV9oZWFkZXJcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2X2NvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5oZWFkZXIsIHZpc2libGU6ICh0aXRsZS5sZW5ndGggPiAwKSAmJiBzaG93VGl0bGUgJiYga29TdGF0ZSgpID09ICdydW5uaW5nJ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aDM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8L2gzPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJzdGFydGluZ1xcXCIgLS0+XFxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGlkOiBzdGFydGVkUGFnZS5pZCB9LCB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhZ2UnLCBkYXRhOiBzdGFydGVkUGFnZSwgYWZ0ZXJSZW5kZXI6IGtvQWZ0ZXJSZW5kZXJQYWdlIH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvSXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcsIGNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogc3RhcnRTdXJ2ZXlUZXh0LCBjbGljazogc3RhcnQsIGNzczogY3NzTmF2aWdhdGlvblN0YXJ0XFxcIiAvPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJydW5uaW5nXFxcIiAtLT5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNUaW1lclBhbmVsU2hvd2luZ09uVG9wIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXRpbWVycGFuZWwnfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCwgdGVtcGxhdGU6ICdzdXJ2ZXktcHJvZ3Jlc3MnXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGlkOiBrb0N1cnJlbnRQYWdlKCkuaWQgfSwgdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1wYWdlJywgZGF0YToga29DdXJyZW50UGFnZSwgYWZ0ZXJSZW5kZXI6IGtvQWZ0ZXJSZW5kZXJQYWdlIH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cXFwibWFyZ2luLXRvcDoxZW1cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSwgdGVtcGxhdGU6ICdzdXJ2ZXktcHJvZ3Jlc3MnXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzVGltZXJQYW5lbFNob3dpbmdPbkJvdHRvbSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS10aW1lcnBhbmVsJ30gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvSXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcsIGNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogcGFnZVByZXZUZXh0LCBjbGljazogcHJldlBhZ2UsIHZpc2libGU6ICFrb0lzRmlyc3RQYWdlKCkgJiYgaXNTaG93UHJldkJ1dHRvbiwgY3NzOiBjc3NOYXZpZ2F0aW9uUHJldlxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IHBhZ2VOZXh0VGV4dCwgY2xpY2s6IG5leHRQYWdlVUlDbGljaywgZXZlbnQ6IHsgbW91c2Vkb3duOiBuZXh0UGFnZU1vdXNlRG93biB9LCB2aXNpYmxlOiAha29Jc0xhc3RQYWdlKCksIGNzczogY3NzTmF2aWdhdGlvbk5leHRcXFwiIC8+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogY29tcGxldGVUZXh0LCBjbGljazogY29tcGxldGVMYXN0UGFnZSwgdmlzaWJsZToga29Jc0xhc3RQYWdlKCkgJiYgaXNFZGl0TW9kZSwgY3NzOiBjc3NOYXZpZ2F0aW9uQ29tcGxldGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiY29tcGxldGVkXFxcIiAmJiBzaG93Q29tcGxldGVkUGFnZSAtLT5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImh0bWw6IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwsIGNzczogY29tcGxldGVkQ3NzXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQ29tcGxldGVkU3RhdGUoKSAhPSAnJywgY3NzOiBjc3Muc2F2ZURhdGEucm9vdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBrb0NvbXBsZXRlZFN0YXRlQ3NzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6a29Db21wbGV0ZWRTdGF0ZVRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQ29tcGxldGVkU3RhdGUoKSA9PSAnZXJyb3InLCB2YWx1ZTogZ2V0TG9jU3RyaW5nKCdzYXZlQWdhaW5CdXR0b24nKSwgY2xpY2s6IGRvQ29tcGxldGUsIGNzczogY3NzLnNhdmVEYXRhLnNhdmVBZ2FpbkJ1dHRvblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJjb21wbGV0ZWRiZWZvcmVcXFwiIC0tPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb1N0YXRlKCkgPT0gXFxcImxvYWRpbmdcXFwiIC0tPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkTG9hZGluZ0h0bWwsIGNzczogY3NzLmJvZHlcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJlbXB0eVxcXCIgLS0+XFxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OmVtcHR5U3VydmV5VGV4dCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9mb3JtPlxcbiAgICA8L2Rpdj5cXG5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvaW5kZXguaHRtbFxuLy8gbW9kdWxlIGlkID0gNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LW1hdHJpeGNlbGxcXFwiPlxcbiAgICA8dGQgZGF0YS1iaW5kPVxcXCJjc3M6ICRjb250ZXh0LnF1ZXN0aW9uLmtvQ3NzKCkuaXRlbVZhbHVlLCBhdHRyOiB7IGhlYWRlcnM6IGNlbGwucXVlc3Rpb24uaXNWaXNpYmxlID8gY2VsbC5jb2x1bW4ubG9jVGl0bGUucmVuZGVyZWRIdG1sIDogJycgfVxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogY2VsbC5xdWVzdGlvbi5pc1Zpc2libGVcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBjZWxsLnF1ZXN0aW9uIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5rb1RlbXBsYXRlTmFtZSgpLCBkYXRhOiBjZWxsLnF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvdGQ+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL21hdHJpeGNlbGwuaHRtbFxuLy8gbW9kdWxlIGlkID0gODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXBhZ2VcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBkYXRhLmNzcy5wYWdlLnJvb3RcXFwiPlxcbiAgICAgICAgPGg0IGRhdGEtYmluZD1cXFwidmlzaWJsZTogKHByb2Nlc3NlZFRpdGxlLmxlbmd0aCA+IDApICYmIGRhdGEuc2hvd1BhZ2VUaXRsZXMsIGNzczogZGF0YS5jc3MucGFnZVRpdGxlXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvaDQ+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBkYXRhLmNzcy5wYWdlRGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEZXNjcmlwdGlvbiB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcm93cycsIGRhdGE6ICRkYXRhfSAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFnZS5odG1sXG4vLyBtb2R1bGUgaWQgPSA4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcGFuZWxcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwic3R5bGU6eyB3aWR0aDogcmVuZGVyV2lkdGggfSwgYXR0cjoge2lkOiBpZH0sIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC5jb250YWluZXJcXFwiPlxcbiAgICAgICAgPGg0IGRhdGEtYmluZD1cXFwidmlzaWJsZTogKHByb2Nlc3NlZFRpdGxlLmxlbmd0aCA+IDApLCBjc3M6ICRkYXRhLmdldFRpdGxlU3R5bGUoKSwgY2xpY2s6IGRvRXhwYW5kXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwic3ZfcGFuZWxfaWNvblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb0lzQ29sbGFwc2VkKCkgfHwga29Jc0V4cGFuZGVkKCksIGNzczoge3N2X2V4cGFuZGVkOiAha29Jc0NvbGxhcHNlZCgpfVxcXCI+PC9zcGFuPlxcbiAgICAgICAgPC9oND5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzc0NsYXNzZXMucGFuZWwuZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEZXNjcmlwdGlvbiB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogJGRhdGEgfSAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFrb0lzQ29sbGFwc2VkKCksIHN0eWxlOiB7IHBhZGRpbmdMZWZ0OiBpbm5lclBhZGRpbmdMZWZ0fVxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXJvd3MnLCBkYXRhOiAkZGF0YX0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3BhbmVsLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1wcm9ncmVzc1xcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5wcm9ncmVzc1xcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MucHJvZ3Jlc3NCYXIsIHN0eWxlOnt3aWR0aDoga29Qcm9ncmVzcygpICsgJyUnfVxcXCJcXG4gICAgICAgICAgICByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCIgYXJpYS12YWx1ZW1pbj1cXFwiMFxcXCIgYXJpYS12YWx1ZW1heD1cXFwiMTAwXFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6a29Qcm9ncmVzc1RleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcHJvZ3Jlc3MuaHRtbFxuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWJvb2xlYW5cXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ3NzKClcXFwiPlxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgY2hlY2tlZDogcXVlc3Rpb24ua29DaGVja2VkVmFsdWUsIHN1cnZleVByb3A6IHtpbmRldGVybWluYXRlOiBxdWVzdGlvbi5rb0luZGV0ZXJtaW5hdGV9LCBlbmFibGU6ICFxdWVzdGlvbi5pc1JlYWRPbmx5XFxcIlxcbiAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF0ZXJpYWxEZWNvcmF0b3JcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubGFiZWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGlzcGxheUxhYmVsIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDwvbGFiZWw+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1ib29sZWFuLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jaGVja2JveFxcXCI+XFxuICA8ZmllbGRzZXQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgPGxlZ2VuZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgfVxcXCI+PC9sZWdlbmQ+XFxuICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLCBhczogJ2l0ZW0nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29BZnRlclJlbmRlcn0gIC0tPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5sYWJlbFxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpdGVtID09IHF1ZXN0aW9uLnNlbGVjdEFsbEl0ZW0gLS0+XFxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgJGluZGV4KCksICdhcmlhLWxhYmVsJzogaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCB9LCBjaGVja2VkOiBxdWVzdGlvbi5rb0FsbFNlbGVjdGVkLCBlbmFibGU6ICFxdWVzdGlvbi5pc1JlYWRPbmx5LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaXRlbUNvbnRyb2xcXFwiLz5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXRlbSAhPSBxdWVzdGlvbi5zZWxlY3RBbGxJdGVtIC0tPlxcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBkYXRhLWJpbmQ9XFxcImF0dHI6IHtuYW1lOiBxdWVzdGlvbi5uYW1lLCB2YWx1ZTogaXRlbS52YWx1ZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyAkaW5kZXgoKSwgJ2FyaWEtbGFiZWwnOiBpdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sIH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvVmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgaXRlbS5pc0VuYWJsZWQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCIvPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5tYXRlcmlhbERlY29yYXRvclxcXCI+XFxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sTGFiZWxcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzT3RoZXIgJiYgKCRpbmRleCgpID09IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aC0xKSAtLT5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIH0gfVxcXCI+PC9kaXY+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9maWVsZHNldD5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY2hlY2tib3guaHRtbFxuLy8gbW9kdWxlIGlkID0gODVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWNvbW1lbnRcXFwiPlxcbiAgICA8dGV4dGFyZWEgdHlwZT1cXFwidGV4dFxcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7J3JlYWRvbmx5JzogcXVlc3Rpb24uaXNSZWFkT25seSwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgY29sczogcXVlc3Rpb24uY29scywgcm93czogcXVlc3Rpb24ucm93cywgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsIHBsYWNlaG9sZGVyOiBxdWVzdGlvbi5wbGFjZUhvbGRlciwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9LCB0ZXh0SW5wdXQ6cXVlc3Rpb24udmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj48L3RleHRhcmVhPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jb21tZW50Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1kcm9wZG93blxcXCI+XFxuICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5zZWxlY3RXcmFwcGVyXFxcIj5cXG4gICAgICA8c2VsZWN0IGRhdGEtYmluZD1cXFwiYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0sIHZhbHVlOiBxdWVzdGlvbi52YWx1ZSwgdmFsdWVBbGxvd1Vuc2V0OiB0cnVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbFxcXCI+XFxuICAgICAgICA8b3B0aW9uIGRhdGEtYmluZD1cXFwidGV4dDpxdWVzdGlvbi5vcHRpb25zQ2FwdGlvbiwgdmFsdWU6IG51bGxcXFwiPjwvb3B0aW9uPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcyAtLT5cXG4gICAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVxcXCJ2YWx1ZTogJGRhdGEudmFsdWUsIHRleHQ6ICRkYXRhLnRleHQsIGF0dHI6IHsgZGlzYWJsZWQ6ICEkZGF0YS5pc0VuYWJsZWQgfVxcXCI+PC9vcHRpb24+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L3NlbGVjdD5cXG4gIDwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6IHF1ZXN0aW9uLmhhc090aGVyICYmIHF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCA/IHF1ZXN0aW9uLm90aGVyVGV4dCA6IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNvbnRyb2xcXFwiPjwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiBkYXRhLWJpbmQ9XFxcInRlbXBsYXRlOiB7IHZpc2libGU6IHF1ZXN0aW9uLmhhc090aGVyLCBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIH0gfVxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1lbXB0eVxcXCI+XFxuPGRpdj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZW1wdHkuaHRtbFxuLy8gbW9kdWxlIGlkID0gODhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWVycm9yc1xcXCI+XFxuICAgIDxkaXYgcm9sZT1cXFwiYWxlcnRcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogZXJyb3JzLmxlbmd0aCA+IDAsIGZvcmVhY2g6IHsgZGF0YTogZXJyb3JzLCBhczogJ2Vycm9yJ30sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5yb290XFxcIj5cXG4gICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLmljb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5pdGVtXFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGVycm9yLmxvY1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWVycm9ycy5odG1sXG4vLyBtb2R1bGUgaWQgPSA4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tZXhwcmVzc2lvblxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OnF1ZXN0aW9uLmtvRGlzcGxheVZhbHVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWV4cHJlc3Npb24uaHRtbFxuLy8gbW9kdWxlIGlkID0gOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWZpbGVcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnJvb3RcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJmaWxlXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5maWxlSW5wdXQsIGF0dHI6IHtpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIG11bHRpcGxlOiBxdWVzdGlvbi5hbGxvd011bHRpcGxlID8gJ211bHRpcGxlJyA6IHVuZGVmaW5lZCwgdGl0bGU6IGtvSW5wdXRUaXRsZSwgYWNjZXB0OiBxdWVzdGlvbi5hY2NlcHRlZFR5cGVzIH0sIGV2ZW50OiB7Y2hhbmdlOiBxdWVzdGlvbi5kb2NoYW5nZX1cXFwiPlxcbiAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29IYXNWYWx1ZSAtLT5cXG4gICAgICAgIDxidXR0b24gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlQnV0dG9uLCBjbGljazogcXVlc3Rpb24uZG9jbGVhbiwgdGV4dDogcXVlc3Rpb24uY2xlYW5CdXR0b25DYXB0aW9uXFxcIj48L2J1dHRvbj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGRpc2FibGVkIGRhdGEtYmluZD1cXFwiY3NzOiAnZm9ybS1jb250cm9sICcgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLnBsYWNlaG9sZGVySW5wdXQsIGF0dHI6IHsgcGxhY2Vob2xkZXI6IHF1ZXN0aW9uLnRpdGxlIH1cXFwiIHN0eWxlPVxcXCJjb2xvcjogdHJhbnNwYXJlbnQ7XFxcIi8+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiBxdWVzdGlvbi5rb0RhdGEsIHZpc2libGU6IHF1ZXN0aW9uLmtvSGFzVmFsdWVcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uc2hvd1ByZXZpZXcsIGNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcmV2aWV3XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEubmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgfSwgdGV4dDogJGRhdGEubmFtZSwgYXR0cjogeyBocmVmOiAkZGF0YS5jb250ZW50LCB0aXRsZTogJGRhdGEubmFtZSwgZG93bmxvYWQ6ICRkYXRhLm5hbWUgfVxcXCI+PC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZSgkZGF0YSkgLS0+XFxuICAgICAgICAgICAgICAgIDxpbWcgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IHNyYzogJGRhdGEuY29udGVudCwgaGVpZ2h0OiBxdWVzdGlvbi5pbWFnZUhlaWdodCwgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggfVxcXCIgYWx0PVxcXCJGaWxlIHByZXZpZXdcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEubmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlRmlsZSwgY2xpY2s6IHF1ZXN0aW9uLmRvcmVtb3ZlZmlsZSwgdGV4dDogcXVlc3Rpb24ucmVtb3ZlRmlsZUNhcHRpb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWZpbGUuaHRtbFxuLy8gbW9kdWxlIGlkID0gOTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWh0bWxcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcXVlc3Rpb24ubG9jSHRtbC5rb1JlbmRlcmVkSHRtbFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWh0bWwuaHRtbFxuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWltYWdlcGlja2VyXFxcIj5cXG4gIDxmaWVsZHNldCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8bGVnZW5kIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIj48L2xlZ2VuZD5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyfSAgLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKGl0ZW0pXFxcIj5cXG4gICAgICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmxhYmVsXFxcIj5cXG4gICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge3R5cGU6IHF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gJ2NoZWNrYm94JyA6ICdyYWRpbycsIG5hbWU6IHF1ZXN0aW9uLm5hbWUgKyAnXycgKyBxdWVzdGlvbi5pZCwgdmFsdWU6IGl0ZW0udmFsdWUsIGlkOiAoJGluZGV4KCkgPT0gMCkgPyBxdWVzdGlvbi5pbnB1dElkIDogJycsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgY2hlY2tlZDogcXVlc3Rpb24udmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNvbnRlbnRNb2RlID09PSBcXFwiaW1hZ2VcXFwiIC0tPlxcbiAgICAgICAgICAgICAgICAgIDxpbWcgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaW1hZ2UsIGF0dHI6IHsgc3JjOiAkZGF0YS5pbWFnZUxpbmssIHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoID8gcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgOiB1bmRlZmluZWQsIGhlaWdodDogcXVlc3Rpb24uaW1hZ2VIZWlnaHQgPyBxdWVzdGlvbi5pbWFnZUhlaWdodCArICdweCcgOiB1bmRlZmluZWQgfSwgc3R5bGU6IHsgb2JqZWN0Rml0OiBxdWVzdGlvbi5pbWFnZUZpdCB9XFxcIi8+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY29udGVudE1vZGUgPT09IFxcXCJ2aWRlb1xcXCIgLS0+XFxuICAgICAgICAgICAgICAgICAgPGVtYmVkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmltYWdlLCBhdHRyOiB7IHNyYzogJGRhdGEuaW1hZ2VMaW5rLCB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCA/IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIDogdW5kZWZpbmVkLCBoZWlnaHQ6IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ID8gcXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyAncHgnIDogdW5kZWZpbmVkIH0sIHN0eWxlOiB7IG9iamVjdEZpdDogcXVlc3Rpb24uaW1hZ2VGaXQgfVxcXCIvPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLnNob3dMYWJlbCAtLT5cXG4gICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRleHQgfHwgdmFsdWUsIGF0dHI6IHsgdGl0bGU6IHRleHQgfHwgdmFsdWUgfSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPC9sYWJlbD5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWltYWdlcGlja2VyLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tYXRyaXhcXFwiPlxcbiAgPGZpZWxkc2V0PlxcbiAgICAgIDxsZWdlbmQgZGF0YS1iaW5kPVxcXCJhdHRyOiB7ICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sIH1cXFwiPjwvbGVnZW5kPlxcbiAgICAgIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc1Jvd3NcXFwiPjwvdGQ+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5rb1Zpc2libGVDb2x1bW5zIC0tPlxcbiAgICAgICAgICAgICAgICAgIDx0aD5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Zpc2libGVSb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgIDx0ciBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb3dcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc1Jvd3NcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcm93LmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVmlzaWJsZUNvbHVtbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzQ2VsbFRleHQgLS0+XFxuICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ3NzKHJvdywgJGRhdGEpLCBjbGljazogZnVuY3Rpb24oKSB7IGlmKCFxdWVzdGlvbi5pc1JlYWRPbmx5KSB7cm93LmtvQ2VsbENsaWNrKCRkYXRhKTsgfSB9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3cubmFtZSwgJGRhdGEpIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogIXF1ZXN0aW9uLmhhc0NlbGxUZXh0IC0tPlxcbiAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgaGVhZGVyczogJGRhdGEubG9jVGV4dC5yZW5kZXJlZEh0bWwgfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNzcyhyb3csICRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1WYWx1ZSwgYXR0cjoge25hbWU6IHJvdy5mdWxsTmFtZSwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIHZhbHVlOiAkZGF0YS52YWx1ZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyByb3cubmFtZSArICdfJyArICRpbmRleCgpfSwgY2hlY2tlZDogcm93LmtvVmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNpcmNsZVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cXFwiZGlzcGxheTogbm9uZVxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5sb2NUZXh0LnRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNlbGxMYWJlbCwgYXR0cjogeyBmb3I6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyByb3cubmFtZSArICdfJyArICRpbmRleCgpIH1cXFwiPjwvbGFiZWw+XFxuICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90Ym9keT5cXG4gICAgICA8L3RhYmxlPlxcbiAgPC9maWVsZHNldD5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS10ZXh0XFxcIj5cXG4gIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDokZGF0YS5yZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbWF0cml4Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDk0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tYXRyaXhkeW5hbWljXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvSXNBZGRSb3dPblRvcCgpLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZm9vdGVyXFxcIj5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6cXVlc3Rpb24ua29BZGRSb3dDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uQWRkLCB2YWx1ZTogcXVlc3Rpb24uYWRkUm93VGV4dFxcXCIgLz5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJzdHlsZToge292ZXJmbG93WDogcXVlc3Rpb24uaG9yaXpvbnRhbFNjcm9sbD8gJ3Njcm9sbCc6ICcnfVxcXCI+XFxuICAgICAgICA8dGFibGUgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0lzSG9yaXpvbnRhbENvbHVtbkxheW91dCwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgICAgIDx0aGVhZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLnNob3dIZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNSb3dUZXh0IC0tPjx0ZD48L3RkPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5rb1Zpc2libGVDb2x1bW5zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgbWluV2lkdGg6IHF1ZXN0aW9uLmdldENvbHVtbldpZHRoKCRkYXRhKSB9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvQ2FuUmVtb3ZlUm93IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICA8L3RoZWFkPlxcbiAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLmtvUm93cywgYXM6ICdyb3cnIH0gLS0+XFxuICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc1Jvd1RleHQgLS0+PHRkPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiByb3cubG9jVGV4dCB9IC0tPjwhLS0gL2tvIC0tPjwvdGQ+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHJvdy5jZWxscy0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LW1hdHJpeGNlbGwnLCBkYXRhOiAkZGF0YSwgYXM6IFxcXCJjZWxsXFxcIiwgYWZ0ZXJSZW5kZXI6ICRkYXRhLmRhdGEua29DZWxsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0NhblJlbW92ZVJvdyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvUmVtb3ZlUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvblJlbW92ZSwgdmFsdWU6IHF1ZXN0aW9uLnJlbW92ZVJvd1RleHRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgIDwvdGFibGU+XFxuICAgICAgICA8IS0tIGtvIGlmOiAhcXVlc3Rpb24ua29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQoKSAtLT5cXG4gICAgICAgIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNSb3dUZXh0IC0tPlxcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uc2hvd0hlYWRlclxcXCI+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiByb3cubG9jVGV4dCB9IC0tPjwhLS0gL2tvIC0tPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+ICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLmtvVmlzaWJsZUNvbHVtbnMsIGFzOiAnY29sdW1uJyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLnNob3dIZWFkZXIsIHN0eWxlOiB7IG1pbldpZHRoOiBxdWVzdGlvbi5nZXRDb2x1bW5XaWR0aCgkZGF0YSkgfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NUaXRsZSB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Jvd3MsIGFzOiAncm93JyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbWF0cml4Y2VsbCcsIGRhdGE6IHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdLCBhczogXFxcImNlbGxcXFwiLCBhZnRlclJlbmRlcjogcm93LmRhdGEua29DZWxsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29DYW5SZW1vdmVSb3cgLS0+XFxuICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLnNob3dIZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6cXVlc3Rpb24ua29SZW1vdmVSb3dDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uUmVtb3ZlLCB2YWx1ZTogcXVlc3Rpb24ucmVtb3ZlUm93VGV4dFxcXCIvPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgIDwvdGFibGU+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0lzQWRkUm93T25Cb3R0b20oKSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmZvb3RlclxcXCI+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvQWRkUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbkFkZCwgdmFsdWU6IHF1ZXN0aW9uLmFkZFJvd1RleHRcXFwiIC8+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1tYXRyaXhkeW5hbWljLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tdWx0aXBsZXRleHRcXFwiPlxcbiAgICA8dGFibGUgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdCwgZm9yZWFjaDogeyBkYXRhOiAgcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfVxcXCI+XFxuICAgICAgICA8dHIgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiB7IGRhdGE6IHJvdywgYXM6ICdpdGVtJyB9LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm93XFxcIj5cXG4gICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaXRlbVRpdGxlXFxcIj48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogaXRlbS5sb2NUaXRsZSB9IC0tPjwhLS0gL2tvIC0tPjwvdGQ+XFxuICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogaXRlbS5lZGl0b3IgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogaXRlbS5lZGl0b3Iua29UZW1wbGF0ZU5hbWUoKSwgZGF0YTogaXRlbS5lZGl0b3IsIGFzOiAncXVlc3Rpb24nIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICA8L3RyPlxcbiAgICA8L3RhYmxlPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1tdWx0aXBsZXRleHQuaHRtbFxuLy8gbW9kdWxlIGlkID0gOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3JcXFwiPlxcbiAgICA8aW5wdXQgdHlwZT1cXFwicmFuZ2VcXFwiIG1pbj1cXFwiMFxcXCIgc3R5bGU9XFxcIndpZHRoOjI1JTtmbG9hdDpsZWZ0O21hcmdpbjo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc1JhbmdlLCB2YWx1ZTogcXVlc3Rpb24ua29SYW5nZVZhbHVlLCBhdHRyOiB7bWF4OiBxdWVzdGlvbi5rb1JhbmdlTWF4fVxcXCIgLz5cXG4gICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgc3R5bGU9XFxcImZsb2F0OmxlZnQ7bWFyZ2luOjVweFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0lzUHJldkJ1dHRvbiwgY2xpY2s6cXVlc3Rpb24ua29QcmV2UGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uUHJldiwgdmFsdWU6IHF1ZXN0aW9uLnBhbmVsUHJldlRleHRcXFwiIC8+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIHN0eWxlPVxcXCJmbG9hdDpsZWZ0O21hcmdpbjo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29Jc05leHRCdXR0b24sIGNsaWNrOnF1ZXN0aW9uLmtvTmV4dFBhbmVsQ2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbk5leHQsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbE5leHRUZXh0XFxcIiAvPlxcbiAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwiZmxvYXQ6bGVmdDttYXJnaW46NXB4XFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29DYW5BZGRQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29BZGRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbEFkZFRleHRcXFwiIC8+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3IuaHRtbFxuLy8gbW9kdWxlIGlkID0gOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pY1xcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0lzTGlzdCgpIC0tPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLmtvUGFuZWxzIH0gLS0+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcGFuZWwnLCBkYXRhOiAkZGF0YSwgYXM6ICdxdWVzdGlvbicsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgc3R5bGU9XFxcIm1hcmdpbi10b3A6NXB4XFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvQ2FuUmVtb3ZlUGFuZWwoKSAmJiAhJGRhdGEua29Jc0NvbGxhcHNlZCgpLCBjbGljazpxdWVzdGlvbi5rb1JlbW92ZVBhbmVsQ2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvblJlbW92ZSwgdmFsdWU6IHF1ZXN0aW9uLnBhbmVsUmVtb3ZlVGV4dFxcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8aHIvPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29DYW5BZGRQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29BZGRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbEFkZFRleHRcXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzTGlzdCgpICAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvSXNQcm9ncmVzc1RvcFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3InLCBkYXRhOiBxdWVzdGlvbiwgYXM6ICdxdWVzdGlvbid9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb1BhbmVsKCkgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhbmVsJywgZGF0YTogcXVlc3Rpb24ua29QYW5lbCgpLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUGFuZWxBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29DYW5SZW1vdmVQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29SZW1vdmVQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25SZW1vdmUsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbFJlbW92ZVRleHRcXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29Jc1Byb2dyZXNzQm90dG9tXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvcicsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJ30gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDk4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1yYWRpb2dyb3VwXFxcIj5cXG4gIDxmaWVsZHNldCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8bGVnZW5kIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIj48L2xlZ2VuZD5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyfSAgLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKGl0ZW0pXFxcIj5cXG4gICAgICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmxhYmVsXFxcIj5cXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSArICdfJyArIHF1ZXN0aW9uLmlkLCB2YWx1ZTogaXRlbS52YWx1ZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyAkaW5kZXgoKSwgJ2FyaWEtbGFiZWwnOiBpdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sfSwgY2hlY2tlZDogcXVlc3Rpb24udmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgaXRlbS5pc0VuYWJsZWQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5tYXRlcmlhbERlY29yYXRvclxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sTGFiZWxcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzT3RoZXIgJiYgKCRpbmRleCgpID09IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aC0xKSAtLT5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkfX1cXFwiPjwvZGl2PlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5zaG93Q2xlYXJCdXR0b24gLS0+XFxuICAgICAgPGRpdj5cXG4gICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazpxdWVzdGlvbi5jbGVhclZhbHVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY2xlYXJCdXR0b24sIHZhbHVlOiBxdWVzdGlvbi5jbGVhckJ1dHRvbkNhcHRpb25cXFwiLz5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhZGlvZ3JvdXAuaHRtbFxuLy8gbW9kdWxlIGlkID0gOTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXJhdGluZ1xcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVmlzaWJsZVJhdGVWYWx1ZXMgLS0+XFxuICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvR2V0Q3NzKCRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5uYW1lICsgJGluZGV4KCksIHZhbHVlOiAkZGF0YS52YWx1ZSwgJ2FyaWEtbGFiZWwnOiAkZGF0YS5sb2NUZXh0LnRleHR9LCBldmVudDogeyBjaGFuZ2U6IHF1ZXN0aW9uLmtvQ2hhbmdlfSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNSZWFkT25seVxcXCJcXG4gICAgICAgICAgICAvPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRpbmRleCgpID09IDAgLS0+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWluVGV4dFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NNaW5SYXRlRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UZXh0XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6ICRkYXRhLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRpbmRleCgpID09IChxdWVzdGlvbi5rb1Zpc2libGVSYXRlVmFsdWVzKCkubGVuZ3RoLTEpIC0tPlxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1heFRleHRcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jTWF4UmF0ZURlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvbGFiZWw+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNPdGhlclxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uIH0gfVxcXCI+PC9kaXY+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYXRpbmcuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi10ZXh0XFxcIj5cXG4gIDxpbnB1dCBkYXRhLWJpbmQ9XFxcImRpc2FibGU6IHF1ZXN0aW9uLmlzUmVhZE9ubHksIGF0dHI6IHt0eXBlOiBxdWVzdGlvbi5pbnB1dFR5cGUsIHNpemU6IHF1ZXN0aW9uLnNpemUsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24uaW5wdXRUeXBlID09PSAncmFuZ2UnID8gdW5kZWZpbmVkIDogcXVlc3Rpb24ucGxhY2VIb2xkZXIsIG1heExlbmd0aDogcXVlc3Rpb24uZ2V0TWF4TGVuZ3RoKCksICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgdmFsdWU6cXVlc3Rpb24udmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIi8+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXRleHQuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvblxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvUm9vdENsYXNzLCBzdHlsZTogeyBwYWRkaW5nTGVmdDogcXVlc3Rpb24ucGFkZGluZ0xlZnQsIHBhZGRpbmdSaWdodDogcXVlc3Rpb24ucGFkZGluZ1JpZ2h0LCB3aWR0aDogcXVlc3Rpb24ucmVuZGVyV2lkdGggfSwgYXR0cjoge2lkOiBxdWVzdGlvbi5pZH1cXFwiPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogeyd0aXRsZS1sZWZ0JzogcXVlc3Rpb24uaGFzVGl0bGVPbkxlZnR9XFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNUaXRsZU9uTGVmdFRvcCAtLT5cXG4gICAgICAgICAgICA8IS0ta28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi10aXRsZScsIGRhdGE6IHF1ZXN0aW9uICB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiB7J2NvbnRlbnQtbGVmdCc6IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0fVxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uZXJyb3JMb2NhdGlvbiA9PSAndG9wJyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogcXVlc3Rpb24gfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IHF1ZXN0aW9uLmtvVGVtcGxhdGVOYW1lKCksIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29RdWVzdGlvbkFmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNDb21tZW50XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6cXVlc3Rpb24uY29tbWVudFRleHRcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHRydWUgfSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5lcnJvckxvY2F0aW9uID09ICdib3R0b20nIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBxdWVzdGlvbiB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc1RpdGxlT25Cb3R0b20gLS0+XFxuICAgICAgICAgICAgPCEtLWtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUnLCBkYXRhOiBxdWVzdGlvbiAgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24uaHRtbFxuLy8gbW9kdWxlIGlkID0gMTAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi10aXRsZVxcXCI+XFxuICAgIDxoNSBkYXRhLWJpbmQ9XFxcImNzczoga29Dc3MoKS50aXRsZVxcXCI+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPC9oNT5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFsb2NEZXNjcmlwdGlvbi5pc0VtcHR5LCBjc3M6IGtvQ3NzKCkuZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+PCEtLSAva28gLS0+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbnRpdGxlLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcm93c1xcXCI+XFxuICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiByb3dzLCBhczogJ3Jvdyd9IC0tPlxcbiAgICA8IS0tIGtvIGlmOiByb3cudmlzaWJsZSAtLT5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcGFuZWwuY3NzQ2xhc3Nlcy5yb3dcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHJvdy5lbGVtZW50cywgYXM6ICdxdWVzdGlvbicgLCBhZnRlclJlbmRlcjogcm93LmtvQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzVmlzaWJsZSAtLT5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogcXVlc3Rpb24ua29FbGVtZW50VHlwZSwgZGF0YTogcXVlc3Rpb24sIGFmdGVyUmVuZGVyOiAkcGFyZW50LmtvRWxlbWVudEFmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3Jvd3MuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1zdHJpbmdcXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiBoYXNIdG1sIC0tPlxcbiAgICA8c3BhbiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiIGRhdGEtYmluZD1cXFwidGV4dDoga29SZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IGhhc0h0bWwgLS0+XFxuICAgIDxzcGFuIHN0eWxlPVxcXCJwb3NpdGlvbjogc3RhdGljO1xcXCIgZGF0YS1iaW5kPVxcXCJodG1sOiBrb1JlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbiAgICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvc3RyaW5nLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktdGltZXJwYW5lbFxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OmtvVGltZXJJbmZvVGV4dFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3RpbWVycGFuZWwuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCJcIiArIHJlcXVpcmUoJy4vaW5kZXguaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL2NvbW1lbnQuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3BhZ2UuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3BhbmVsLmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9wcm9ncmVzcy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9yb3dzLmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9zdHJpbmcuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3RpbWVycGFuZWwuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL21hdHJpeGNlbGwuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9udGl0bGUuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWNoZWNrYm94Lmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1jb21tZW50Lmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1kcm9wZG93bi5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1lcnJvcnMuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWZpbGUuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWh0bWwuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLW1hdHJpeC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1tYXRyaXhkeW5hbWljLmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1wYW5lbGR5bmFtaWMuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3IuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tbXVsdGlwbGV0ZXh0Lmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1yYWRpb2dyb3VwLmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1yYXRpbmcuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tdGV4dC5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tYm9vbGVhbi5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tZW1wdHkuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWV4cHJlc3Npb24uaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24taW1hZ2VwaWNrZXIuaHRtbCcpICsgXCJcIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhLi9+L3ZhbC1sb2FkZXIhLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2VudHJ5Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBzdHlsZT1cXFwicG9zaXRpb246IGZpeGVkOyBib3R0b206IDNweDsgcmlnaHQ6IDEwcHg7IG1heC13aWR0aDogNjAlO1xcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cucm9vdFxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cuaGVhZGVyLnJvb3RcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjbGljazpkb0V4cGFuZFxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlOyBjdXJzb3I6IHBvaW50ZXI7XFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cXFwicGFkZGluZy1yaWdodDoxMHB4XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5oZWFkZXIudGl0bGUsIHRleHQ6IGxvY1RpdGxlLmtvUmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBrb0V4cGFuZGVkQ3NzXFxcIj48L3NwYW4+XFxuICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInZpc2libGU6a29FeHBhbmRlZCwgY2xpY2s6ZG9FeHBhbmRcXFwiIHN0eWxlPVxcXCJmbG9hdDogcmlnaHQ7IGN1cnNvcjogcG9pbnRlcjtcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJwYWRkaW5nLXJpZ2h0OjEwcHhcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBjc3Mud2luZG93LmhlYWRlci50aXRsZVxcXCI+WDwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmtvRXhwYW5kZWQsIGNzczogY3NzLndpbmRvdy5ib2R5XFxcIj5cXG4gICAgICAgIDxkaXYgaWQ9XFxcIndpbmRvd1N1cnZleUpTXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2h0bWwtbG9hZGVyP2ludGVycG9sYXRlIS4vfi92YWwtbG9hZGVyIS4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy93aW5kb3cvd2luZG93Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGFyYWJpY1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLYp9mE2LPYp9io2YJcIixcbiAgcGFnZU5leHRUZXh0OiBcItin2YTYqtin2YTZilwiLFxuICBjb21wbGV0ZVRleHQ6IFwi2KfZhtmH2KfYoS0g2KrZhVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiezF9INi12YHYrdipIHswfSDZhdmGXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi2YbYtSDYotiu2LFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2YTYpyDYqtmI2KzYryDYtdmB2K3YqSDZhdix2KbZitipINij2Ygg2LPYpNin2YQg2YHZiiDYp9mE2YXYs9itXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi2LTZg9ix2Kcg2YTZgyDZhNin2LPYqtmD2YXYp9mEINin2YTYp9iz2KrYqNmK2KfZhiFcIixcbiAgbG9hZGluZ1N1cnZleTogXCIuLi7Zitiq2YUg2KrYrdmF2YrZhCDYp9mE2KfYs9iq2KjZitin2YZcIixcbiAgb3B0aW9uc0NhcHRpb246IFwiLi4u2KfYrtiq2LFcIixcbiAgcmVxdWlyZWRFcnJvcjogXCIu2YrYsdis2Ykg2KfZhNil2KzYp9io2Kkg2LnZhNmJINin2YTYs9ik2KfZhFwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmK2LHYrNmJINin2YTYpdis2KfYqNipINi52YTZiSDYp9mE2KPYs9im2YTYqSDZgdmKINis2YXZiti5INin2YTYtdmB2YjZgVwiLFxuICBudW1lcmljRXJyb3I6IFwi2YrYrNioINij2YYg2KrZg9mI2YYg2KfZhNmC2YrZhdipINin2YTYsdmC2YXZitipLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINmF2Kcg2YTYpyDZitmC2YQg2LnZhiB7MH0g2K3YsdmBXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2KPZgtmEINmF2YYgezB9INit2LHZgVwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItmK2LHYrNmJINil2K/Yrtin2YQg2KPZg9ir2LEg2YXZhiB7MH0g2YjYo9mC2YQg2YXZhiB7MX0g2K3YsdmBXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi2YrYsdis2Ykg2YXZhNihINmF2Kcg2YTYpyDZitmC2YQg2LnZhiB7MH0g2KfZhNi12YHZiNmBXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItmK2LHYrNmJINiq2K3Yr9mK2K8g2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYp9mE2YXYqti62YrYsdin2KpcIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi2YrYsdis2Ykg2KrYrdiv2YrYryDZhdinINmE2Kcg2YrYstmK2K8g2LnZhiB7MH0g2KfZhNmF2KrYutmK2LHYp9iqXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF9INmI2YrYs9in2YjZiiDYo9mIINij2YLZhCDZhdmGIHsyfdinXCIsXG4gIG51bWVyaWNNaW46IFwi2YgnezB9JyDZitis2Kgg2KPZhiDYqtmD2YjZhiDZhdiz2KfZiNmK2Kkg2KPZiCDYo9mD2KvYsSDZhdmGIHsxfdinXCIsXG4gIG51bWVyaWNNYXg6IFwi2YgnezB9JyDZitis2Kgg2KPZhiDYqtmD2YjZhiDZhdiz2KfZiNmK2Kkg2KPZiCDYo9mC2YQg2YXZhiB7MX3Yp1wiLFxuICBpbnZhbGlkRW1haWw6IFwi2LHYrNin2KEg2YLZhSDYqNil2K/Yrtin2YQg2KjYsdmK2K8g2KfZhNmD2KrYsdmI2YbZiiDYtdit2YrYrVwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi2LfZhNioINil2LHYrNin2Lkg2K7Yt9ijICd7MH0nLiB7MX3Yp1wiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi2LnYp9ivINi32YTYqCDYqNmK2KfZhtin2Kog2YHYp9ix2LrYqSDYo9mIICfYp9mE2YXYs9in2LEnINmF2YXYqtmE2YPYp9iqINi62YrYsSDYtdit2YrYrdipIFwiLFxuICBleGNlZWRNYXhTaXplOiBcItmI2YrZhtio2LrZiiDYo9mE2Kcg2YrYqtis2KfZiNiyINit2KzZhSDYp9mE2YXZhNmBIHswfdinXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDZgtmK2YXYqSDYo9iu2LHZiVwiLFxuICB1cGxvYWRpbmdGaWxlOiBcItin2YTZhdmE2YEg2KfZhNiu2KfYtSDYqNmDINiq2K3ZhdmK2YQuINmK2LHYrNmJINin2YTYp9mG2KrYuNin2LEg2LnYr9ipINir2YjYp9mGINmI2K3Yp9mI2YQg2YXYsdipINij2K7YsdmJXCIsXG4gIGFkZFJvdzogXCLYp9i22KfZgdipINi12YFcIixcbiAgcmVtb3ZlUm93OiBcItil2LLYp9mE2Kkg2LXZgVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImFyXCJdID0gYXJhYmljU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImFyXCJdID0gXCLYp9mE2LnYsdio2YrYqVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9hcmFiaWMudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGNhdGFsYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNlZ8O8ZW50XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJDb21wbGV0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiVW4gYWx0cmUgKGRlc2NyaWd1aSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlDDoGdpbmEgezB9IGRlIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJObyBoaSBoYSBjYXAgcMOgZ2luYSB2aXNpYmxlIG8gcHJlZ3VudGEgYSBsJ2VucXVlc3RhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkdyw6BjaWVzIHBlciBjb21wbGV0YXIgbCdlbnF1ZXN0YSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJMJ2VucXVlc3RhIHMnZXN0w6AgY2FycmVnYW50IC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJTZWxlY2Npb25hIC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlNpIHVzIHBsYXUgY29udGVzdGkgbGEgcHJlZ3VudGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiU2kgdXMgcGxhdSBjb250ZXN0aSBsZXMgcHJlZ3VudGVzIGRlIGNhZGEgZmlsZXJhLlwiLFxuICBudW1lcmljRXJyb3I6IFwiTCdlc3RpbWFjacOzIGhhIGRlIHNlciBudW3DqHJpY2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBhbG1lbnlzIHswfSBzw61tYm9scy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJTaSB1cyBwbGF1IGVudHJlIG1lbnlzIGRlIHswfSBzw61tYm9scy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJTaSB1cyBwbGF1IGVudHJlIG3DqXMgZGUgezB9IGkgbWVueXMgZGUgezF9IHPDrW1ib2xzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlNpIHVzIHBsYXUgb21wbGkgYWxtZW55cyB7MH0gZmlsZXJlcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2kgdXMgcGxhdSBzZWxlY2Npb25pIGFsbWVueXMgezB9IHZhcmlhbnRzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTaSB1cyBwbGF1IHNlbGVjY2lvbmkgbm8gbcOpcyBkZSB7MH0gdmFyaWFudHMuXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiRWwgJ3swfScgZGV1IHNlciBpZ3VhbCBvIG3DqXMgZGUgezF9IGkgaWd1YWwgbyBtZW55cyBkZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJFbCAnezB9JyBoYSBkZSBzZXIgaWd1YWwgbyBtw6lzIGRlIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIkVsICd7MH0nIGhhIGRlIHNlciBpZ3VhbCBvIG1lbnlzIGRlIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiU2kgdXMgcGxhdSBhZmVnaXUgdW4gY29ycmV1IGVsZWN0csOybmljIHbDoGxpZC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHNvbMK3bGljaXR1ZCB2YSB0b3JuYXIgZXJyb3IgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJMYSBzb2zCt2xpY2l0dWQgdmEgdG9ybmFyIGJ1aWRhIGRlIGRhdGVzIG8gbGEgcHJvcGlldGF0ICd0cmFqZWN0w7JyaWEnIG5vIMOpcyBjb3JyZWN0YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkxhIG1pZGEgZGUgbCdhcnhpdSBubyBwb3QgZXhjZWRpciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJTaSB1cyBwbGF1IGFmZWdpdSBsJ2FsdHJhIGVzdGltYWNpw7MuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJFbCBzZXUgYXJ4aXUgcydlc3TDoCBwdWphbnQuIFNpIHVzIHBsYXUgZXNwZXJpIHVucyBzZWdvbnMgaSBpbnRlbnRldS1obyBkZSBub3UuXCIsXG4gIGFkZFJvdzogXCJBZmVnaXUgdW5hIGZpbGVyYVwiLFxuICByZW1vdmVSb3c6IFwiRWxpbWluYXIgdW5hIGZpbGVyYVwiLFxuICBjaG9pY2VzX2ZpcnN0SXRlbTogXCJwcmltZXIgYXJ0aWNsZVwiLFxuICBjaG9pY2VzX3NlY29uZEl0ZW06IFwic2Vnb24gYXJ0aWNsZVwiLFxuICBjaG9pY2VzX3RoaXJkSXRlbTogXCJ0ZXJjZXIgYXJ0aWNsZVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJGaWxlcmFcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJjYVwiXSA9IGNhdGFsYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiY2FcIl0gPSBcImNhdGFsw6BcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vY2F0YWxhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgY3plY2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUMWZZWRjaG96w61cIixcbiAgcGFnZU5leHRUZXh0OiBcIkRhbMWhw61cIixcbiAgY29tcGxldGVUZXh0OiBcIkhvdG92b1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkppbsOhIG9kcG92xJvEjyAobmFwacWhdGUpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTdHJhbmEgezB9IHogezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIlByxa96a3VtdSBuZW9ic2FodWplIMW+w6FkbsOpIG90w6F6a3kuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRMSba3VqZW1lIHphIHZ5cGxuxJtuw60gcHLFr3prdW11IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlByb2LDrWjDoSBuYcSNw610w6Fuw60gcHLFr3prdW11Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZ5YmVyLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiT2Rwb3bEm3p0ZSBwcm9zw61tIG5hIG90w6F6a3UuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiT2Rwb3bEm3p0ZSBwcm9zw61tIG5hIHbFoWVjaG55IG90w6F6a3kuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJWIHRvbXRvIHBvbGkgbHplIHphZGF0IHBvdXplIMSNw61zbGEuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiWmFkZWp0ZSBwcm9zw61tIGFsZXNwb8WIIHswfSB6bmFrxa8uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiWmFkZWp0ZSBwcm9zw61tIG3DqW7EmyBuZcW+IHswfSB6bmFrxa8uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiWmFkZWp0ZSBwcm9zw61tIHbDrWNlIG5lxb4gezB9IGEgbcOpbsSbIG5lxb4gezF9IHpuYWvFry5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWeXBsxYh0ZSBwcm9zw61tIGFsZXNwb8WIIHswfSDFmcOhZGvFry5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVnliZXJ0ZSBwcm9zw61tIGFsZXNwb8WIIHswfSB2YXJpYW50eS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiTmV2eWLDrXJlanRlIHByb3PDrW0gdsOtY2UgbmXFviB7MH0gdmFyaWFudC5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIk9kcG92xJvEjyAnezB9JyBieSBtxJtsbyBiw710IHbEm3TFocOtIG5lYm8gcm92bm8gezF9IGEgbWVuxaHDrSBuZWJvIHJvdm5vIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk9kcG92xJvEjyAnezB9JyBieSBtxJtsbyBiw710IHbEm3TFocOtIG5lYm8gcm92bm8gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgbWVuxaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiWmFkZWp0ZSBwcm9zw61tIHBsYXRub3UgZS1tYWlsb3ZvdSBhZHJlc3UuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJQb8W+YWRhdmVrIHZyw6F0aWwgY2h5YnUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiUG/FvmFkYXZlayBuZXZyw6F0aWwgZGF0YSBuZWJvIGNlc3RhIGplIG5lcGxhdG7DoVwiLFxuICBleGNlZWRNYXhTaXplOiBcIlZlbGlrb3N0IHNvdWJvcnUgYnkgbmVtxJtsYSBiw710IHbEm3TFocOtIG5lxb4gezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiWmFkZWp0ZSBwcm9zw61tIGppbm91IGhvZG5vdHUuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwiVsOhxaEgc291Ym9yIHNlIG5haHLDoXbDoS4gWmt1c3RlIHRvIHByb3PDrW0gemEgbsSba29saWsgc2VrdW5kLlwiLFxuICBhZGRSb3c6IFwiUMWZaWRhdCDFmcOhZGVrXCIsXG4gIHJlbW92ZVJvdzogXCJPZHN0cmFuaXRcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJjelwiXSA9IGN6ZWNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImN6XCJdID0gXCLEjWXFoXRpbmFcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vY3plY2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGRhbmlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJUaWxiYWdlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJWaWRlcmVcIixcbiAgY29tcGxldGVUZXh0OiBcIkbDpnJkaWdcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiVmFsZ2ZyaXQgc3Zhci4uLlwiLFxuICBub25lSXRlbVRleHQ6IFwiSW5nZW5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVsOmbGcgYWxsZVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkZSB7MH0gYWYgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkRlciBlciBpbmdlbiBzeW5saWdlIHNww7hyZ3Ntw6VsLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIk1hbmdlIHRhayBmb3IgZGluIGJlc3ZhcmVsc2UhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJWb3JlcyBkYXRhIHZpc2VyIGF0IGR1IGFsbGVyZWRlIGhhciBnZW5uZW1mw7hydCBkZXR0ZSBzcMO4cmdlc2tlbWEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiU3DDuHJnZXNrZW1hZXQgaGVudGVzIGZyYSBzZXJ2ZXJlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6ZsZy4uLlwiLFxuICB2YWx1ZTogXCJ2w6ZyZGlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCZXN2YXIgdmVubGlnc3Qgc3DDuHJnc23DpWxldC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiQmVzdmFyIHZlbmxpZ3N0IG1pbmRzdCDDqXQgc3DDuHJnc23DpWwuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQmVzdmFyIHZlbmxpZ3N0IHNww7hyZ3Ntw6VsIGkgYWxsZSByw6Zra2VyLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQW5naXYgZXQgdGFsLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkFuZ2l2IG1pbmRzdCB7MH0gdGVnbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbGVzcyB0aGFuIHswfSBjaGFyYWN0ZXJzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkFuZ2l2IG1lcmUgZW5kIHswfSBvZyBtaW5kcmUgZW5kIHsxfSB0ZWduLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlVkZnlsZCBtaW5kc3QgezB9IHLDpmtrZXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlbDpmxnIHZlbmxpZ3N0IG1pbmRzdCB7MH0gc3Zhcm11bGlnaGVkKGVyKS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgZsOmcnJlIHswfSBzdmFybXVsaWdoZWRlcihlcikuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9IG9nIGxpZyBtZWQgZWxsZXIgbWluZHJlIGVuZCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJBbmdpdiB2ZW5saWdzdCBlbiBneWxkaWcgZS1tYWlsIGFkcmVzc2UuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlVkdHJ5a2tldDogezB9IHNrYWwgcmV0dXJuZXJlICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkZvcmVzcMO4cmdzbGVuIHJldHVybmVyZWRlIGZlamxlbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkZvcmVzcMO4cmdzbGVuIHJldHVybmVyZWRlIGluZ2VuIGRhdGEgZWxsZXIgJ3BhdGgnIHBhcmFtZXRlcmVuIGVyIGZvcmtlcnRcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGaWxzdMO4cnJlbHNlbiBtw6UgaWtrZSBvdmVyc3RpZ2UgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQW5naXYgZW4gdsOmcmRpIGZvciBkaXQgdmFsZ2ZyaWUgc3Zhci5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRpbiBmaWwgYmxpdmVyIHVwbG9hZGV0LiBWZW50IG5vZ2xlIHNla3VuZGVyIG9nIHByw7h2IGV2ZW50dWVsdCBpZ2VuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJJbmRsw6ZzZXIuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJWw6ZsZyBmaWwoZXIpLi4uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsIGR1IGZqZXJuZSBkZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGVubmUgdsOmcmRpIHNrYWwgdsOmcmUgdW5pay5cIixcbiAgYWRkQ29sdW1uOiBcIlRpbGbDuGoga29sb25uZVwiLFxuICBhZGRSb3c6IFwiVGlsZsO4aiByw6Zra2VcIixcbiAgcmVtb3ZlUm93OiBcIkZqZXJuXCIsXG4gIGFkZFBhbmVsOiBcIlRpbGbDuGogbnlcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRmplcm5cIixcbiAgY2hvaWNlc19JdGVtOiBcInZhbGdcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2xvbm5lXCIsXG4gIG1hdHJpeF9yb3c6IFwiUsOma2tlXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmVzdWx0YXRlcm5lIGJsaXZlciBnZW10IHDDpSBzZXJ2ZXJlbi4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRGVyIG9wc3RvZCBlbiBmZWpsIG9nIHZpIGt1bm5lIGlra2UgZ2VtbWUgcmVzdWx0YXRldC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmVzdWx0YXRldCBibGV2IGdlbXQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsO4diBpZ2VuXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJEdSBoYXIgYnJ1Z3QgezB9IHDDpSBkZW5uZSBzaWRlIG9nIHsxfSBpIGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIGJydWd0IHswfSBww6UgZGVubmUgc2lkZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJEdSBoYXIgYnJ1Z3QgezB9IGkgYWx0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiRHUgaGFyIGJydWd0IHswfSBhZiB7MX0gcMOlIGRlbm5lIHNpZGUgb2cgezJ9IGFmIHszfSBpIGFsdC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiRHUgaGFyIGJydWd0IHswfSBhZiB7MX0gcMOlIGRlbm5lIHNpZGUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiRHUgaGFyIGJydWd0IHswfSBhZiB7MX0gaSBhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5zXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJGamVyblwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJGamVybiBkZW5uZSBmaWxcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkYVwiXSA9IGRhbmlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJkYVwiXSA9IFwiZGFuc2tcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZGFuaXNoLnRzIiwiLy9DcmVhdGVkIG9uIGJlaGFsZiBodHRwczovL2dpdGh1Yi5jb20vRnJhbmsxM1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBkdXRjaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJWb3JpZ2VcIixcbiAgcGFnZU5leHRUZXh0OiBcIlZvbGdlbmRlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJWZXJ6ZW5kZW5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbmRlcmVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gdmFuIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJFciBpcyBnZWVuIHppY2h0YmFyZSBwYWdpbmEgb2YgdnJhYWcgaW4gZGV6ZSB2cmFnZW5saWpzdFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkJlZGFua3Qgdm9vciBoZXQgaW52dWxsZW4gdmFuIGRlIHZyYWdlbmxpanN0XCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRGUgdnJhZ2VubGlqc3QgaXMgYWFuIGhldCBsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJLaWVzLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiR2VsaWV2ZSBlZW4gYW50d29vcmQgaW4gdGUgdnVsbGVuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJIZXQgYW50d29vcmQgbW9ldCBlZW4gZ2V0YWwgemlqblwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkdlbGlldmUgbWluc3RlbiB7MH0ga2FyYWt0ZXJzIGluIHRlIHZ1bGxlbi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiR2VsaWV2ZSBtaW5pbXVtIHswfSBhbnR3b29yZGVuIHRlIHNlbGVjdGVyZW4uXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkdlbGlldmUgbmlldCBtZWVyIGRhbiB7MH0gYW50d29vcmRlbiB0ZSBzZWxlY3RlcmVuLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfSBlbiBrbGVpbmVyIG9mIGdlbGlqayBhYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkdlbGlldmUgZWVuIGdlbGRpZyBlLW1haWxhZHJlcyBpbiB0ZSB2dWxsZW4uXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGUgZ3Jvb3R0ZSB2YW4gaGV0IGJlc3RhbmQgbWFnIG5pZXQgZ3JvdGVyIHppam4gZGFuIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkdlbGlldmUgaGV0IHZlbGQgJ0FuZGVyZScgaW4gdGUgdnVsbGVuXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibmxcIl0gPSBkdXRjaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJubFwiXSA9IFwibmVkZXJsYW5kc1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kdXRjaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZmlubmlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJFZGVsbGluZW5cIixcbiAgcGFnZU5leHRUZXh0OiBcIlNldXJhYXZhXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJWYWxtaXNcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJNdXUgKGt1dmFpbGUpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTaXZ1IHswfS97MX1cIixcbiAgZW1wdHlTdXJ2ZXk6XG4gICAgXCJUw6Rzc8OkIGt5c2VseXNzw6QgZWkgb2xlIHlodMOka8Okw6RuIG7DpGt5dmlsbMOkIG9sZXZhYSBzaXZ1YSB0YWkga3lzeW15c3TDpC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJLaWl0b3Mga3lzZWx5eW4gdmFzdGFhbWlzZXN0YSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJLeXNlbHnDpCBsYWRhdGFhbiBwYWx2ZWxpbWVsdGEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmFsaXRzZS4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhc3RhYSBreXN5bXlrc2Vlbiwga2lpdG9zLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQXJ2b24gdHVsZWUgb2xsYSBudW1lZXJpbmVuLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk9sZSBoeXbDpCBqYSBzecO2dMOkIHbDpGhpbnTDpMOkbiB7MH0gbWVya2tpw6QuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIHbDpGhpbnTDpMOkbiB7MH0gdmFpaHRvZWh0b2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIGVuaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgdMOkeXR5eSBvbGxhIGVuZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfSBqYSB2w6RoZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHTDpHl0eXkgb2xsYSBlbmVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyB0w6R5dHl5IG9sbGEgdsOkaGVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlN5w7Z0w6QgdmFsaWRpIHPDpGhrw7Zwb3N0aW9zb2l0ZS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAnT2xlIGh5dsOkIGphIHN5w7Z0w6QgXCJNdXUgKGt1dmFpbGUpXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZpXCJdID0gZmlubmlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmaVwiXSA9IFwic3VvbWFsYWluZW5cIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZnJlbmNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByw6ljw6lkZW50XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTdWl2YW50XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJUZXJtaW5lclwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQ29tbWVuY2VyXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQXV0cmUgKHByw6ljaXNlcilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkF1Y3VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlRvdXQgc8OpbGVjdGlvbm5lclwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gc3VyIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJJbCBuJ3kgYSBuaSBwYWdlIHZpc2libGUgbmkgcXVlc3Rpb24gdmlzaWJsZSBkYW5zIGNlIHF1ZXN0aW9ubmFpcmVcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJNZXJjaSBkJ2F2b2lyIHLDqXBvbmR1IGF1IHF1ZXN0aW9ubmFpcmUgIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk5vcyBkb25uw6llcyBpbmRpcXVlbnQgcXVlIHZvdXMgYXZleiBkw6lqw6AgcmVtcGxpIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTGUgcXVlc3Rpb25uYWlyZSBlc3QgZW4gY291cnMgZGUgY2hhcmdlbWVudC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJDaG9pc2lzc2V6Li4uXCIsXG4gIHZhbHVlOiBcInZhbGV1clwiLFxuICByZXF1aXJlZEVycm9yOiBcIkxhIHLDqXBvbnNlIMOgIGNldHRlIHF1ZXN0aW9uIGVzdCBvYmxpZ2F0b2lyZS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTWVyY2kgZGUgcsOpcG9uZHJlIGF1IG1vaW5zIMOgIHVuZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb3V0ZXMgbGVzIGxpZ25lcyBzb250IG9ibGlnYXRvaXJlc1wiLFxuICBudW1lcmljRXJyb3I6IFwiTGEgcsOpcG9uc2UgZG9pdCDDqnRyZSB1biBub21icmUuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTWVyY2kgZGUgc2Fpc2lyIGF1IG1vaW5zIHswfSBjYXJhY3TDqHJlcy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJNZXJjaSBkZSBzYWlzaXIgbW9pbnMgZGUgezB9IGNhcmFjdMOocmVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIk1lcmNpIGRlIHNhaXNpciBlbnRyZSB7MH0gZXQgezF9IGNhcmFjdMOocmVzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIk1lcmNpIGRlIGNvbXBsw6l0ZXIgYXUgbW9pbnMgezB9IGxpZ25lcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtaW5pbXVtIHswfSByw6lwb25zZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbWF4aW11bSB7MH0gcsOpcG9uc2VzLlwiLFxuICBudW1lcmljTWluTWF4OiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgc3Vww6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfSBldCBpbmbDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVm90cmUgcsOpcG9uc2UgJ3swfScgZG9pdCDDqnRyZSBzdXDDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVm90cmUgcsOpcG9uc2UgJ3swfScgZG9pdCDDqnRyZSBpbmbDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJNZXJjaSBkJ2VudHJlciB1bmUgYWRyZXNzZSBtYWlsIHZhbGlkZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiTCdleHByZXNzaW9uOiB7MH0gZG9pdCByZXRvdXJuZXIgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgcmVxdcOqdGUgYSByZW52b3nDqSB1bmUgZXJyZXVyICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIkxhIHJlcXXDqnRlIGEgcmVudm95w6kgZGVzIGRvbm7DqWVzIHZpZGVzIG91IGxhIHByb3ByacOpdMOpICdwYXRoJyBlc3QgaW5jb3JyZWN0ZVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkxhIHRhaWxsZSBkdSBmaWNoaWVyIG5lIGRvaXQgcGFzIGV4Y8OpZGVyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIk1lcmNpIGRlIHByw6ljaXNlciBsZSBjaGFtcCAnQXV0cmUnLlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlZvdHJlIGZpY2hpZXIgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuIE1lcmNpIGQnYXR0ZW5kcmUgcXVlbHF1ZXMgc2Vjb25kZXMgZXQgZGUgcsOpZXNzYXllci5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiQ2hhcmdlbWVudC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkFqb3V0ZXIgZGVzIGZpY2hpZXJzLi4uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVm91bGV6LXZvdXMgc3VwcHJpbWVyIGNldCBlbnJlZ2lzdHJlbWVudCA/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiQ2V0dGUgdmFsZXVyIGRvaXQgw6p0cmUgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwiQWpvdXRlciB1bmUgY29sb25uZVwiLFxuICBhZGRSb3c6IFwiQWpvdXRlciB1bmUgbGlnbmVcIixcbiAgcmVtb3ZlUm93OiBcIlN1cHByaW1lclwiLFxuICBhZGRQYW5lbDogXCJBam91dGVyXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlN1cHByaW1lclwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbG9ubmVcIixcbiAgbWF0cml4X3JvdzogXCJMaWduZVwiLFxuICBzYXZpbmdEYXRhOiBcIkxlcyByw6lzdWx0YXRzIHNvbnQgZW4gY291cnMgZGUgc2F1dmVnYXJkZSBzdXIgbGUgc2VydmV1ci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiVW5lIGVycmV1ciBlc3Qgc3VydmVudWUgZXQgYSBlbXDDqmNow6kgbGEgc2F1dmVnYXJkZSBkZXMgcsOpc3VsdGF0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiTGVzIHLDqXN1bHRhdHMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6lzICFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlLDqWVzc2F5ZXJcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciBjZXR0ZSBwYWdlIGV0IHsxfSBhdSB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIGNldHRlIHBhZ2UuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gYXUgdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIHsxfSBzdXIgY2V0dGUgcGFnZSBldCB7Mn0gc3VyIHszfSBhdSB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIHsxfSBzdXIgY2V0dGUgcGFnZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgezF9IGF1IHRvdGFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiTmV0dG95ZXJcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlZpZGVyXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkVubGV2ZXIgY2UgZmljaGllclwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZyXCJdID0gZnJlbmNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZyXCJdID0gXCJmcmFuw6dhaXNcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZW9yZ2lhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLhg6Phg5nhg5Dhg5xcIixcbiAgcGFnZU5leHRUZXh0OiBcIuGDqOGDlOGDm+GDk+GDlOGDklwiLFxuICBjb21wbGV0ZVRleHQ6IFwi4YOT4YOQ4YOh4YOg4YOj4YOa4YOU4YOR4YOQXCIsXG4gIHByb2dyZXNzVGV4dDogXCLhg5Lhg5Xhg5Thg6Dhg5Phg5ggezB9IC8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIuGDkOGDoOGDquGDlOGDoOGDl+GDmCDhg5nhg5jhg5fhg67hg5Xhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLhg5Lhg5vhg5Dhg5Phg5rhg53hg5Hhg5cg4YOZ4YOY4YOX4YOu4YOV4YOQ4YOg4YOY4YOhIOGDqOGDlOGDleGDoeGDlOGDkeGDmOGDoeGDl+GDleGDmOGDoSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLhg6nhg5Dhg6Lhg5Xhg5jhg6Dhg5fhg5Xhg5Ag4YOh4YOU4YOg4YOV4YOU4YOg4YOY4YOT4YOQ4YOcLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi4YOh4YOu4YOV4YOQICjhg5Lhg5fhg67hg53hg5Xhg5cg4YOb4YOY4YOj4YOX4YOY4YOX4YOU4YOXKVwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLhg5Dhg6Dhg6nhg5Thg5Xhg5AuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOj4YOe4YOQ4YOh4YOj4YOu4YOU4YOXIOGDmeGDmOGDl+GDruGDleGDkOGDoS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIuGDnuGDkOGDoeGDo+GDruGDmCDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDoOGDmOGDquGDruGDleGDmC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOY4YOn4YOV4YOQ4YOc4YOU4YOXIOGDkOGDoOGDkOGDnOGDkOGDmeGDmuGDlOGDkSB7MH0g4YOh4YOY4YOb4YOR4YOd4YOa4YOdLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOQ4YOY4YOg4YOp4YOY4YOU4YOXIOGDkOGDoOGDkOGDnOGDkOGDmeGDmuGDlOGDkSB7MH0g4YOV4YOQ4YOg4YOY4YOQ4YOc4YOi4YOYLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOQ4YOY4YOg4YOp4YOY4YOU4YOXIOGDkOGDoOGDkOGDo+GDm+GDlOGDouGDlOGDoSB7MH0g4YOV4YOQ4YOg4YOY4YOQ4YOc4YOi4YOYLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg5vhg5Thg6Lhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCwg4YOV4YOY4YOT4YOg4YOUIHsxfSwg4YOT4YOQIOGDnOGDkOGDmeGDmuGDlOGDkeGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYIOGDleGDmOGDk+GDoOGDlCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDm+GDlOGDouGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYIOGDleGDmOGDk+GDoOGDlCB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDnOGDkOGDmeGDmuGDlOGDkeGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYIOGDleGDmOGDk+GDoOGDlCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5jhg6fhg5Xhg5Dhg5zhg53hg5cg4YOU4YOaLiDhg6Thg53hg6Hhg6Lhg5jhg6Eg4YOg4YOU4YOQ4YOa4YOj4YOg4YOYIOGDm+GDmOGDoeGDkOGDm+GDkOGDoOGDl+GDmC5cIixcbiAgb3RoZXJSZXF1aXJlZEVyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDkOGDleGDoeGDlOGDlyDhg5Xhg5Thg5rhg5ggJ+GDoeGDruGDleGDkCdcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJrYVwiXSA9IGdlb3JnaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImthXCJdID0gXCLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5hcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ2VvcmdpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdlcm1hblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJadXLDvGNrXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJXZWl0ZXJcIixcbiAgY29tcGxldGVUZXh0OiBcIkFic2VuZGVuXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTZWl0ZSB7MH0gdm9uIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJFcyBnaWJ0IGtlaW5lIHNpY2h0YmFyZSBGcmFnZS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJWaWVsZW4gRGFuayBmw7xyIGRpZSBCZWFudHdvcnR1bmcgZGVzIEZyYWdlYm9nZW5zIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkRlciBGcmFnZWJvZ2VuIHdpcmQgdm9tIFNlcnZlciBnZWxhZGVuLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQmVudXR6ZXJkZWZpbmllcnRlIEFudHdvcnQuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiV8OkaGxlbi4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBkaWVzZSBGcmFnZS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkRlciBXZXJ0IHNvbGx0ZSBlaW5lIFphaGwgc2Vpbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJCaXR0ZSBnZWJlbiBTaWUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlaW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkJpdHRlIHfDpGhsZW4gU2llIG1pbmRlc3RlbnMgezB9IEVpbnRyw6RnZS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbmljaHQgbWVociBhbHMgezB9IEVpbnRyw6RnZS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHNvbGx0ZSBnbGVpY2ggb2RlciBncsO2w59lciBzZWluIGFscyB7MX0gdW5kIGdsZWljaCBvZGVyIGtsZWluZXIgYWxzIHsyfS5cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBzb2xsdGUgZ2xlaWNoIG9kZXIgZ3LDtsOfZXIgc2VpbiBhbHMgezF9LlwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHNvbGx0ZSBnbGVpY2ggb2RlciBrbGVpbmVyIGFscyB7MX0gc2Vpbi5cIixcbiAgaW52YWxpZEVtYWlsOiBcIkJpdHRlIGdlYmVuIFNpZSBlaW5lIGfDvGx0aWdlIEUtTWFpbCBBZHJlc3NlIGVpbi5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEaWUgRGF0ZWlncsO2w59lIGRhcmYgezB9IG5pY2h0IMO8YmVyc2NocmVpdGVuLlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQml0dGUgZ2ViZW4gU2llIElocmUgYmVudXR6ZXJkZWZpbmllcnRlIEFudHdvcnQgZWluLlwiLFxuICBhZGRSb3c6IFwiUmVpaGUgaGluenVmw7xnZW5cIixcbiAgcmVtb3ZlUm93OiBcIkzDtnNjaGVuXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGVcIl0gPSBnZXJtYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZGVcIl0gPSBcImRldXRzY2hcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwiLy9DcmVhdGVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hZ2Vsb3NwYW5hZ2lvdGFraXNcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ3JlZWtTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwizqDPgc6/zrfOs86/z43OvM61zr3Ov1wiLFxuICBwYWdlTmV4dFRleHQ6IFwizpXPgM+MzrzOtc69zr9cIixcbiAgY29tcGxldGVUZXh0OiBcIs6fzrvOv866zrvOrs+Bz4nPg863XCIsXG4gIG90aGVySXRlbVRleHQ6IFwizobOu867zr8gKM+AzrHPgc6xzrrOsc67z44gzrTOuc61z4XOus+BzrnOvc6vz4PPhM61KVwiLFxuICBwcm9ncmVzc1RleHQ6IFwizqPOtc67zq/OtM6xIHswfSDOsc+Az4wgezF9XCIsXG4gIGVtcHR5U3VydmV5OlxuICAgIFwizpTOtc69IM+Fz4DOrM+Bz4fOtc65IM66zrHOvM6vzrEgzr/Pgc6xz4TOriDPg861zrvOr860zrEgzq4gzr/Pgc6xz4TOriDOtc+Bz47PhM63z4POtyDPg861IM6xz4XPhM+MIM+Ezr8gzrXPgc+Jz4TOt868zrHPhM6/zrvPjM6zzrnOvy5cIixcbiAgY29tcGxldGluZ1N1cnZleTpcbiAgICBcIs6Vz4XPh86xz4HOuc+Dz4TOv8+NzrzOtSDOs865zrEgz4TOt869IM+Dz4XOvM+AzrvOrs+Bz4nPg863IM6xz4XPhM6/z40gz4TOv8+FIM61z4HPic+EzrfOvM6xz4TOv867zr/Os86vzr/PhSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLOpM6/IM61z4HPic+EzrfOvM6xz4TOv867z4zOs865zr8gz4bOv8+Bz4TPjs69zrXPhM6xzrkgzrHPgM6/IM+Ezr8gzrTOuc6xzrrOv868zrnPg8+Ezq4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwizpXPgM65zrvOrc6+z4TOtS4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrHPgM6xzr3PhM6uz4PPhM61IM+Dz4TOt869IM61z4HPjs+EzrfPg863LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOlxuICAgIFwizqDOsc+BzrHOus6xzrvPjiDOsc+AzrHOvc+Ezq7Pg8+EzrUgz4PPhM65z4IgzrXPgc+Jz4TOrs+DzrXOuc+CIM+DzrUgz4zOu861z4Igz4TOuc+CIM6zz4HOsc68zrzOrc+CLlwiLFxuICBudW1lcmljRXJyb3I6IFwizpcgz4TOuc68zq4gz4DPgc6tz4DOtc65IM69zrEgzrXOr869zrHOuSDOsc+BzrnOuM68zrfPhM65zrrOri5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLOoM6xz4HOsc66zrHOu8+OIM+Dz4XOvM+AzrvOt8+Bz47Pg8+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gz4PPjc68zrLOv867zrEuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM6zz4HOsc68zrzOrc+CLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM61z4DOuc67zq3Ovs+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gz4DOsc+BzrHOu867zrHOs86tz4IuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrXPgM65zrvOrc6+z4TOtSDPjM+Hzrkgz4DOsc+BzrHPgM6szr3PiSDOsc+Azr8gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwizqTOvyAnezB9JyDOuM6xIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzq/Pg86/IM6uIM68zrXOs86xzrvPjc+EzrXPgc6/IM6xz4DOvyDPhM6/IHsxfSDOus6xzrkgzq/Pg86/IM6uIM68zrnOus+Bz4zPhM61z4HOvyDOsc+Azr8gz4TOvyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOtc6zzrHOu8+Nz4TOtc+Bzr8gzq4gzrnPg86/IM68zrUgz4TOvyB7MX1cIixcbiAgbnVtZXJpY01heDogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOuc66z4HPjM+EzrXPgc6/IM6uIM6vz4POvyDOsc+Azr8gz4TOvyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIs6gzrHPgc6xzrrOsc67z44gzrTPjs+Dz4TOtSDOvM65zrEgzrHPgM6/zrTOtc66z4TOriDOtM65zrXPjc64z4XOvc+DzrcgZS1tYWlsLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDPg8+GzqzOu868zrEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM66zrXOvc6sIM60zrXOtM6/zrzOrc69zrEgzq4gzrcgzrnOtM65z4zPhM63z4TOsSAnzrzOv869zr/PgM6sz4TOuS9wYXRoJyDOtc6vzr3Osc65IM61z4PPhs6xzrvOvM6tzr3Ot1wiLFxuICBleGNlZWRNYXhTaXplOiBcIs6kzr8gzrzOrc6zzrXOuM6/z4IgzrTOtc69IM68z4DOv8+BzrXOryDOvc6xIM+Fz4DOtc+BzrLOsc6vzr3Otc65IM+EzrEgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+EzrfOvSDPhM65zrzOriDOs865zrEgz4TOvyDPgM61zrTOr86/ICfOrM67zrvOvycuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLOpM6/IM6xz4HPh861zq/OvyDPg86xz4IgzrHOvc61zrLOsc6vzr3Otc65LiDOoM6xz4HOsc66zrHOu8+OIM+AzrXPgc65zrzOrc69zrXPhM61IM66zrHPgM6/zrnOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEgzrrOsc65IM60zr/Ous65zrzOrM+Dz4TOtSDOvs6xzr3OrC5cIixcbiAgYWRkUm93OiBcIs6gz4HOv8+DzrjOrs66zrcgzrPPgc6xzrzOvM6uz4JcIixcbiAgcmVtb3ZlUm93OiBcIs6Rz4bOsc6vz4HOtc+DzrdcIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZ3JcIl0gPSBncmVla1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJnclwiXSA9IFwizrXOu867zrfOvc65zrrOrFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9ncmVlay50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaGVicmV3U3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIteQ15fXldeo15RcIixcbiAgcGFnZU5leHRUZXh0OiBcIten15PXmdee15RcIixcbiAgY29tcGxldGVUZXh0OiBcIteh15nXldedXCIsXG4gIHByb2dyZXNzVGV4dDogXCLXk9ejIHsxfSDXnteq15XXmiB7MH1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi15DXmdefINep15DXnNeV16pcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLXqteV15PXlCDXotecINee15nXnNeV15kg15TXqdeQ15zXldefIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIteY16LXmdeg15Qg157XlNep16jXqi4uLlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIteQ15fXqCAo16DXkCDXnNeq15DXqClcIixcbiAgb3B0aW9uc0NhcHRpb246IFwi15HXl9eoLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi15DXoNeQINeU16nXkSDXotecINeU16nXkNec15RcIixcbiAgbnVtZXJpY0Vycm9yOiBcIteU16rXqdeV15HXlCDXpteo15nXm9eUINec15TXmdeV16og157Xodek16guXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi15TXltefINec16TXl9eV16ogezB9INeq15XXldeZ150uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIteR15fXqCDXnNek15fXldeqIHswfSDXkNek16nXqNeV15nXldeqLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLXkdeX16gg16LXkyB7MH0g15DXpNep16jXldeZ15XXqi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXkteT15XXnCDXniB7MX0sINeV16nXldeV15Qg15wtIHsyfSDXkNeVINek15fXldeqINeeLSB7fX1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug15LXk9eV15wg154gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINen15jXnyDXniB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiAn15TXltefINeb16rXldeR16og15PXldeQXCLXnCDXl9eV16fXmdeqLicsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogJ9eg15Ag15zXlNeW15nXnyDXoNeq15XXoNeZ150g15HXqdeT15QgXCLXkNeX16hcIidcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaGVcIl0gPSBoZWJyZXdTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaGVcIl0gPSBcItei15HXqNeZ16pcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaGVicmV3LnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBodW5nYXJpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVmlzc3phXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJUb3bDoWJiXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJLw6lzelwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkVnecOpYiAoYWRqYSBtZWcpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MH0uL3sxfSBvbGRhbFwiLFxuICBlbXB0eVN1cnZleTogXCJUaGVyZSBpcyBubyB2aXNpYmxlIHBhZ2Ugb3IgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJLw7ZzesO2bmrDvGssIGhvZ3kga2l0w7ZsdMO2dHRlIGZlbG3DqXLDqXPDvG5rZXQhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiTcOhciBraXTDtmx0w7Z0dGUgYSBmZWxtw6lyw6lzdC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJGZWxtw6lyw6lzIGJldMO2bHTDqXNlLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlbDoWxhc3N6b24uLi5cIixcbiAgdmFsdWU6IFwiw6lydMOpa1wiLFxuICByZXF1aXJlZEVycm9yOiBcIkvDqXJqw7xrLCB2w6FsYXN6b2xqYSBtZWcgZXp0IGEga8OpcmTDqXN0IVwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkvDqXJqw7xrIGFkam9uIHbDoWxhc3p0IG1pbmRlbiBzb3JiYW4hXCIsXG4gIG51bWVyaWNFcnJvcjogXCJBeiDDqXJ0w6lrIHN6w6FtIGtlbGwsIGhvZ3kgbGVneWVuIVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9IGthcmFrdGVydCFcIixcbiAgdGV4dE1heExlbmd0aDogXCJMZWdmZWxqZWJiIHswfSBrYXJha3RlcnQgYWRqb24gbWVnIVwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9LCBkZSBsZWdmZWxqZWJiIHsxfSBrYXJha3RlcnQhXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVMO2bHRzw7ZuIGtpIG1pbmltdW0gezB9IHNvcnQhXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlbDoWxhc3N6b24ga2kgbGVnYWzDoWJiIHswfSBsZWhldMWRc8OpZ2V0IVwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJOZSB2w6FsYXNzem9uIHTDtmJiZXQsIG1pbnQgezB9IGxlaGV0xZFzw6lnIVwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgbGVneWVuIG5hZ3lvYmIsIHZhZ3kgZWd5ZW5sxZEsIG1pbnQgezF9IMOpcyBraXNlYmIsIHZhZ3kgZWd5ZW5sxZEsIG1pbnQgezJ9IVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGxlZ3llbiBsZWdhbMOhYmIgezF9IVwiLFxuICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBuZSBsZWd5ZW4gbmFneW9iYiwgbWludCB7MX0hXCIsXG4gIGludmFsaWRFbWFpbDogXCJBZGpvbiBtZWcgZWd5IHZhbMOzcyBlbWFpbCBjw61tZXQhXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJBIGxla8OpcmRlesOpcyBoaWLDoXZhbCB0w6lydCB2aXNzemE6ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSBsZWvDqXJkZXrDqXMgw7xyZXMgYWRhdHRhbCB0w6lydCB2aXNzemEsIHZhZ3kgYSAncGF0aCcgcGFyYW3DqXRlciBoZWx5dGVsZW4uXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiQSBtw6lyZXQgbmVtIGxlaGV0IG5hZ3lvYmIsIG1pbnQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQWRqYSBtZWcgYXogZWd5w6liIMOpcnTDqWtldCFcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZlbHTDtmx0w6lzIGZvbHlhbWF0YmFuLiBWw6Fyam9uIHDDoXIgbcOhc29kcGVyY2V0LCBtYWpkIHByw7Niw6FsamEgw7pqcmEuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVMO2cmxpIGV6dCBhIHJla29yZG90P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkF6IMOpcnTDqWtuZWsgZWd5ZWRpbmVrIGtlbGwgbGVubmllLlwiLFxuICBhZGRSb3c6IFwiU29yIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVSb3c6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgYWRkUGFuZWw6IFwiw5pqIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVQYW5lbDogXCJFbHTDoXZvbMOtdMOhc1wiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIk9zemxvcFwiLFxuICBtYXRyaXhfcm93OiBcIlNvclwiLFxuICBzYXZpbmdEYXRhOiBcIkVyZWRtw6lueSBtZW50w6lzZSBhIHN6ZXJ2ZXJyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRWd5IGhpYmEgZm9seXTDoW4gbmVtIHR1ZHR1ayBlbG1lbnRlbmkgYXogZXJlZG3DqW55dC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRXJlZG3DqW55IHNpa2VyZXNlbiBtZW50dmUhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsOzYsOhbGphIMO6anJhXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaHVcIl0gPSBodW5nYXJpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaHVcIl0gPSBcIm1hZ3lhclwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9odW5nYXJpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGljZWxhbmRpY1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJUaWxiYWthXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLDgWZyYW1cIixcbiAgY29tcGxldGVUZXh0OiBcIkxva2nDsFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkhpbm4gKHNrw71yaW5nKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU8Otw7BhIHswfSBvZiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiw55hw7AgZXIgZW5naW5uIHPDrcOwYSBlw7BhIHNwdXJuaW5nYXIgw60gw75lc3Nhcmkga8O2bm51bi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZ5cmlyIGHDsCBmeWxsamEgw7p0IMO+ZXNzYSBrw7ZubnVuIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkvDtm5udW5pbiBlciBhw7AgaGxhw7BhLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZlbGR1Li4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmluc2FtbGVnYXN0IHN2YXJpw7Agc3B1cm5pbmd1bm5pLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlZpbnNhbWxlZ2FzdCBzdmFyacOwIHNwdXJuaW5ndW0gw60gw7ZsbHVtIHLDtsOwdW0uXCIsXG4gIG51bWVyaWNFcnJvcjogXCLDnmV0dGEgZ2lsZGkgdmVyw7B1ciBhw7AgdmVyYSB0YWxhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1pbm5zdCB7MH0gdMOha24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiw55hw7Agw6Z0dGkgYcOwIHZlcmEgbWVzdCB7MH0gdMOha24uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiw55hw7Agw6Z0dGkgYcOwIHZlcmEgZmxlaXJpIGVuIHswfSBvZyBmw6ZycmkgZW4gezF9IHTDoWtuLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBmeWxsacOwIMO6ciBhw7AgbWlubnN0YSBrb3N0aSB7MH0gcmHDsGlyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWaW5zYW1sZWdhc3QgdmVsamnDsCBhw7AgbWlubnN0YSBrb3N0aSB7MH0gbcO2Z3VsZWlrYS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmluc2FtbGVnYXN0IHZlbGppw7AgZWtraSBmbGVpcmkgZW4gezB9IG3Dtmd1bGVpa2EuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDDpnR0aSBhw7AgdmVyYSBtZWlyYSBlbiBlw7BhIGphZm50IG9nIHsxfSBtaW5uYSBlbiBlw7BhIGphZm50IG9nIHsyfVwiLFxuICBudW1lcmljTWluOiBcInswfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDDpnR0aSBhw7AgdmVyYSBtaW5uYSBlbiBlw7BhIGphZm50IG9nIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmluc2FtbGVnYXN0IHNsw6Fpw7AgaW5uIGdpbHQgbmV0ZmFuZy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkJlacOwbmlubiBza2lsYcOwaSBlZnRpcmZhcmFuYWRpIHZpbGx1ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIkJlacOwbmlubmcgc2tpbGHDsGkgZW5ndW0gZ8O2Z251bSBlw7BhIHNsw7PDsGlubiB2YXIgcsO2bmdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJTa3LDoWlubiBza2FsIGVra2kgdmVyYSBzdMOmcnJpIGVuIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZpbmFtbGVnYXN0IGZ5bGxpw7Agw7p0IGhpdHQgZ2lsZGnDsC5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlNrcsOhaW5uIMO+w61uIHZhciBzZW5kLiBWaW5zYW1sZWdhc3QgYsOtw7Bpw7Agw60gbm9ra3JhciBzZWvDum5kdXIgb2cgcmV5bmnDsCBhZnR1ci5cIixcbiAgYWRkUm93OiBcIkLDpnRhIHZpw7AgcsO2w7BcIixcbiAgcmVtb3ZlUm93OiBcIkZqYXJsw6ZnamFcIixcbiAgY2hvaWNlc19maXJzdEl0ZW06IFwiZnlyc3RpIGhsdXR1clwiLFxuICBjaG9pY2VzX3NlY29uZEl0ZW06IFwiYW5uYXIgaGx1dHVyXCIsXG4gIGNob2ljZXNfdGhpcmRJdGVtOiBcIsO+cmnDsGppIGhsdXR1clwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkTDoWxrdXJcIixcbiAgbWF0cml4X3JvdzogXCJSw7bDsFwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlzXCJdID0gaWNlbGFuZGljU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImlzXCJdID0gXCLDrXNsZW5za2FcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaWNlbGFuZGljLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZWNlZGVudGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1Y2Nlc3Npdm9cIixcbiAgY29tcGxldGVUZXh0OiBcIlNhbHZhXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJJbml6aW9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHRybyAoZGVzY3JpdmkpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOb24gY2kgc29ubyBwYWdpbmUgbyBkb21hbmRlIHZpc2liaWxpIG5lbCBxdWVzdGlvbmFyaW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhemllIHBlciBhdmVyIGNvbXBsZXRhdG8gaWwgcXVlc3Rpb25hcmlvIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlwiSSBub3N0cmkgcmVjb3JkcyBtb3N0cmFubyBjaGUgaGFpIGdpw6AgY29tcGxldGF0byBxdWVzdG8gcXVlc3Rpb25hcmlvLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNhcmljYW1lbnRvIGRlbCBxdWVzdGlvbmFyaW8gaW4gY29yc28uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2NlZ2xpLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkNhbXBvIG9iYmxpZ2F0b3Jpb1wiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQZXIgRmF2b3JlLCByaXNwb25kaSBhZCBhbG1lbm8gdW5hIGRvbWFuZGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQ29tcGxldGFyZSB0dXR0ZSBsZSByaWdoZVwiLFxuICBudW1lcmljRXJyb3I6IFwiSWwgdmFsb3JlIGRldmUgZXNzZXJlIG51bWVyaWNvXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiSW5zZXJpcmUgYWxtZW5vIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1heExlbmd0aDogXCJMdW5naGV6emEgbWFzc2ltYSBjb25zZW50aXRhIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIkluc2VyaXJlIHVuYSBzdHJpbmdhIGNvbiBtaW5pbW8gezB9IGUgbWFzc2ltbyB7MX0gY2FyYXR0ZXJpXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiQ29tcGxldGFyZSBhbG1lbm8gezB9IHJpZ2hlLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBhbG1lbm8gezB9IHZhcmlhbnRpLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBtYXNzaW1vIHswfSB2YXJpYW50aS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfSBlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiSW5zZXJpcmUgaW5kaXJpenpvIG1haWwgdmFsaWRvXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSByaWNoaWVzdGEgaGEgcmlzcG9zdG8gY29uIHVuIGVycm9yZSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHJpY2hpZXN0YSBoYSByaXNwb3N0byBudWxsIG9wcHVyZSBpbCBwZXJjb3JzbyBub24gw6ggY29ycmV0dG9cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJJbCBmaWxlIG5vbiBwdcOyIGVjY2VkZXJlIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiSW5zZXJpcmUgaWwgdmFsb3JlICdhbHRybydcIixcbiAgdXBsb2FkaW5nRmlsZTogXCJGaWxlIGluIGNhcmljYW1lbnRvLiBBdHRlbmRpIGFsY3VuaSBzZWNvbmRpIGUgcmlwcm92YVwiLFxuICBjb25maXJtRGVsZXRlOiBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgZWxtaW5hcmUgaWwgcmVjb3JkP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlF1ZXN0byB2YWxvcmUgZGV2ZSBlc3NlcmUgdW5pdm9jby5cIixcbiAgYWRkUm93OiBcIkFnZ2l1bmdpIHJpZ2FcIixcbiAgcmVtb3ZlUm93OiBcIlJpbXVvdmkgcmlnYVwiLFxuICBhZGRQYW5lbDogXCJBZ2dpdW5naSByaWdhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVsaW1pbmFcIixcbiAgY2hvaWNlc19JdGVtOiBcIkVsZW1lbnRvXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb25uYVwiLFxuICBtYXRyaXhfcm93OiBcIlJpZ2FcIixcbiAgc2F2aW5nRGF0YTogXCJTYWx2YXRhZ2dpbyBkYXRpIHN1bCBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlNpIMOoIHZlcmlmaWNhdG8gdW4gZXJyb3JlIGUgbm9uIMOoIHN0YXRvIHBvc3NpYmlsZSBzYWx2YXJlIGkgcmlzdWx0YXRpLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJJIHJpc3VsdGF0aSBzb25vIHN0YXRpIHNhbHZhdGkgY29uIHN1Y2Nlc3NvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmlwcm92YVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiSGFpIGltcGllZ2F0byB7MH0gc3UgcXVlc3RhIHBhZ2luYSBlIHsxfSBpbiB0b3RhbGUuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkhhaSBpbXBpZWdhdG8gezB9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gaW4gdG90YWxlLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEgZSB7Mn0gZGkgezN9IGluIHRvdGFsZS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IGluIHRvdGFsZS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlB1bGlzY2lcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpdFwiXSA9IGl0YWxpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaXRcIl0gPSBcIml0YWxpYW5vXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2l0YWxpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGtvcmVhblN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLsnbTsoIRcIixcbiAgcGFnZU5leHRUZXh0OiBcIuuLpOydjFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi7JmE66OMXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLsi5zsnpFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLquLDtg4Ao7ISk66qFKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi7Y6Y7J207KeAIHsxfSDspJEgezB9XCIsXG4gIGVtcHR5U3VydmV5OiBcIuyEpOusuOyngOyXkCDrs7Tsl6zsp4DripQg7Y6Y7J207KeA64KYIOyniOusuOydtCDsl4bsirXri4jri6RcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLshKTrrLgg7KGw7IKs66W8IOyZhOujjO2VtCDso7zshZTshJwg6rCQ7IKs7ZWp64uI64ukIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIuq4sOuhneyXkCDrlLDrpbTrqbQg7J2066+4IOyEpOusuCDsobDsgqzrpbwg66eI7LmY7IWo7Iq164uI64ukLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuyEpOusuOyhsOyCrOqwgCDroZzrk5zspJHsnoXri4jri6QuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi7ISg7YOd7ZWY7Iut7Iuc7JikLi4uXCIsXG4gIHZhbHVlOiBcIuqwklwiLFxuICByZXF1aXJlZEVycm9yOiBcIuyniOusuOyXkCDri7XtlZjsi5zsmKQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIu2VmOuCmCDsnbTsg4HsnZgg7KeI66y47JeQIOuLte2VmOyLreyLnOyYpC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLrqqjrk6Ag7ZaJ7JeQIOyeiOuKlCDsp4jrrLjsl5Ag64u17ZWY7Iut7Iuc7JikLlwiLFxuICBudW1lcmljRXJyb3I6IFwi6rCS7J2AIOyIq+yekOyXrOyVvCDtlanri4jri6QuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi64u167OA7J2YIOq4uOydtOuKlCDstZzshowgezB97J6Q7Jes7JW8IOyeheuLiOuLpC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIHswfeyekOulvCDstIjqs7wg7ZWgIOyImCDsl4bsirXri4jri6QuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi64u167OA7J2YIOq4uOydtOuKlCB7MH0gLSB7MX3snpAg7IKs7J207Jes7JW8IO2VqeuLiOuLpC5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLstZzshowgezB96rCc7J2YIO2WieydhCDssYTsmrDsi63si5zsmKRcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi7LWc7IaMIHswfeqwnOydmCDrs4DsiJjrpbwg7ISg7YOd7ZWY7Iut7Iuc7JikLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLstZzrjIAgezB96rCc7J2YIOuzgOyImOulvCDshKDtg53tlZjsi63si5zsmKQuXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfSfsnYAgezF967O064ukIO2BrOqxsOuCmCDqsJnqs6AgezJ967O064ukIOyekeqxsOuCmCDqsJnslYTslbztlanri4jri6QuXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfSfsnYAgezF967O064ukIO2BrOqxsOuCmCDqsJnslYTslbztlanri4jri6QuXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfSfsnYAgezF967O064ukIOyekeqxsOuCmCDqsJnslYTslbztlanri4jri6QuXCIsXG4gIGludmFsaWRFbWFpbDogXCLsmKzrsJTrpbgg7J2066mU7J28IOyjvOyGjOulvCDsnoXroKXtlZjsi63si5zsmKQuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIu2RnO2YhOyLnTogezB97J2AICfssLgn7J207Ja07JW8IO2VqeuLiOuLpC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIid7MH0n7Jy866GcIOyemOuqu+uQnCDsmpTssq3snoXri4jri6QuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi67mE7Ja07J6I64qUIOuNsOydtO2EsOulvCDsmpTssq3tlojqsbDrgpgg7J6Y66q765CcIOyGjeyEseydmCDqsr3roZzsnoXri4jri6QuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi7YyM7J28IO2BrOq4sOqwgCB7MH3snYQg7LSI6rO8IO2VoCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi64uk66W4IOyniOusuOydhCDsnpHshLHtlZjsi63si5zsmKQuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi7YyM7J28IOyXheuhnOuTnCDspJHsnoXri4jri6QuIOyeoOyLnCDtm4Qg64uk7IucIOyLnOuPhO2VmOyLreyLnOyYpC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi66Gc65OcIOykkS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIu2MjOydvCDshKDtg50uLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCLquLDroZ3snYQg7IKt7KCc7ZWY7Iuc6rKg7Iq164uI6rmMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIiDsnbQg6rCS7J2AIOqzoOycoO2VtOyVvO2VqeuLiOuLpC5cIixcbiAgYWRkQ29sdW1uOiBcIuyXtCDstpTqsIBcIixcbiAgYWRkUm93OiBcIu2WiSDstpTqsIBcIixcbiAgcmVtb3ZlUm93OiBcIuygnOqxsFwiLFxuICBhZGRQYW5lbDogXCLsg4jroa3qsowg7LaU6rCAXCIsXG4gIHJlbW92ZVBhbmVsOiBcIuygnOqxsFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi7ZWt66qpXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi7Je0XCIsXG4gIG1hdHJpeF9yb3c6IFwi7ZaJXCIsXG4gIHNhdmluZ0RhdGE6IFwi6rKw6rO86rCAIOyEnOuyhOyXkCDsoIDsnqUg7KSR7J6F64uI64ukLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLsmKTrpZjqsIAg67Cc7IOd7ZWY7JesIOqysOqzvOulvCDsoIDsnqXtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi6rKw6rO86rCAIOyEseqzteyggeycvOuhnCDsoIDsnqXrkJjsl4jsirXri4jri6QhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikXCIsXG4gIHRpbWVyTWluOiBcIuu2hFwiLFxuICB0aW1lclNlYzogXCLstIhcIixcbiAgdGltZXJTcGVudEFsbDogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfeydhCDshozsmpTtlbQg7LSdIHsxfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezBd7J20IOqxuOuguOyKteuLiOuLpFwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuy0nSB7MH3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB9L3sxfeydhCDshozsmpTtlbQg7LSdIHsyfS97M33snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfS97MX3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuy0nSB7MH0vezF97J20IOqxuOuguOyKteuLiOuLpC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIuuLpuq4sFwiLFxuICBjbGVhckNhcHRpb246IFwi7KeA7Jqw6riwXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wia29cIl0gPSBrb3JlYW5TdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia29cIl0gPSBcIu2VnOq1reyWtFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxhdHZpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQXRwYWthxLxcIixcbiAgcGFnZU5leHRUZXh0OiBcIlTEgWzEgWtcIixcbiAgY29tcGxldGVUZXh0OiBcIlBhYmVpZ3RcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkxhcHB1c2UgezB9IG5vIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOYXYgbmV2aWVuYSBqYXV0xIFqdW1hLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlBhdGVpY2FtaWVzIEp1bXMgcGFyIGFua2V0YXMgYWl6cGlsZMSrxaFhbnUhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiSWVsxIFkZSBubyBzZXJ2ZXJhLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQ2l0cyAobMWrZHp1LCBhcHJha3N0aWV0ISlcIixcbiAgb3B0aW9uc0NhcHRpb246IFwiSXp2xJNsxJN0aWVzLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtdSFcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF0YmlsZGVpIGlyIGrEgWLFq3Qgc2thaXRsaW0uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTMWrZHp1LCBpZXZhZGlldCB2aXNtYXogezB9IHNpbWJvbHVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyB2aXNtYXogezB9IHZhcmlhbnR1LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyBuZSB2YWlyYWsgcGFyIHswfSB2YXJpYW50aWVtLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSBuZWvEgSB7MX0sIHVuIHZpZW7EgWRhbSB2YWkgbWF6xIFrYW0sIG5la8SBIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGrEgWLFq3QgdmllbsSBZGFtIHZhaSBsaWVsxIFrYW0gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkzFq2R6dSwgaWV2YWRpZXQgcGF0aWVzdSBlLXBhc3RhIGFkcmVzaSFcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAnTMWrZHp1LCBpZXZhZGlldCBkYXR1cyBsYXVrxIEgXCJDaXRzXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx2XCJdID0gbGF0dmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJsdlwiXSA9IFwibGF0dmllxaF1XCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2xhdHZpYW4udHMiLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxpdGh1YW5pYVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdGdhbFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG9saWF1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJCYWlndGlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlByYWTEl3RpXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiS2l0YSAoxK92ZXN0aSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk7El3JhXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlBhc2lyaW5rdGkgdmlzdXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlB1c2xhcGlzIHswfSBpxaEgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkFwa2xhdXNvamUgbsSXcmEgbWF0b21vIHB1c2xhcGlvIGFyIGtsYXVzaW1vLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEl2tvamFtZSB1xb4gZGFseXZhdmltxIUgYXBrbGF1c29qZSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk3Fq3PFsyDEr3JhxaFhaSByb2RvLCBrYWQgamF1IGF0bGlrb3RlIMWhacSFIGFwa2xhdXPEhS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcmHFoW9tZSBwYWxhdWt0aS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJQYXNpcmlua3RpLi4uXCIsXG4gIHZhbHVlOiBcInJlaWvFoW3El1wiLFxuICByZXF1aXJlZEVycm9yOiBcIkLFq3RpbmEgYXRzYWt5dGkgxK8gxaHEryBrbGF1c2ltxIUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkLFq3RpbmEgYXRzYWt5dGkgYmVudCDEryB2aWVuxIUga2xhdXNpbcSFLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlByYcWhb21lIGF0c2FreXRpIMSvIGtsYXVzaW11cyB2aXNvc2UgZWlsdXTEl3NlLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVHVyaSBixat0aSBza2FpxI1pYWkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBiZW50IHswfSBzaW1ib2xpdXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBtYcW+aWF1IG5laSB7MH0gc2ltYm9sacWzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlByYcWhb21lIHN1dmVzdGkgZGF1Z2lhdSBuZWkgezB9IGlyIG1hxb5pYXUgbmVpIHsxfSBzaW1ib2xpxbMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJhxaFvbWUgc3V2ZXN0aSBuZSBtYcW+aWF1IG5laSB7MH0gZWlsdcSNacWzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQcmHFoW9tZSBwYXNpcmlua3RpIGJlbnQgezB9IHZhcmlhbnTFsy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGFzaXJpbmtpdGUgbmUgZGF1Z2lhdSBrYWlwIHswfSB2YXJpYW50dXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyB0dXJpIGLFq3RpIGx5Z3VzIGFyYmEgZGlkZXNuaXMgbmVpIHsxfSBpciBseWd1cyBhcmJhIG1hxb5lc25pcyBuZWkgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgdHVyxJd0xbMgYsWrdGkgbHlndXMgYXJiYSBkaWRlc25pcyBuZWkgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgdHVyxJd0xbMgYsWrdGkgbHlndXMgYXIgbWHFvmVzbmlzIHXFviB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlByYcWhb21lIMSvdmVzdGkgZ2FsaW9qYW50xK8gZWxla3Ryb25pbmlvIHBhxaF0byBhZHJlc8SFLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJSZWlrxaFtxJc6IHswfSB0dXJpIGdyxIXFvmludGkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVcW+a2xhdXNhIGdyxIXFvmlubyBrbGFpZMSFJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJVxb5rbGF1c2EgZ3LEhcW+aW5vIHR1xaHEjWl1cyBkdW9tZW5pcyBhcmJhICdwYXRoJyBzYXZ5YsSXIHlyYSBuZXRlaXNpbmdhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmFpbG8gZHlkaXMgbmV0dXJpIHZpcsWheXRpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIsSudmVza2l0ZSBraXTEhSByZWlrxaFtxJkuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJKxatzxbMgZmFpbGFzIHlyYSBrZWxpYW1hcy4gUGFsYXVraXRlIGtlbGV0xIUgc2VrdW5kxb5pxbMgaXIgYmFuZHlraXRlIGRhciBrYXJ0xIUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIlByYcWhb21lIHBhbGF1a3RpLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiUGFzaXJpbmt0aSBmYWlsxIUodXMpLi4uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiQXIgbm9yaXRlIGnFoXRyaW50aSDEr3JhxaHEhT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLFoGkgcmVpa8WhbcSXIHR1csSXdMWzIGLFq3RpIHVuaWthbGkuXCIsXG4gIGFkZENvbHVtbjogXCJQcmlkxJd0aSBzdHVscGVsxK9cIixcbiAgYWRkUm93OiBcIlByaWTEl3RpIGVpbHV0xJlcIixcbiAgcmVtb3ZlUm93OiBcIknFoXRyaW50aVwiLFxuICBhZGRQYW5lbDogXCJQcmlkxJd0aSBuYXVqxIVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiScWhdHJpbnRpXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50YXNcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTdHVscGVsaXNcIixcbiAgbWF0cml4X3JvdzogXCJFaWx1dMSXXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmV6dWx0YXRhaSBzYXVnb21pIHNlcnZlcnlqZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwixK52eWtvIGtsYWlkYSBpciBtZXMgbmVnYWzEl2pvbWUgacWhc2F1Z290aSByZXp1bHRhdMWzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHRhdGFpIGJ1dm8gacWhc2F1Z290aSBzxJdrbWluZ2FpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiQmFuZHl0aSBkYXIga2FydMSFXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJQcmFsZWlkb3RlIHswfSDFoWlhbWUgcHVzbGFweWplIGlyIHsxfSBpxaEgdmlzby5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiUHJhbGVpZG90ZSB7MH0gxaFpYW1lIHB1c2xhcHlqZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJQcmFsZWlkb3RlIHswfSBpxaEgdmlzby5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gxaFpYW1lIHB1c2xhcHlqZSBpciB7Mn0gacWhIHszfSBpxaEgdmlzby5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSDFoWlhbWUgcHVzbGFweWplLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gacWhIHZpc28uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJJxaF2YWx5dGlcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlZhbHl0aVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJJxaF0cmludGkgxaHEryBmYWlsxIVcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx0XCJdID0gbGl0aHVhbmlhU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImx0XCJdID0gXCJMaWV0dXZpxbNcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbm9yd2VnaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkZvcnJpZ2VcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5lc3RlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGdWxsZsO4clwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbm5ldCAoYmVza3JpdilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGF2IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJEZXQgZXIgaW5nZW4gc3lubGlnIHNpZGUgZWxsZXIgc3DDuHJzbcOlbCBpIHVuZGVyc8O4a2Vsc2VuLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRha2sgZm9yIGF0IGR1IGZ1bGxmw7hydGUgdW5kZXJzw7hrZWxzZW4hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJWw6VyZSBkYXRhIHZpc2VyIGF0IGR1IGFsbGVyZWRlIGhhciBnamVubm9tZsO4cnQgZGVubmUgdW5kZXJzw7hrZWxzZW4uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVW5kZXJzw7hrZWxzZW4gbGFzdGVyLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZlbGcuLi5cIixcbiAgdmFsdWU6IFwidmVyZGlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJWZW5ubGlnc3Qgc3ZhciBww6Ugc3DDuHJzbcOlbGV0LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWZW5ubGlnc3Qgc3ZhciBww6UgbWluc3QgZXR0IHNww7hyc23DpWwuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVmVubmxpZ3N0IHN2YXIgcMOlIHNww7hyc23DpWwgaSBhbGxlIHJhZGVyLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVmVyZGllbiBza2FsIHbDpnJlIG51bWVyaXNrLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gbWluc3QgezB9IHRlZ24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtaW5kcmUgZW5uIHswfSB0ZWduLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gbWVyIGVubiB7MH0gb2cgbWluZHJlIGVubiB7MX0gdGVnbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWZW5ubGlnc3QgZnlsbCBpbm4gbWluc3QgezB9IHJhZGVyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWZW5ubGlnc3QgdmVsZyBtaW5zdCB7MH0gdmFyaWFudGVyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWZW5ubGlnc3QgaWtrZSB2ZWxnIG1lciBlbm4gezB9IHZhcmlhbnRlci5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGLDuHIgdsOmcmUgbGlrIGVsbGVyIG1lciBlbm4gezF9IG9nIGxpayBlbGxlciBtaW5kcmUgZW5uIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGLDuHIgdsOmcmUgbGlrIGVsbGVyIG1lciBlbm4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWluZHJlIGVubiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gZW4gZ3lsZGlnIGUtcG9zdCBhZHJlc3NlLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRm9yZXNww7hyc2VsZW4gcmV0dXJuZXJ0ZSBmZWlsZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJGb3Jlc3DDuHJzZWxlbiByZXR1cm5lcnRlIHRvbW1lIGRhdGEsIGVsbGVyICdzdGknIC1lZ2Vuc2thcGVuIGVyIGZlaWxcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGaWxzdMO4cnJlbHNlbiBiw7hyIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gZGVuIGFuZHJlIHZlcmRpZW4uXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGaWxlbiBkaW4gbGFzdGVzIG9wcC4gVmVubmxpZ3N0IHZlbnQgbm9lbiBzZWt1bmRlciBvZyBwcsO4diBpZ2plbi5cIixcbiAgY29uZmlybURlbGV0ZTogXCLDmG5za2VyIGR1IMOlIHNsZXR0ZSBwb3N0ZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGVubmUgdmVyZGllbiBza2FsIHbDpnJlIHVuaWsuXCIsXG4gIGFkZFJvdzogXCJMZWdnIHRpbCByYWRcIixcbiAgcmVtb3ZlUm93OiBcIkZqZXJuXCIsXG4gIGFkZFBhbmVsOiBcIkxlZ2cgdGlsIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkZqZXJuZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbG9ubmVcIixcbiAgbWF0cml4X3JvdzogXCJSYWRcIixcbiAgc2F2aW5nRGF0YTogXCJSZXN1bHRhdGVuZSBsYWdyZXMgcMOlIHNlcnZlcmVuIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRGV0IG9wcHN0byBlbiBmZWlsLCBvZyB2aSBrdW5uZSBpa2tlIGxhZ3JlIHJlc3VsdGF0ZW5lLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXN1bHRhdGVuZSBibGUgbGFncmV0IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDuHYgaWdqZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gcMOlIGRlbm5lIHNpZGVuIG9nIHsxfSB0b3RhbHQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gcMOlIGRlbm5lIHNpZGVuLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkR1IGhhciB0aWxicmFrdCB7MH0gdG90YWx0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiRHUgaGFyIHRpbGJyYWt0IHswfSBhdiB7MX0gcMOlIGRlbm5lIHNpZGVuIG9nIHRvdGFsdCB7Mn0gYXYgezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSBww6UgZGVubmUgc2lkZW4uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBhdiB7MX0gdG90YWx0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUmVuc1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJub1wiXSA9IG5vcndlZ2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJub1wiXSA9IFwibm9yc2tcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vbm9yd2VnaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwZXJzaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItmC2KjZhNuMXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLYqNi52K/bjFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi2KraqdmF24zZhFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItiv24zar9ixKNiq2YjYttuM2K0pXCIsXG4gIHByb2dyZXNzVGV4dDogXCLYtdmB2K3ZhyB7MH0g2KfYsiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2LXZgdit2Ycg2KfbjCDbjNinINqv2LLbjNmG2Ycg2KfbjCDYqNix2KfbjCDYp9uM2YYg2b7Ysdiz2LTZhtin2YXZhyDZhdmI2KzZiNivINmG24zYs9iqLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItin2LIg2LTZhdinINio2KfYqNiqINiq2qnZhduM2YQg2KfbjNmGINm+2LHYs9i02YbYp9mF2Ycg2YXYqti02qnYsduM2YVcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItio2Ycg2YbYuNixINmF24wg2LHYs9ivINmH2YUg2YfZhSDYp9qp2YbZiNmGINm+2LHYs9i02YbYp9mF2Ycg2LHYpyDYqtqp2YXbjNmEINqp2LHYr9mHINin24zYry5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLYr9ix2K3Yp9mEINin24zYrNin2K8g2b7Ysdiz2LTZhtin2YXZh1wiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLYp9mG2KrYrtin2Kgg2qnZhtuM2K8uLi5cIixcbiAgdmFsdWU6IFwi2YXZgtiv2KfYsVwiLFxuICByZXF1aXJlZEVycm9yOiBcItmE2LfZgdinINio2Ycg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLZhNi32YHYpyDYqNmHINiq2YXYp9mFINiz2LfYsSDZh9in24wg2LPZiNin2YTYp9iqINm+2KfYs9iuINiv2YfbjNivXCIsXG4gIG51bWVyaWNFcnJvcjogXCLZhdmC2K/Yp9ixINio2KfbjNivINi52K/Yr9uMINio2KfYtNivXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2YTYt9mB2Kcg2K3Yr9in2YLZhCAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYr1wiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItmE2LfZgdinINqp2YXYqtixINin2LIgIHswfSDYrdix2YEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2KjbjNi02KrYsSDYp9iyICB7MH0g2K3YsdmBINmIINqp2YXYqtixINin2LIgezF9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZhNi32YHYpyDYrdiv2KfZgtmEIHswfSDYs9i32LEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItit2K/Yp9mC2YQgezB9INin2YbYqtiu2KfYqCDaqdmG24zYry5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi2YTYt9mB2Kcg2KjbjNi02KrYsSDYp9iyICB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nINio2KfbjNivINio24zZhiB7MX0g2YggezJ9INio2KfYtNivXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg2KjYstix2q/YqtixINmF2LPYp9mI24wgezF9INio2KfYtNivXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg2KjYp9uM2K8g2qnZiNqG2qnYqtixINuM2Kcg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgaW52YWxpZEVtYWlsOiBcItmE2LfZgdinINin24zZhduM2YQg2LXYrduM2K0g2K/YsdisINqp2YbbjNivXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLYr9ix2K7ZiNin2LPYqiDYqNinINiu2LfYpyDYsdmI2KjYsdmIINi02K86ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcItiv2LHYrtmI2KfYs9iqINmF2LPbjNix24wg2K7Yp9mE24wg2KjYp9iy2q/YtNiqINiv2KfYr9mHINuM2Kcg2YXYs9uM2LEg2K/Ysdiz2Kog2KrZhti424zZhSDZhti02K/Zh1wiLFxuICBleGNlZWRNYXhTaXplOiBcItio24zYtNiq2LHbjNmGINit2KzZhSDZhdis2KfYsiDZgdin24zZhDogezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLZhdmC2K/Yp9ixICfYr9uM2q/YsScg2LHYpyDZiNin2LHYryDaqdmG24zYr1wiLFxuICB1cGxvYWRpbmdGaWxlOiBcItmB2KfbjNmEINiv2LEg2K3Yp9mEINii24zZhNmI2K8g2YXbjCDYqNin2LTYry4g2YTYt9mB2Kcg2LXYqNixINqp2YbbjNivLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItii24zYpyDZhdin24zZhCDYqNmHINit2LDZgSDYp9uM2YYg2LHYr9uM2YEg2YfYs9iq24zYr9ifXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi2KfbjNmGINmF2YLYr9in2LEg2KjYp9uM2K8g2LrbjNixINiq2qnYsdin2LHbjCDYqNin2LTYr1wiLFxuICBhZGRSb3c6IFwi2LPYt9ixINis2K/bjNivXCIsXG4gIHJlbW92ZVJvdzogXCLYrdiw2YFcIixcbiAgYWRkUGFuZWw6IFwi2KzYr9uM2K9cIixcbiAgcmVtb3ZlUGFuZWw6IFwi2K3YsNmBXCIsXG4gIGNob2ljZXNfSXRlbTogXCLYotuM2KrZhVwiLFxuICBtYXRyaXhfY29sdW1uOiBcItiz2KrZiNmGXCIsXG4gIG1hdHJpeF9yb3c6IFwi2LPYt9ixXCIsXG4gIHNhdmluZ0RhdGE6IFwi2YbYqtin24zYrCDYr9ixINit2KfZhCDYsNiu24zYsdmHINiz2KfYstuMINiv2LEg2LPYsdmI2LEg2YXbjCDYqNin2LTYr1wiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi2K7Yt9in24zbjCDYr9ixINiw2K7bjNix2Ycg2LPYp9iy24wg2YbYqtin24zYrCDYsdiuINiv2KfYr9mHINin2LPYqlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLZhtiq2KfbjNisINio2Kcg2YXZiNmB2YLbjNiqINiw2K7bjNix2Ycg2LTYr1wiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi2YXYrNiv2K8g2KrZhNin2LQg2qnZhtuM2K9cIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmFcIl0gPSBwZXJzaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZhXCJdID0gXCLZgdin2LHZktiz2ZDZiVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9wZXJzaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwb2xpc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiV3N0ZWN6XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWxlalwiLFxuICBjb21wbGV0ZVRleHQ6IFwiR290b3dlXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSW5uYSBvZHBvd2llZMW6ICh3cGlzeilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cm9uYSB7MH0geiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTmllIG1hIHdpZG9jem55Y2ggcHl0YcWELlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkR6acSZa3VqZW15IHphIHd5cGXFgm5pZW5pZSBhbmtpZXR5IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlRyd2Egd2N6eXR5d2FuaWUgYW5raWV0eS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJXeWJpZXJ6Li4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHRvIHB5dGFuaWUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHdzenlzdGtpZSBweXRhbmlhLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVyB0eW0gcG9sdSBtb8W8bmEgd3Bpc2HEhyB0eWxrbyBsaWN6YnkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3LlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBtbmllaiBuacW8IHswfSB6bmFrw7N3LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyB3acSZY2VqIG5pxbwgezB9IGkgbW5pZWogbmnFvCB7MX0gem5ha8Ozdy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcm9zesSZIHV6dXBlxYJuacSHIHByenluYWptbmllaiB7MH0gd2llcnN6eS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUHJvc3rEmSB3eWJyYcSHIGNvIG5ham1uaWVqIHswfSBwb3p5Y2ppLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgbmllIHdpxJljZWogbmnFvCB7MH0gcG96eWNqaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIHdpxJlrc3phIGx1YiByw7N3bmEgezF9IG9yYXogbW5pZWpzemEgbHViIHLDs3duYSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyB3acSZa3N6YSBsdWIgcsOzd25hIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIG1uaWVqc3phIGx1YiByw7N3bmEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQcm9zesSZIHBvZGHEhyBwcmF3aWTFgm93eSBhZHJlcyBlbWFpbC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIsW7xIVkYW5pZSB6d3LDs2NpxYJvIGLFgsSFZCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIsW7xIVkYW5pZSBuaWUgendyw7NjacWCbyBkYW55Y2ggYWxibyDFm2NpZcW8a2EgamVzdCBuaWVwcmF3aWTFgm93YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIlJvem1pYXIgcHJ6ZXPFgmFuZWdvIHBsaWt1IG5pZSBtb8W8ZSBwcnpla3JhY3phxIcgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBwb2RhxIcgaW5uxIUgb2Rwb3dpZWTFui5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlRyd2EgcHJ6ZW5vc3plbmllIFR3b2plZ28gcGxpa3UsIHByb3N6xJkgc3Byw7Nib3dhxIcgcG9ub3duaWUgemEga2lsa2Egc2VrdW5kLlwiLFxuICBhZGRSb3c6IFwiRG9kYWogd2llcnN6XCIsXG4gIHJlbW92ZVJvdzogXCJVc3XFhFwiLFxuICBhZGRQYW5lbDogXCJEb2RhaiBwYW5lbFwiLFxuICByZW1vdmVQYW5lbDogXCJVc3XFhFwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJXaWVyc3pcIixcbiAgc2F2aW5nRGF0YTogXCJaYXBpc3VqxJkgd3luaWtpIGFua2lldHkgbmEgc2Vyd2VyemUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIld5c3TEhXBpxYIgYsWCxIVkIGkgd3luaWtpIG5pZSBtb2fFgnkgem9zdGHEhyB6YXBpc2FuZS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiV3luaWtpIHpvc3RhxYJ5IHBvcHJhd25pZSB6YXBpc2FuZSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlNwcsOzYnVqIHBvbm93bmllXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJTcMSZZHppxYJlxZsgezB9IG5hIHRlaiBzdHJvbmllIGEgdyBzdW1pZSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlNwxJlkemnFgmXFmyB7MH0gbmEgdGVqIHN0cm9uaWUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiU3DEmWR6acWCZcWbIHcgc211bWllIHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJTcMSZZHppxYJlxZsgezB9IHogezF9IG5hIHRlaiBzdHJvbmllIGEgdyBzdW1pZSB7Mn0geiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlNwxJlkemnFgmXFmyB7MH0geiB7MX0gbmEgdGVqIHN0cm9uaWVcIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJTcMSZZHppxYJlxZsgezB9IHogezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwiV3ljennFm8SHXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicGxcIl0gPSBwb2xpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicGxcIl0gPSBcInBvbHNraVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9wb2xpc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlByw7N4aW1vXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGaW5hbGl6YXJcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdXRyb3MgKGRlc2NyZXZlcilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gZGUgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk7Do28gaMOhIHDDoWdpbmEgdmlzw612ZWwgb3UgcGVyZ3VudGEgbmEgcGVzcXVpc2EuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiT2JyaWdhZG8gcG9yIGZpbmFsaXphciBhIHBlc3F1aXNhIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTm9zc29zIHJlZ2lzdHJvcyBtb3N0cmFtIHF1ZSB2b2PDqiBqw6EgZmluYWxpem91IGEgcGVzcXVpc2EuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiQSBwZXNxdWlzYSBlc3TDoSBjYXJyZWdhbmRvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjaW9uZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWxvclwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYSBwZXJndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjpcbiAgICBcIlBvciBmYXZvciwgcmVzcG9uZGEgYXMgcGVyZ3VudGFzIGVtIHRvZGFzIGFzIGxpbmhhcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk8gdmFsb3IgZGV2ZSBzZXIgbnVtw6lyaWNvLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIHBlbG8gbWVub3MgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWVub3MgZGUgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWFpcyBkZSB7MH0gZSBtZW5vcyBkZSB7MX0gY2FyYWN0ZXJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmVlbmNoYSBwZWxvIG1lbm9zIHswfSBsaW5oYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNlbGVjaW9uZSBwZWxvIG1lbm9zIHswfSBvcMOnw7Vlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yLCBzZWxlY2lvbmUgbsOjbyBtYWlzIGRvIHF1ZSB7MH0gb3DDp8O1ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9IGUgaWd1YWwgb3UgbWVub3IgcXVlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IGluZmVyaW9yIGEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IsIGluZm9ybWUgdW0gZS1tYWlsIHbDoWxpZG8uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJBIHJlcXVpc2nDp8OjbyByZXRvcm5vdSBvIGVycm8gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJBIHJlcXVpc2nDp8OjbyBuw6NvIHJldG9ybm91IGRhZG9zIG91IG8gJ2NhbWluaG8nIGRhIHJlcXVpc2nDp8OjbyBuw6NvIGVzdMOhIGNvcnJldG9cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJPIHRhbWFuaG8gZG8gYXJxdWl2byBuw6NvIGRldmUgZXhjZWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IsIGluZm9ybWUgbyBvdXRybyB2YWxvci5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlNldSBhcnF1aXZvIGVzdMOhIHNlbmRvIGNhcnJlZ2Fkby4gUG9yIGZhdm9yLCBhZ3VhcmRlIGFsZ3VucyBzZWd1bmRvcyBlIHRlbnRlIG5vdmFtZW50ZS5cIixcbiAgYWRkUm93OiBcIkFkaWNpb25hciBsaW5oYVwiLFxuICByZW1vdmVSb3c6IFwiUmVtb3ZlciBsaW5oYVwiLFxuICBhZGRQYW5lbDogXCJBZGljaW9uYXIgbm92b1wiLFxuICByZW1vdmVQYW5lbDogXCJSZW1vdmVyXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiTGluaGFcIixcbiAgc2F2aW5nRGF0YTogXCJPcyByZXN1bHRhZG9zIGVzdG8gc2VuZG8gc2Fsdm9zIG5vIHNlcnZpZG9yLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJPY29ycmV1IHVtIGVycm8gZSBuw6NvIGZvaSBwb3Nzw612ZWwgc2FsdmFyIG9zIHJlc3VsdGFkb3MuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIk9zIHJlc3VsdGFkb3MgZm9yYW0gc2Fsdm9zIGNvbSBzdWNlc3NvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiVGVudGUgbm92YW1lbnRlXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInB0XCJdID0gXCJwb3J0dWd1w6pzXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJvbWFuaWFuU3VydmV5U3RyaW5nczogYW55ID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJVcm3Eg3RvclwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyZVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFsdHVsKHByZWNpemHFo2kpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpbiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTnUgc3VudCDDrm50cmVixINyaSBwZW50cnUgYWNlc3QgY2hlc3Rpb25hclwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlbEgyBtdWzFo3VtaW0gcGVudHJ1IHRpbXB1bCBhY29yZGF0IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNoZXN0aW9uYXJ1bCBzZSDDrm5jYXJjxIMuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQWxlZ2XFo2kuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJSxINzcHVuc3VsIGxhIGFjZWFzdMSDIMOubnRyZWJhcmUgZXN0ZSBvYmxpZ2F0b3JpdS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb2F0ZSByxINzcHVuc3VyaWxlIHN1bnQgb2JsaWdhdG9yaWlcIixcbiAgbnVtZXJpY0Vycm9yOiBcIlLEg3NwdW5zdWwgdHJlYnVpZSBzxIMgZmllIG51bWVyaWMuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1pbmltIHswfSBjYXJhY3RlcmUuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGHIm2kgbWluaW0gezB9IG9wxaNpdW5pLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJUcmVidWllIHPEgyBzZWxlY3RhyJtpIG1heGltIHswfSBvcMWjaXVuaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtYXJlIHNhdSBlZ2FsIGNhIHsxfSDFn8OuIG1haSBtaWMgc2F1IGVnYWwgY3UgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1pYyBzYXUgZWdhbCBjYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcWjaSBvIGFkcmVzYSBkZSBlbWFpbCB2YWxpZMSDLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRpbWVuc2l1bmVhIGZpxZ9pZXJ1bHVpIG51IHRyZWJ1aWUgc8SDIGRlcMSDxZ9lYXNjxIMgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVHJlYnVpZSBzxIMgY29tcGxldGHIm2kgY8OibXB1bCAnQWx0dWwnLlwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiRGluIMOubnJlZ2lzdHLEg3JpbGUgbm9hc3RyZSByZWllc2UgY8SDIGHIm2kgY29tcGxldGF0IGRlamEgYWNlc3QgY2hlc3Rpb25hci5cIixcbiAgdmFsdWU6IFwidmFsb2FyZVwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWxIMgcnVnxINtIHPEgyByxINzcHVuZGXIm2kgbGEgY2VsIHB1yJtpbiBvIMOubnRyZWJhcmUuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1heGltIHswfSBjYXJhY3RlcmUuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWFpIG11bHQgZGUgezB9IMiZaSBtYWkgcHXIm2luIGRlIHsxfSBjYXJhY3RlcmUuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVHJlYnVpZSBzxIMgY29tcGxldGHIm2kgbWluaW0gezB9IHLDom5kdXJpLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUmVxdWVzdC11bCBhIHJldHVybmF0IGVyb2FyZWEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJSZXF1ZXN0LXVsIG51IGEgcmV0dXJuYXQgZGF0ZSBzYXUgcHJvcHJpZXRhdGVhICdwYXRoJyBlc3RlIGluY29yZWN0xINcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZpyJlpZXJ1bCBkdW1uZWF2b2FzdHLEgyBlc3RlIMOubiBjdXJzIGRlIMOubmPEg3JjYXJlLiBWxIMgcnVnxINtIGHImXRlcHRhyJtpIGPDonRldmEgc2VjdW5kZSDImWkgcmV2ZW5pyJtpIGFwb2kuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiU3VudGXIm2kgc2lndXIgY8SDIGRvcmnIm2kgc8SDIMiZdGVyZ2XIm2kgw65ucmVnaXN0cmFyZWE/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/QvtGC0YDQsNGC0LjQu9C4IHswfSDQuNC3IHsxfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICBjbGVhbkNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICBjbGVhckNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQo9C00LDQu9C40YLRjCDRhNCw0LnQu1wiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInJ1XCJdID0gcnVzc2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJydVwiXSA9IFwi0YDRg9GB0YHQutC40LlcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aG1XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpobVcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuWhq+WGmeWFtuS7luetlOahiFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi56ysIHswfSDpobUsIOWFsSB7MX0g6aG1XCIsXG4gIGVtcHR5U3VydmV5OiBcIumXruWNt+S4reayoeaciemXrumimOaIlumhtemdolwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuaEn+iwouaCqOeahOWPguS4jiFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLpl67ljbfmraPlnKjliqDovb3kuK0uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi6K+36YCJ5oupLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi6K+35aGr5YaZ5q2k6Zeu6aKYXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi6K+35aGr5YaZ5omA5pyJ6KGM5Lit6Zeu6aKYXCIsXG4gIG51bWVyaWNFcnJvcjogXCLnrZTmoYjlv4XpobvmmK/kuKrmlbDlrZdcIixcbiAgdGV4dE1pbkxlbmd0aDogXCLnrZTmoYjplb/luqboh7PlsJEgezB9IOS4quWtl+esplwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuetlOahiOmVv+W6puS4jeiDvei2hei/hyB7MH0g5Liq5a2X56ymXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5b+F6aG75ZyoIHswfSAtIHsxfSDkuKrlrZfnrKbkuYvpl7RcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLmnIDlsJHpnIDopoHloavlhpkgezB9IOihjOetlOahiFwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLmnIDlsJHpnIDopoHpgInmi6kgezB9IOmhueetlOahiFwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLmnIDlpJrlj6rog73pgInmi6kgezB9IOmhueetlOahiFwiLFxuICBudW1lcmljTWluTWF4OiBcIuetlOahiCAnezB9JyDlv4XpobvlpKfkuo7nrYnkuo4gezF9IOS4lOWwj+S6juetieS6jiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLnrZTmoYggJ3swfScg5b+F6aG75aSn5LqO562J5LqOIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIuetlOahiCAnezB9JyDlv4XpobvlsI/kuo7nrYnkuo4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLor7fovpPlhaXmnInmlYjnmoQgRW1haWwg5Zyw5Z2AXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLovb3lhaXpgInpobnml7blj5HnlJ/plJnor68gJ3swfSc6IHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi5pyq6IO96L295YWl5pyJ5pWI55qE6YCJ6aG55oiW6K+35rGC5Y+C5pWw6Lev5b6E5pyJ6K+vXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi5paH5Lu25aSn5bCP5LiN6IO96LaF6L+HIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi6K+35a6M5oiQ5YW25LuW6Zeu6aKYXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi5paH5Lu25LiK5Lyg5LitLi4uIOivt+iAkOW/g+etieW+heWHoOenkuWQjumHjeivlVwiLFxuICBhZGRSb3c6IFwi5re75Yqg562U5qGIXCIsXG4gIHJlbW92ZVJvdzogXCLliKDpmaTnrZTmoYhcIixcbiAgY2hvaWNlc19JdGVtOiBcIumAiemhuVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIuWIl1wiLFxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxuICBzYXZpbmdEYXRhOiBcIuato+WcqOWwhue7k+aenOS/neWtmOWIsOacjeWKoeWZqC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi5Zyo5L+d5a2Y57uT5p6c6L+H56iL5Lit5Y+R55Sf5LqG6ZSZ6K+v77yM57uT5p6c5pyq6IO95L+d5a2YXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIue7k+aenOS/neWtmOaIkOWKnyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIuivt+mHjeivlVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInpoLWNuXCJdID0gc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtY25cIl0gPSBcIueugOS9k+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+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6KuL6YeN6KmmXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtdHdcIl0gPSB0cmFkaXRpb25hbENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtdHdcIl0gPSBcIue5gemrlOS4reaWh1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi90cmFkaXRpb25hbC1jaGluZXNlLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0dXJraXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkdlcmlcIixcbiAgcGFnZU5leHRUZXh0OiBcIsSwbGVyaVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQW5rZXRpIFRhbWFtbGFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJEacSfZXIgKGHDp8Sxa2xhecSxbsSxeilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNheWZhIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJBbmtldHRlIGfDtnLDvG50w7xsZW5lY2VrIHNheWZhIHlhIGRhIHNvcnUgbWV2Y3V0IGRlxJ9pbC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJBbmtldGltaXppIHRhbWFtbGFkxLHEn8SxbsSxeiBpw6dpbiB0ZcWfZWtrw7xyIGVkZXJpei5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBbmtldCBzdW51Y3VkYW4gecO8a2xlbml5b3IgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlw6dpbml6IC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkzDvHRmZW4gc29ydXlhIGNldmFwIHZlcmluaXpcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkdpcmlsZW4gZGXEn2VyIG51bWVyaWsgb2xtYWzEsWTEsXJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJFbiBheiB7MH0gc2VtYm9sIGdpcmluaXouXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2F0xLFyxLEgZG9sZHVydW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNlw6dlbmXEn2kgc2XDp2luaXouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzDvHRmZW4gezB9IGFkZXR0ZW4gZmF6bGEgc2XDp21leWluaXouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX0gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgdmV5YSBiw7x5w7xrIG9sbWFsxLFkxLFyXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgZGXEn2VyaSB7MX0gZGXEn2VyaW5lIGXFn2l0IHlhIGRhIGvDvMOnw7xrIG9sbWFsxLFkxLFyLlwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMO8dGZlbiBnZcOnZXJsaSBiaXIgZXBvc3RhIGFkcmVzaSBnaXJpbml6LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFsZWJpIMWfdSBoYXRhecSxIGTDtm5kw7wgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRvc3lhIGJveXV0dSB7MH0gZGXEn2VyaW5pIGdlw6dlbWV6LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBkacSfZXIgZGXEn2VybGVyaSBnaXJpbml6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRG9zeWFuxLF6IHnDvGtsZW5peW9yLiBMw5x0ZmVuIGJpcmthw6cgc2FuaXllIGJla2xleWluIHZlIHRla3JhciBkZW5leWluLlwiLFxuICBhZGRSb3c6IFwiU2F0xLFyIEVrbGVcIixcbiAgcmVtb3ZlUm93OiBcIkthbGTEsXJcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0clwiXSA9IHR1cmtpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1widHJcIl0gPSBcInTDvHJrw6dlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciwgRXhwcmVzc2lvblJ1bm5lciwgT3BlcmFuZCB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIHRyaWdnZXJzLlxuICogQSB0cmlnZ2VyIGNhbGxzIGEgbWV0aG9kIHdoZW4gdGhlIGV4cHJlc3Npb24gY2hhbmdlIHRoZSByZXN1bHQ6IGZyb20gZmFsc2UgdG8gdHJ1ZSBvciBmcm9tIHRydWUgdG8gZmFsc2UuXG4gKiBQbGVhc2Ugbm90ZSwgaXQgcnVucyBvbmx5IG9uZSBjaGFuZ2luZyB0aGUgZXhwcmVzc2lvbiByZXN1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyIGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XG4gIHN0YXRpYyBnZXQgb3BlcmF0b3JzKCkge1xuICAgIGlmIChUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlICE9IG51bGwpIHJldHVybiBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlO1xuICAgIFRyaWdnZXIub3BlcmF0b3JzVmFsdWUgPSB7XG4gICAgICBlbXB0eTogZnVuY3Rpb24odmFsdWU6YW55LCBleHBlY3RlZFZhbHVlOmFueSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlO1xuICAgICAgfSxcbiAgICAgIG5vdGVtcHR5OiBmdW5jdGlvbih2YWx1ZTphbnksIGV4cGVjdGVkVmFsdWU6YW55KSB7XG4gICAgICAgIHJldHVybiAhIXZhbHVlO1xuICAgICAgfSxcbiAgICAgIGVxdWFsOiBmdW5jdGlvbih2YWx1ZTphbnksIGV4cGVjdGVkVmFsdWU6YW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIG5vdGVxdWFsOiBmdW5jdGlvbih2YWx1ZTphbnksIGV4cGVjdGVkVmFsdWU6YW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbih2YWx1ZTphbnksIGV4cGVjdGVkVmFsdWU6YW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZVtcImluZGV4T2ZcIl0gJiYgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA+IC0xO1xuICAgICAgfSxcbiAgICAgIG5vdGNvbnRhaW5zOiBmdW5jdGlvbih2YWx1ZTphbnksIGV4cGVjdGVkVmFsdWU6YW55KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIXZhbHVlIHx8ICF2YWx1ZVtcImluZGV4T2ZcIl0gfHwgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA9PSAtMVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGdyZWF0ZXI6IGZ1bmN0aW9uKHZhbHVlOmFueSwgZXhwZWN0ZWRWYWx1ZTphbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID4gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBsZXNzOiBmdW5jdGlvbih2YWx1ZTphbnksIGV4cGVjdGVkVmFsdWU6YW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcm9yZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOmFueSwgZXhwZWN0ZWRWYWx1ZTphbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID49IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOmFueSwgZXhwZWN0ZWRWYWx1ZTphbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDw9IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIHVzZWROYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVzZWROYW1lcyA9IFtdO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJvcGVyYXRvclwiLCBcInZhbHVlXCIsIFwibmFtZVwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9sZFByb3BlcnRpZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiZXhwcmVzc2lvblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25FeHByZXNzaW9uQ2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidHJpZ2dlcmJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm9wZXJhdG9yXCIsIFwiZXF1YWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIVRyaWdnZXIub3BlcmF0b3JzW3ZhbHVlXSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm9wZXJhdG9yXCIsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgY2hlY2tFeHByZXNzaW9uKFxuICAgIGtleXM6IGFueSxcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNDaGVja1JlcXVpcmVkKGtleXMpKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5jb25kaXRpb25SdW5uZXIpIHtcbiAgICAgIHRoaXMucGVyZm9ybSh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2hlY2sodmFsdWU6IGFueSkge1xuICAgIHZhciB0cmlnZ2VyUmVzdWx0ID0gVHJpZ2dlci5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0odmFsdWUsIHRoaXMudmFsdWUpO1xuICAgIGlmICh0cmlnZ2VyUmVzdWx0KSB7XG4gICAgICB0aGlzLm9uU3VjY2Vzcyh7fSwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcGVyZm9ybSh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHZhciB0cmlnZ2VyUmVzdWx0ID0gdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKHRyaWdnZXJSZXN1bHQpIHtcbiAgICAgIHRoaXMub25TdWNjZXNzKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHt9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5vbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgb2xkUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkV4cHJlc3Npb25DaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBvbkV4cHJlc3Npb25DaGFuZ2VkKCkge1xuICAgIHRoaXMudXNlZE5hbWVzID0gW107XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBudWxsO1xuICB9XG4gIHB1YmxpYyBidWlsZEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMubmFtZSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpICYmIHRoaXMuaXNSZXF1aXJlVmFsdWUpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICBcIntcIiArXG4gICAgICB0aGlzLm5hbWUgK1xuICAgICAgXCJ9IFwiICtcbiAgICAgIHRoaXMub3BlcmF0b3IgK1xuICAgICAgXCIgXCIgK1xuICAgICAgbmV3IE9wZXJhbmQodGhpcy52YWx1ZSkudG9TdHJpbmcoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBpc0NoZWNrUmVxdWlyZWQoa2V5czogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFrZXlzKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idWlsZFVzZWROYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy51c2VkTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChrZXlzLmhhc093blByb3BlcnR5KHRoaXMudXNlZE5hbWVzW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgICAvL2lmIChrZXlzW3RoaXMudXNlZE5hbWVzW2ldXSAhPSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFVzZWROYW1lcygpIHtcbiAgICBpZiAoISF0aGlzLmNvbmRpdGlvblJ1bm5lcikgcmV0dXJuO1xuICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgIGlmICghZXhwcmVzc2lvbikge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuYnVpbGRFeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcihleHByZXNzaW9uKTtcbiAgICB0aGlzLnVzZWROYW1lcyA9IHRoaXMuY29uZGl0aW9uUnVubmVyLmdldFZhcmlhYmxlcygpO1xuICAgIHZhciBwcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnVzZWROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51c2VkTmFtZXNbaV0gPSBwcm9jZXNzVmFsdWUuZ2V0Rmlyc3ROYW1lKHRoaXMudXNlZE5hbWVzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNSZXF1aXJlVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3IgIT09IFwiZW1wdHlcIiAmJiB0aGlzLm9wZXJhdG9yICE9IFwibm90ZW1wdHlcIjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlUcmlnZ2VyT3duZXIge1xuICBnZXRPYmplY3RzKHBhZ2VzOiBzdHJpbmdbXSwgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IGFueVtdO1xuICBkb0NvbXBsZXRlKCk6IGFueTtcbiAgc2V0VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgaXNWYXJpYWJsZTogYm9vbGVhbik6IGFueTtcbiAgY29weVRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIGZyb21OYW1lOiBzdHJpbmcpOiBhbnk7XG59XG5cbi8qKlxuICogSXQgZXh0ZW5kcyB0aGUgVHJpZ2dlciBiYXNlIGNsYXNzIGFuZCBhZGQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU3VydmV5SlMgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyIHtcbiAgcHJvdGVjdGVkIG93bmVyOiBJU3VydmV5VHJpZ2dlck93bmVyID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgc2V0T3duZXIob3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIpIHtcbiAgICB0aGlzLm93bmVyID0gb3duZXI7XG4gIH1cbiAgcHVibGljIGdldCBpc09uTmV4dFBhZ2UoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCBpdCBtYWtlcyBxdWVzdGlvbnMvcGFnZXMgdmlzaWJsZS5cbiAqIE9odGVyd2lzZSBpdCBtYWtlcyB0aGVtIGludmlzaWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJWaXNpYmxlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIHB1YmxpYyBwYWdlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHF1ZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInZpc2libGV0cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMub25UcmlnZ2VyKHRoaXMub25JdGVtU3VjY2Vzcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRmFpbHVyZSgpIHtcbiAgICB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbUZhaWx1cmUpO1xuICB9XG4gIHByaXZhdGUgb25UcmlnZ2VyKGZ1bmM6IEZ1bmN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm47XG4gICAgdmFyIG9iamVjdHMgPSB0aGlzLm93bmVyLmdldE9iamVjdHModGhpcy5wYWdlcywgdGhpcy5xdWVzdGlvbnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgZnVuYyhvYmplY3RzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbVN1Y2Nlc3MoaXRlbTogYW55KSB7XG4gICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25JdGVtRmFpbHVyZShpdGVtOiBhbnkpIHtcbiAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgaXQgY29tcGxldGVzIHRoZSBzdXJ2ZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbXBsZXRldHJpZ2dlclwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5vd25lcikgdGhpcy5vd25lci5kb0NvbXBsZXRlKCk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgcHVibGljIHNldFRvTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc2V0VmFsdWU6IGFueTtcbiAgcHVibGljIGlzVmFyaWFibGU6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzZXR2YWx1ZXRyaWdnZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLnNldFZhbHVlLCB0aGlzLmlzVmFyaWFibGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbiBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgc2V0VG9OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBydW5FeHByZXNzaW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJydW5leHByZXNzaW9udHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMub3duZXIgfHwgIXRoaXMucnVuRXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgZXhwcmVzc2lvbiA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMucnVuRXhwcmVzc2lvbik7XG4gICAgaWYgKGV4cHJlc3Npb24uY2FuUnVuKSB7XG4gICAgICBuZXdWYWx1ZSA9IGV4cHJlc3Npb24ucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zZXRUb05hbWUgfHwgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vd25lci5zZXRUcmlnZ2VyVmFsdWUodGhpcy5zZXRUb05hbWUsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyQ29weVZhbHVlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIHB1YmxpYyBzZXRUb05hbWU6IHN0cmluZztcbiAgcHVibGljIGZyb21OYW1lOiBhbnk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb3B5dmFsdWV0cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5zZXRUb05hbWUgfHwgIXRoaXMub3duZXIpIHJldHVybjtcbiAgICB0aGlzLm93bmVyLmNvcHlUcmlnZ2VyVmFsdWUodGhpcy5zZXRUb05hbWUsIHRoaXMuZnJvbU5hbWUpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJ0cmlnZ2VyXCIsIFtcbiAgeyBuYW1lOiBcIm9wZXJhdG9yXCIsIGRlZmF1bHQ6IFwiZXF1YWxcIiB9LFxuICBcInZhbHVlXCIsXG4gIFwiZXhwcmVzc2lvbjpjb25kaXRpb25cIlxuXSk7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwic3VydmV5dHJpZ2dlclwiLCBbXCJuYW1lXCJdLCBudWxsLCBcInRyaWdnZXJcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInZpc2libGV0cmlnZ2VyXCIsXG4gIFtcInBhZ2VzXCIsIFwicXVlc3Rpb25zXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJWaXNpYmxlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjb21wbGV0ZXRyaWdnZXJcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvbXBsZXRlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJzZXR2YWx1ZXRyaWdnZXJcIixcbiAgW1wiIXNldFRvTmFtZVwiLCBcInNldFZhbHVlXCIsIFwiaXNWYXJpYWJsZTpib29sZWFuXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJTZXRWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjb3B5dmFsdWV0cmlnZ2VyXCIsXG4gIFtcIiFzZXRUb05hbWVcIiwgXCIhZnJvbU5hbWVcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvcHlWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwicnVuRXhwcmVzc2lvbnRyaWdnZXJcIixcbiAgW1wic2V0VG9OYW1lXCIsIFwicnVuRXhwcmVzc2lvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbigpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmlnZ2VyLnRzIiwiLy8gbW9kZWxcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9tb2RlbFwiO1xuXG4vLyBsb2NhbGl6YXRpb25cbmltcG9ydCBcIi4vY2h1bmtzL2xvY2FsaXphdGlvblwiO1xuXG4vLyBoZWxwZXJzXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvaGVscGVyc1wiO1xuXG4vLyBjc3Mgc3RhbmRhcmRcbmV4cG9ydCB7IGRlZmF1bHRTdGFuZGFyZENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vLyBjc3MgYm9vdHN0cmFwXG5leHBvcnQgeyBkZWZhdWx0Qm9vdHN0cmFwQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwXCI7XG4vLyBjc3MgYm9vdHN0cmFwICsgbWF0ZXJpYWxcbmV4cG9ydCB7XG4gIGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzc1xufSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbFwiO1xuLy8gc3R5bGVzXG5pbXBvcnQgXCIuLi9tYWluLnNjc3NcIjtcblxuLy8ga25vY2tvdXRcbmV4cG9ydCB7IFN1cnZleSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3N1cnZleVwiO1xuZXhwb3J0IHsgU3VydmV5IGFzIE1vZGVsIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvc3VydmV5XCI7XG5leHBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi4va25vY2tvdXQva29iYXNlXCI7XG5leHBvcnQgeyBRdWVzdGlvblJvdywgUGFnZSwgUGFuZWwgfSBmcm9tIFwiLi4va25vY2tvdXQva29wYWdlXCI7XG5leHBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25cIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yXG59IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3Jcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25DaGVja2JveCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2NoZWNrYm94XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNvbW1lbnQgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9jb21tZW50XCI7XG5leHBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZHJvcGRvd25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRmlsZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2ZpbGVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSHRtbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2h0bWxcIjtcbmV4cG9ydCB7IE1hdHJpeFJvdywgUXVlc3Rpb25NYXRyaXggfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3IsXG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pY1xufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XG5leHBvcnQgeyBRdWVzdGlvblBhbmVsRHluYW1pYyB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuZXhwb3J0IHtcbiAgTXVsdGlwbGVUZXh0SXRlbSxcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvcixcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5leHBvcnQgeyBRdWVzdGlvblJhZGlvZ3JvdXAgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9yYWRpb2dyb3VwXCI7XG5leHBvcnQgeyBRdWVzdGlvblJhdGluZyB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3JhdGluZ1wiO1xuZXhwb3J0IHsgUXVlc3Rpb25UZXh0IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Cb29sZWFuIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fYm9vbGVhblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FbXB0eSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2VtcHR5XCI7XG5leHBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvbkltYWdlUGlja2VyIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25faW1hZ2VwaWNrZXJcIjtcbmV4cG9ydCB7IFN1cnZleVdpbmRvdyB9IGZyb20gXCIuLi9rbm9ja291dC9rb1N1cnZleVdpbmRvd1wiO1xuZXhwb3J0IHsgU3VydmV5VGVtcGxhdGVUZXh0IH0gZnJvbSBcIi4uL2tub2Nrb3V0L3RlbXBsYXRlVGV4dFwiO1xuXG4vL1VuY29tbWVudCB0byBpbmNsdWRlIHRoZSBcImRhdGVcIiBxdWVzdGlvbiB0eXBlLlxuLy9leHBvcnQge1F1ZXN0aW9uRGF0ZX0gZnJvbSBcIi4uL3BsdWdpbnMva25vY2tvdXQva29xdWVzdGlvbl9kYXRlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9rbm9ja291dC50cyJdLCJzb3VyY2VSb290IjoiIn0=